1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- /*
- The Kurz Web API exposes HTTP routes for JSON clients, route names to access them, and types for the requests and responses.
- - 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.
- These routes are exposed by running SetupRoutes(listenAddress), which is enough to
- configure the Kurz domain API. Be sure to also configure the domain SPI to have
- a complete application.
- */
- package api
- import (
- "github.com/gorilla/mux"
- "github.com/nicksnyder/go-i18n/v2/i18n"
- "net/http"
- "net/url"
- )
- // 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"`
- }
- // Route names.
- const (
- RouteGetShort = "kurz.api.get_short"
- RoutePostTarget = "kurz.api.post_target"
- )
- // Content types.
- const (
- // JsonType is the MIME JSON type.
- JsonType = "application/json"
- JsonTypeHeader = JsonType + "; charset=utf-8"
- // JsonTypeRegex is a regex matching the MIME JSON type anywhere
- JsonTypeRegex = JsonType
- )
- // SetupRoutes() configures Web API routes on the passed mux.Router.
- func SetupRoutes(router *mux.Router) {
- // BUG(fgm): improve Accept header matchers once https://github.com/golang/go/issues/19307 is completed.
- router.HandleFunc("/{short}", handleGetShort).
- HeadersRegexp("Accept", JsonTypeRegex).
- Methods("GET", "HEAD").
- Name(RouteGetShort)
- router.HandleFunc("/", handlePostTarget).
- HeadersRegexp("Accept", JsonTypeRegex).
- Headers("Content-Type", JsonType).
- Methods("POST").
- Name(RoutePostTarget)
- }
- func URLFromRoute(name string, args map[string]string) url.URL {
- return url.URL{}
- }
- // getLocalizer is a helper method to return the localizer in a request context, or nil if none is found.
- func getLocalizer(r *http.Request) *i18n.Localizer {
- iLocalizer := r.Context().Value("localizer")
- var localizer *i18n.Localizer
- if iLocalizer != nil {
- localizer = iLocalizer.(*i18n.Localizer)
- } else {
- localizer = nil
- }
- return localizer
- }
|