diff --git a/main.go b/main.go index a977eaa..4d3bf4f 100644 --- a/main.go +++ b/main.go @@ -72,6 +72,7 @@ func NewShortLinks(db *sql.DB, domainAliases map[string]string, writableDomains sl.mux.HandleFunc("GET /{short}", sl.serveShort) sl.mux.HandleFunc("POST /{$}", sl.serveSet) sl.mux.HandleFunc("QUERY /{$}", sl.serveSuggest) + sl.mux.HandleFunc("OPTIONS /{$}", sl.serveOptions) return sl, nil } @@ -81,9 +82,9 @@ func (sl *ShortLinks) ServeHTTP(w http.ResponseWriter, r *http.Request) { } func (sl *ShortLinks) serveRoot(w http.ResponseWriter, r *http.Request) { - err := sl.parseForm(r) + err := sl.initRequest(w, r) if err != nil { - sendError(w, http.StatusBadRequest, "parse form: %s", err) + sendError(w, http.StatusBadRequest, "init request: %s", err) return } @@ -108,9 +109,9 @@ func (sl *ShortLinks) serveRoot(w http.ResponseWriter, r *http.Request) { } func (sl *ShortLinks) serveRootWithPath(w http.ResponseWriter, r *http.Request, path string) { - err := sl.parseForm(r) + err := sl.initRequest(w, r) if err != nil { - sendError(w, http.StatusBadRequest, "parse form: %s", err) + sendError(w, http.StatusBadRequest, "init request: %s", err) return } @@ -150,9 +151,9 @@ func (sl *ShortLinks) serveShort(w http.ResponseWriter, r *http.Request) { } func (sl *ShortLinks) serveSet(w http.ResponseWriter, r *http.Request) { - err := sl.parseForm(r) + err := sl.initRequest(w, r) if err != nil { - sendError(w, http.StatusBadRequest, "parse form: %s", err) + sendError(w, http.StatusBadRequest, "init request: %s", err) return } @@ -194,9 +195,9 @@ func (sl *ShortLinks) serveSet(w http.ResponseWriter, r *http.Request) { } func (sl *ShortLinks) serveSuggest(w http.ResponseWriter, r *http.Request) { - err := sl.parseForm(r) + err := sl.initRequest(w, r) if err != nil { - sendError(w, http.StatusBadRequest, "parse form: %s", err) + sendError(w, http.StatusBadRequest, "init request: %s", err) return } @@ -241,7 +242,8 @@ func (sl *ShortLinks) serveHelp(w http.ResponseWriter, r *http.Request) { } err := sl.help.Execute(w, map[string]any{ - "host": r.Host, + "writeHost": r.Host, + "readHost": sl.getDomain(r.Host), }) if err != nil { sendError(w, http.StatusInternalServerError, "error executing template: %s", err) @@ -249,6 +251,16 @@ func (sl *ShortLinks) serveHelp(w http.ResponseWriter, r *http.Request) { } } +func (sl *ShortLinks) serveOptions(w http.ResponseWriter, r *http.Request) { + err := sl.initRequest(w, r) + if err != nil { + sendError(w, http.StatusBadRequest, "init request: %s", err) + return + } + + w.WriteHeader(http.StatusNoContent) +} + func (sl *ShortLinks) genShort(domain string) (string, error) { for chars := 3; chars <= 10; chars++ { b := make([]byte, chars) @@ -295,7 +307,13 @@ func (sl *ShortLinks) getLong(short, domain string) (string, error) { return long, nil } -func (sl *ShortLinks) parseForm(r *http.Request) error { +func (sl *ShortLinks) initRequest(w http.ResponseWriter, r *http.Request) error { + log.Printf("%s %s %s %s %s %#v", r.RemoteAddr, r.Method, r.Host, sl.getDomain(r.Host), r.URL, r.Form) + + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Access-Control-Allow-Methods", "GET, POST, QUERY, OPTIONS") + w.Header().Set("Access-Control-Allow-Headers", "*") + defer r.Body.Close() err := r.ParseForm() @@ -325,15 +343,9 @@ func (sl *ShortLinks) parseForm(r *http.Request) error { } } - sl.logRequest(r) - return nil } -func (sl *ShortLinks) logRequest(r *http.Request) { - log.Printf("%s %s %s %s %s %#v", r.RemoteAddr, r.Method, r.Host, sl.getDomain(r.Host), r.URL, r.Form) -} - func main() { port := os.Getenv("PORT") if port == "" { diff --git a/static/help.html b/static/help.html index 66935e4..7ad5ffe 100644 --- a/static/help.html +++ b/static/help.html @@ -26,6 +26,11 @@ br + sl-tag[pill] { sl-tag::part(base) { user-select: text; } + +a { + color: var(--sl-color-primary-900); + text-decoration: none; +} @@ -41,8 +46,6 @@ sl-tag::part(base) { onload="document.documentElement.classList.add('sl-theme-dark');" /> -
@@ -50,6 +53,7 @@ sl-tag::part(base) { Share Copy Custom + Browser @@ -66,7 +70,7 @@ sl-tag::part(base) { Get contents of - https://{{ .host }}/ + https://{{ .writeHost }}/ @@ -120,7 +124,7 @@ sl-tag::part(base) { Get contents of - https://{{ .host }}/ + https://{{ .writeHost }}/ @@ -181,7 +185,7 @@ sl-tag::part(base) { Combine - https://{{ .host }}/?long= + https://{{ .writeHost }}/?long= URL Encoded Text + with @@ -194,6 +198,47 @@ sl-tag::part(base) { Combined Text + + + + Drag links to bookmark bar: +
+
+ + + {{ .readHost }} (Copy) + +
+
+ + + {{ .readHost }} (Custom) + +
+