/* The Kurz Web API exposes these routes: - GET "/<short>" : resolve a short URL - Handler: handleGetShort() - Success: 307 to matching target URL - Client request incorrect: 400 - Short not yet defined: 404 no matching target - Target blocked for permission reasons: 403 - Target legally censored: 451 - Server failure: 50* - POST "/" with <target>: create a short URL from a target URL - Handler: handlePostTarget() - Success: 201 with <new short> - Already existing short: 409 with <existing short> - Target blocked for permission reasons: 403 - Target legally censored: 451 - Server failure: 50* Code 451 MAY be replaced by 403, for example when legal censorship includes a gag order, super-injunction (UK), National security letter (US) or similar mechanisms. */ package api import ( "net/http" "github.com/gorilla/mux" ) // Short is the type of responses provided by the Web API from a target. type Short struct { Short string `json:"short"` } // Target is the type of requests accepted by the Web API for target submissions. type Target struct { Target string `json:"target"` } func ListenAndServe(addr string) error { router := mux.NewRouter() router.HandleFunc("/{short}", handleGetShort). Methods("GET", "HEAD"). Name("kurz.get_short") router.HandleFunc("/", handlePostTarget). HeadersRegexp("Content-Type", "^application/json$"). Methods("POST"). Name("kurd.post_target") http.Handle("/", router) err := http.ListenAndServe(addr, router) return err }