Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(45)

Side by Side Diff: client/internal/common/json.go

Issue 1135173003: Create packages client/internal/ retry and lhttp. (Closed) Base URL: git@github.com:luci/luci-go@3_UI
Patch Set: Create lhttp.Retriable interface Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « client/cmd/swarming/common.go ('k') | client/internal/common/utils.go » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package common 5 package common
6 6
7 import ( 7 import (
8 "bytes"
9 "encoding/json" 8 "encoding/json"
10 "fmt" 9 "fmt"
11 "net/http"
12 "os" 10 "os"
13 "strings"
14 ) 11 )
15 12
16 const jsonContentType = "application/json; charset=utf-8"
17
18 // GetJSON does a simple HTTP GET on a JSON endpoint.
19 //
20 // Returns the status code and the error, if any.
21 func GetJSON(c *http.Client, url string, out interface{}) (int, error) {
22 if c == nil {
23 c = http.DefaultClient
24 }
25 resp, err := c.Get(url)
26 if err != nil {
27 return 0, fmt.Errorf("couldn't resolve %s: %s", url, err)
28 }
29 return decodeJSONResponse(resp, url, out)
30 }
31
32 // PostJSON does a HTTP POST on a JSON endpoint.
33 //
34 // Returns the status code and the error, if any.
35 func PostJSON(c *http.Client, url string, in, out interface{}) (int, error) {
36 if c == nil {
37 c = http.DefaultClient
38 }
39 if in == nil {
40 in = map[string]string{}
41 }
42 encoded, err := json.Marshal(in)
43 if err != nil {
44 return 0, nil
45 }
46 resp, err := c.Post(url, jsonContentType, bytes.NewBuffer(encoded))
47 if err != nil {
48 return 0, fmt.Errorf("couldn't resolve %s: %s", url, err)
49 }
50 return decodeJSONResponse(resp, url, out)
51 }
52
53 func decodeJSONResponse(resp *http.Response, url string, out interface{}) (int, error) {
54 defer resp.Body.Close()
55 if out == nil {
56 // The client doesn't care about the response. Still ensure the response is
57 // valid json.
58 out = &map[string]interface{}{}
59 }
60 if err := json.NewDecoder(resp.Body).Decode(out); err != nil {
61 return resp.StatusCode, fmt.Errorf("bad response %s: %s", url, e rr)
62 }
63 ct := strings.ToLower(resp.Header.Get("Content-Type"))
64 if ct != jsonContentType {
65 return resp.StatusCode, fmt.Errorf("unexpected Content-Type, exp ected \"%s\", got \"%s\"", jsonContentType, ct)
66 }
67 if resp.StatusCode >= 400 {
68 return resp.StatusCode, fmt.Errorf("http status %d", resp.Status Code)
69 }
70 return resp.StatusCode, nil
71 }
72
73 // ReadJSONFile reads a file and decode it as JSON. 13 // ReadJSONFile reads a file and decode it as JSON.
74 func ReadJSONFile(filePath string, object interface{}) error { 14 func ReadJSONFile(filePath string, object interface{}) error {
75 f, err := os.Open(filePath) 15 f, err := os.Open(filePath)
76 if err != nil { 16 if err != nil {
77 return fmt.Errorf("failed to open %s: %s", filePath, err) 17 return fmt.Errorf("failed to open %s: %s", filePath, err)
78 } 18 }
79 defer f.Close() 19 defer f.Close()
80 if err = json.NewDecoder(f).Decode(object); err != nil { 20 if err = json.NewDecoder(f).Decode(object); err != nil {
81 return fmt.Errorf("failed to decode %s: %s", filePath, err) 21 return fmt.Errorf("failed to decode %s: %s", filePath, err)
82 } 22 }
(...skipping 11 matching lines...) Expand all
94 f, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600) 34 f, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600)
95 if err != nil { 35 if err != nil {
96 return fmt.Errorf("failed to open %s: %s", filePath, err) 36 return fmt.Errorf("failed to open %s: %s", filePath, err)
97 } 37 }
98 defer f.Close() 38 defer f.Close()
99 if _, err := f.Write(d); err != nil { 39 if _, err := f.Write(d); err != nil {
100 return fmt.Errorf("failed to write %s: %s", filePath, err) 40 return fmt.Errorf("failed to write %s: %s", filePath, err)
101 } 41 }
102 return nil 42 return nil
103 } 43 }
OLDNEW
« no previous file with comments | « client/cmd/swarming/common.go ('k') | client/internal/common/utils.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698