// Lookup returns rectangles for the given address. Currently the only // implementation is the Google geocoding service. func Lookup(ctx *context.Context, address string) ([]Rect, error) { mu.RLock() rects, ok := cache[address] mu.RUnlock() if ok { return rects, nil } rectsi, err := sf.Do(address, func() (interface{}, error) { // TODO: static data files from OpenStreetMap, Wikipedia, etc? urlStr := "https://maps.googleapis.com/maps/api/geocode/json?address=" + url.QueryEscape(address) + "&sensor=false" res, err := ctx.HTTPClient().Get(urlStr) if err != nil { return nil, err } defer httputil.CloseBody(res.Body) rects, err := decodeGoogleResponse(res.Body) log.Printf("Google geocode lookup (%q) = %#v, %v", address, rects, err) if err == nil { mu.Lock() cache[address] = rects mu.Unlock() } return rects, err }) if err != nil { return nil, err } return rectsi.([]Rect), nil }
func (im *imp) doGet(ctx *context.Context, url string, form url.Values) (*http.Response, error) { creds := im.creds() if creds == nil { return nil, errors.New("No OAuth credentials. Not logged in?") } res, err := oauthClient.Get(ctx.HTTPClient(), creds, url, form) if err != nil { return nil, fmt.Errorf("Error fetching %s: %v", url, err) } if res.StatusCode != http.StatusOK { return nil, fmt.Errorf("Get request on %s failed with: %s", url, res.Status) } return res, nil }
func doGet(ctx *context.Context, url string) ([]byte, error) { req, err := http.NewRequest("GET", url, nil) if err != nil { return nil, err } res, err := ctx.HTTPClient().Do(req) if err != nil { log.Printf("Error fetching %s: %v", url, err) return nil, err } defer httputil.CloseBody(res.Body) if res.StatusCode != http.StatusOK { return nil, fmt.Errorf("Get request on %s failed with: %s", url, res.Status) } return ioutil.ReadAll(io.LimitReader(res.Body, 8<<20)) }
func doGet(ctx *context.Context, url string, form url.Values) (*http.Response, error) { requestURL := url + "?" + form.Encode() req, err := http.NewRequest("GET", requestURL, nil) if err != nil { return nil, err } res, err := ctx.HTTPClient().Do(req) if err != nil { log.Printf("Error fetching %s: %v", url, err) return nil, err } if res.StatusCode != http.StatusOK { return nil, fmt.Errorf("Get request on %s failed with: %s", requestURL, res.Status) } return res, nil }