|
|
package main
import ( "bytes" "encoding/json" "errors" "net/http"
"github.com/zenazn/goji/web" )
type shortenerRequest struct { LongURL string `json:"longUrl"` }
type shortenerResponse struct { Kind string `json:"kind"` ID string `json:"id"` LongURL string `json:"longUrl"` Error struct { Code int `json:"code"` Message string `json:"message"` } `json:"error"` }
func shortURLHandler(c web.C, w http.ResponseWriter, r *http.Request) { fileName := c.URLParams["name"]
err := checkFile(fileName) if err == NotFoundErr { notFoundHandler(c, w, r) return }
metadata, err := metadataRead(fileName) if err != nil { oopsHandler(c, w, r, RespJSON, "Corrupt metadata.") return }
if metadata.ShortURL == "" { url, err := shortenURL(getSiteURL(r) + fileName) if err != nil { oopsHandler(c, w, r, RespJSON, err.Error()) return }
metadata.ShortURL = url
err = metadataWrite(fileName, &metadata) if err != nil { oopsHandler(c, w, r, RespJSON, "Corrupt metadata.") return } }
js, _ := json.Marshal(map[string]string{ "shortUrl": metadata.ShortURL, }) w.Write(js) return }
func shortenURL(url string) (string, error) { apiURL := "https://www.googleapis.com/urlshortener/v1/url?key=" + Config.googleShorterAPIKey jsonStr, _ := json.Marshal(shortenerRequest{LongURL: url})
req, err := http.NewRequest("POST", apiURL, bytes.NewBuffer(jsonStr)) req.Header.Set("Content-Type", "application/json")
client := &http.Client{} resp, err := client.Do(req) if err != nil { return "", err } defer resp.Body.Close()
shortenerResponse := new(shortenerResponse) err = json.NewDecoder(resp.Body).Decode(shortenerResponse) if err != nil { return "", err }
if shortenerResponse.Error.Message != "" { return "", errors.New(shortenerResponse.Error.Message) }
return shortenerResponse.ID, nil }
|