init: main and templates
This commit is contained in:
commit
484ecd1cc3
96
main.go
Normal file
96
main.go
Normal file
@ -0,0 +1,96 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
"time"
|
||||
)
|
||||
|
||||
const (
|
||||
DEFAULT_HTTP_PORT = "8080"
|
||||
DEFAULT_HTTPS_PORT = "4433"
|
||||
)
|
||||
|
||||
type apiMessageResponse struct {
|
||||
Message string
|
||||
}
|
||||
|
||||
type Logger struct {
|
||||
Handler http.Handler
|
||||
}
|
||||
|
||||
func (l *Logger) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
tNow := time.Now().UTC()
|
||||
l.Handler.ServeHTTP(w, r)
|
||||
methodString := l.getMethodLogString(r.Method)
|
||||
log.Printf(" %s %s %s %v", r.RemoteAddr, methodString, r.URL, time.Since(tNow))
|
||||
}
|
||||
|
||||
func (l *Logger) getMethodLogString(method string) string {
|
||||
colorBlue := "\033[34m"
|
||||
colorReset := "\033[0m"
|
||||
// colorRed := "\033[31m"
|
||||
// colorGreen := "\033[32m"
|
||||
// colorYellow := "\033[33m"
|
||||
// colorPurple := "\033[35m"
|
||||
// colorCyan := "\033[36m"
|
||||
// colorWhite := "\033[37m"
|
||||
if method == "GET" { return colorBlue + "GET" + colorReset }
|
||||
return method
|
||||
}
|
||||
|
||||
func NewLogger(handler http.Handler) *Logger {
|
||||
return &Logger{Handler: handler}
|
||||
}
|
||||
|
||||
func writeJSONResponse(w http.ResponseWriter, s string) http.ResponseWriter {
|
||||
w.WriteHeader(http.StatusBadRequest)
|
||||
jsonResp, err := json.Marshal(apiMessageResponse{Message: s})
|
||||
if err != nil {
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
return w
|
||||
}
|
||||
_, err = w.Write(jsonResp)
|
||||
if err != nil {
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
return w
|
||||
}
|
||||
|
||||
return w
|
||||
|
||||
}
|
||||
|
||||
func main() {
|
||||
|
||||
handler := http.NewServeMux()
|
||||
|
||||
handler.HandleFunc(
|
||||
"/download",
|
||||
func(w http.ResponseWriter, r *http.Request) {
|
||||
userURL := r.URL.Query().Get("url")
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
if userURL == "" {
|
||||
w = writeJSONResponse(w, "Provide URL as query")
|
||||
return
|
||||
}
|
||||
w = writeJSONResponse(w, fmt.Sprintf("You sent %s ", userURL))},
|
||||
)
|
||||
|
||||
wrappedHandler := NewLogger(handler)
|
||||
srv := http.Server{
|
||||
ReadTimeout: 3 * time.Second,
|
||||
WriteTimeout: 10 * time.Second,
|
||||
Addr: ":" + DEFAULT_HTTP_PORT,
|
||||
Handler: wrappedHandler,
|
||||
}
|
||||
|
||||
log.Printf("Starting HTTP on %s", DEFAULT_HTTP_PORT)
|
||||
log.Fatalln(srv.ListenAndServe())
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
92
templates/index-pico.html
Normal file
92
templates/index-pico.html
Normal file
@ -0,0 +1,92 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>Sign in example • Pico.css</title>
|
||||
<meta name="description" content="A minimalist layout for Login pages. Built with Pico CSS." />
|
||||
<link rel="shortcut icon" href="https://picocss.com/favicon.ico" />
|
||||
<link rel="canonical" href="https://picocss.com/examples/sign-in/" />
|
||||
|
||||
<!-- Pico.css -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@1/css/pico.min.css" />
|
||||
|
||||
<!-- Custom styles for this example -->
|
||||
<link rel="stylesheet" href="custom.css" />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- Nav -->
|
||||
<nav class="container-fluid">
|
||||
<ul>
|
||||
<li>
|
||||
<a href="./" class="contrast" onclick="event.preventDefault()"><strong>Brand</strong></a>
|
||||
</li>
|
||||
</ul>
|
||||
<ul>
|
||||
<li>
|
||||
<details role="list" dir="rtl">
|
||||
<summary aria-haspopup="listbox" role="link" class="secondary">Theme</summary>
|
||||
<ul role="listbox">
|
||||
<li><a href="#" data-theme-switcher="auto">Auto</a></li>
|
||||
<li><a href="#" data-theme-switcher="light">Light</a></li>
|
||||
<li><a href="#" data-theme-switcher="dark">Dark</a></li>
|
||||
</ul>
|
||||
</details>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
<!-- ./ Nav -->
|
||||
|
||||
<!-- Main -->
|
||||
<main class="container">
|
||||
<article class="grid">
|
||||
<div>
|
||||
<hgroup>
|
||||
<h1>Sign in</h1>
|
||||
<h2>A minimalist layout for Login pages</h2>
|
||||
</hgroup>
|
||||
<form>
|
||||
<input
|
||||
type="text"
|
||||
name="login"
|
||||
placeholder="Login"
|
||||
aria-label="Login"
|
||||
autocomplete="nickname"
|
||||
required
|
||||
/>
|
||||
<input
|
||||
type="password"
|
||||
name="password"
|
||||
placeholder="Password"
|
||||
aria-label="Password"
|
||||
autocomplete="current-password"
|
||||
required
|
||||
/>
|
||||
<fieldset>
|
||||
<label for="remember">
|
||||
<input type="checkbox" role="switch" id="remember" name="remember" />
|
||||
Remember me
|
||||
</label>
|
||||
</fieldset>
|
||||
<button type="submit" class="contrast" onclick="event.preventDefault()">Login</button>
|
||||
</form>
|
||||
</div>
|
||||
<div></div>
|
||||
</article>
|
||||
</main>
|
||||
<!-- ./ Main -->
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="container-fluid">
|
||||
<small>
|
||||
yt-mdl
|
||||
</small>
|
||||
</footer>
|
||||
<!-- ./ Footer -->
|
||||
|
||||
<!-- Minimal theme switcher -->
|
||||
<script src="js/minimal-theme-switcher.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
72
templates/index-tail.html
Normal file
72
templates/index-tail.html
Normal file
@ -0,0 +1,72 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
<script src="https://unpkg.com/htmx.org@1.9.5"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!--
|
||||
This example requires some changes to your config:
|
||||
|
||||
```
|
||||
// tailwind.config.js
|
||||
module.exports = {
|
||||
// ...
|
||||
plugins: [
|
||||
// ...
|
||||
require('@tailwindcss/forms'),
|
||||
],
|
||||
}
|
||||
```
|
||||
-->
|
||||
<!--
|
||||
This example requires updating your template:
|
||||
|
||||
```
|
||||
<html class="h-full bg-white">
|
||||
<body class="h-full">
|
||||
```
|
||||
-->
|
||||
<div class="flex min-h-full flex-col justify-center px-6 py-12 lg:px-8">
|
||||
<div class="sm:mx-auto sm:w-full sm:max-w-sm">
|
||||
<img class="mx-auto h-10 w-auto" src="https://tailwindui.com/img/logos/mark.svg?color=indigo&shade=600" alt="Your Company">
|
||||
<h2 class="mt-10 text-center text-2xl font-bold leading-9 tracking-tight text-gray-900">Sign in to your account</h2>
|
||||
</div>
|
||||
|
||||
<div class="mt-10 sm:mx-auto sm:w-full sm:max-w-sm">
|
||||
<form class="space-y-6" action="#" method="POST">
|
||||
<div>
|
||||
<label for="email" class="block text-sm font-medium leading-6 text-gray-900">Email address</label>
|
||||
<div class="mt-2">
|
||||
<input id="email" name="email" type="email" autocomplete="email" required class="block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class="flex items-center justify-between">
|
||||
<label for="password" class="block text-sm font-medium leading-6 text-gray-900">Password</label>
|
||||
<div class="text-sm">
|
||||
<a href="#" class="font-semibold text-indigo-600 hover:text-indigo-500">Forgot password?</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
<input id="password" name="password" type="password" autocomplete="current-password" required class="block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<button type="submit" class="flex w-full justify-center rounded-md bg-indigo-600 px-3 py-1.5 text-sm font-semibold leading-6 text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600">Sign in</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<p class="mt-10 text-center text-sm text-gray-500">
|
||||
Not a member?
|
||||
<a href="#" class="font-semibold leading-6 text-indigo-600 hover:text-indigo-500">Start a 14 day free trial</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
19
templates/index.html
Normal file
19
templates/index.html
Normal file
@ -0,0 +1,19 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" href="css/pico.min.css">
|
||||
<title>Hello, world!</title>
|
||||
</head>
|
||||
<body>
|
||||
<main class="container">
|
||||
<h1>Download Videos</h1>
|
||||
<div>
|
||||
<label for="user-url">URL</label>
|
||||
<input type="url" id="user-url" name="user-url" required>
|
||||
</div>
|
||||
<button>Start Download</button>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user