After reading the other question, I understand what do you mean. Implement a kind of URL re-writer before URL goes to gorilla/mux. The function will look like:
func Rewriter(h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { //Simple URL rewriter. Rewrite if it's started with API path pathReq := r.RequestURI if strings.HasPrefix(pathReq, "/new/") { //Use url.QueryEscape for pre go1.8 pe := url.PathEscape(strings.TrimLeft(pathReq, "/new/")) r.URL.Path = "/new/" + pe r.URL.RawQuery = "" } h.ServeHTTP(w, r) }) }
Wrap gorilla router when starting the http server:
r := mux.NewRouter() // ... other handler r.HandleFunc("/new/{original-url}", NewHandler) //Wrap mux.Router using Rewriter log.Fatal(http.ListenAndServe(":8080", Rewriter(r)))
Then in your URL shortener handler, the original URL can be extracted using the following code:
func NewHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) ou := vars["original-url"] //Use url.QueryUnascape for pre go1.8 originalURL, err := url.PathUnescape(ou) //... other processing }
IMHO, implementing URL shortener service like this is not recommended, mainly due to incorrect use of HTTP verbs. Any GET request should not leave side effect in server e.g. no record creation in database, etc.
www.myapp.heroku.comthen get an instruction to pass the url in after /new like so:www.myapp.heroku.com/new/https://www.google.com. I don't know how to pass it in a query param unfortunately.