// Copyright © 2016 Alan A. A. Donovan & Brian W. Kernighan. // License: https://creativecommons.org/licenses/by-nc-sa/4.0/ //!+ package github import ( "encoding/json" "fmt" "net/http" "net/url" "strings" ) // SearchIssues queries the GitHub issue tracker. func SearchIssues(terms []string) (*IssuesSearchResult, error) { q := url.QueryEscape(strings.Join(terms, " ")) resp, err := http.Get(IssuesURL + "?q=" + q) if err != nil { return nil, err } //!- // For long-term stability, instead of http.Get, use the // variant below which adds an HTTP request header indicating // that only version 3 of the GitHub API is acceptable. // // req, err := http.NewRequest("GET", IssuesURL+"?q="+q, nil) // if err != nil { // return nil, err // } // req.Header.Set( // "Accept", "application/vnd.github.v3.text-match+json") // resp, err := http.DefaultClient.Do(req) //!+ // We must close resp.Body on all execution paths. // (Chapter 5 presents 'defer', which makes this simpler.) if resp.StatusCode != http.StatusOK { resp.Body.Close() return nil, fmt.Errorf("search query failed: %s", resp.Status) } var result IssuesSearchResult if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { resp.Body.Close() return nil, err } resp.Body.Close() return &result, nil } //!-