package schema import ( "context" "encoding/json" "fmt" "io/ioutil" "net/http" "strings" ) func IXURL(id int64) string { return fmt.Sprintf("https://peeringdb.com/api/ix/%d.json?depth=4", id) } func NetIXLanInIXURL(id int64) string { return fmt.Sprintf("https://peeringdb.com/api/netixlan?ix_id__in=%d", id) } func NetURLMulti(ids []int64) string { sid := make([]string, len(ids)) for i, id := range ids { sid[i] = fmt.Sprintf("%d", id) } return fmt.Sprintf("https://peeringdb.com/api/net?id__in=%s", strings.Join(sid, ",")) } func Get(ctx context.Context, obj interface{}, url string) error { req, err := http.NewRequest("GET", url, nil) if err != nil { return fmt.Errorf("http.NewRequest(GET, %q): %v", url, err) } req.Header.Add("User-Agent", "bgpwtf-cccampix-peeringdbproxy/1.0 (https://code.hackerspace.pl/hscloud/bgpwtf/cccampix/peeringdb)") req = req.WithContext(ctx) client := http.DefaultClient res, err := client.Do(req) if err != nil { return fmt.Errorf("client.Do(%v): %v", req, err) } defer res.Body.Close() if res.StatusCode != 200 { return fmt.Errorf("got status code %d", res.StatusCode) } data, err := ioutil.ReadAll(res.Body) if err != nil { return fmt.Errorf("could not read response: %v", err) } err = json.Unmarshal(data, &obj) if err != nil { return fmt.Errorf("could not parse response JSON: %v", err) } return nil }