Merge lp:~chipaca/snapweb/json-responses into lp:~snappy-dev/snapweb/trunk

Proposed by John Lenton on 2015-05-05
Status: Merged
Approved by: John Lenton on 2015-05-06
Approved revision: 117
Merged at revision: 117
Proposed branch: lp:~chipaca/snapweb/json-responses
Merge into: lp:~snappy-dev/snapweb/trunk
Diff against target: 198 lines (+46/-25)
4 files modified
README.md (+7/-6)
snappy/converge.go (+3/-0)
snappy/handlers.go (+36/-18)
webprogress/meter.go (+0/-1)
To merge this branch: bzr merge lp:~chipaca/snapweb/json-responses
Reviewer Review Type Date Requested Status
Sergio Schvezov 2015-05-05 Approve on 2015-05-06
Stephen Stewart 2015-05-05 Pending
Review via email: mp+258324@code.launchpad.net

Commit Message

Make all responses application/json.

Description of the Change

Stephen, asking for a review from you mostly because AIUI this'll break some things on your end (although the tests pass).

To post a comment you must log in.
Sergio Schvezov (sergiusens) wrote :

the json responses was something we were supposed to do anyways (to not break the ui fw), so kudos for that!

One comment and one question

review: Approve
John Lenton (chipaca) :
lp:~chipaca/snapweb/json-responses updated on 2015-05-06
114. By John Lenton on 2015-05-06

removed commented-out line

115. By John Lenton on 2015-05-06

report errors out

116. By John Lenton on 2015-05-06

merged trunk

review: Approve
lp:~chipaca/snapweb/json-responses updated on 2015-05-06
117. By John Lenton on 2015-05-06

Merged vendor-and-description into json-responses.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'README.md'
2--- README.md 2015-04-29 15:01:08 +0000
3+++ README.md 2015-05-06 15:03:42 +0000
4@@ -9,15 +9,16 @@
5
6 Install global npm modules without sudo:
7
8- cat > ~/.npmrc << EOF
9- root = $HOME/node/lib/node_modules
10- prefix = $HOME/node
11- binroot = $HOME/node/bin
12- manroot = $HOME/node/man
13- EOF
14+ cat > ~/.npmrc <<-EOF
15+ root = $HOME/node/lib/node_modules
16+ prefix = $HOME/node
17+ binroot = $HOME/node/bin
18+ manroot = $HOME/node/man
19+ EOF
20
21 Setup the environment:
22
23+ mkdir ~/node
24 export PATH=$PATH:$HOME/node/bin
25 export NODE_PATH=$HOME/node/lib/node_modules
26
27
28=== modified file 'snappy/converge.go'
29--- snappy/converge.go 2015-05-06 12:49:52 +0000
30+++ snappy/converge.go 2015-05-06 15:03:42 +0000
31@@ -37,6 +37,7 @@
32 Icon string `json:"icon"`
33 Status string `json:"status"`
34 Message string `json:"message,omitempty"`
35+ IsError bool `json:"-"`
36 Progress float64 `json:"progress,omitempty"`
37 InstalledSize int64 `json:"installed_size,omitempty"`
38 DownloadSize int64 `json:"download_size,omitempty"`
39@@ -113,6 +114,7 @@
40 func (h *Handler) doInstallPackage(progress *webprogress.WebProgress, pkgName string) {
41 _, err := snappy.Install(pkgName, 0, progress)
42 progress.ErrorChan <- err
43+ close(progress.ErrorChan)
44 }
45
46 func (h *Handler) installPackage(pkgName string) error {
47@@ -202,6 +204,7 @@
48
49 if stat.Error != nil {
50 snap.Message = stat.Error.Error()
51+ snap.IsError = true
52 }
53
54 } else {
55
56=== modified file 'snappy/handlers.go'
57--- snappy/handlers.go 2015-05-03 20:35:34 +0000
58+++ snappy/handlers.go 2015-05-06 15:03:42 +0000
59@@ -21,10 +21,9 @@
60 "encoding/json"
61 "fmt"
62 "io"
63+ "log"
64 "net/http"
65
66- "log"
67-
68 "launchpad.net/snappy/snappy"
69 "launchpad.net/webdm/webprogress"
70
71@@ -44,80 +43,99 @@
72 }
73
74 func (h *Handler) getAll(w http.ResponseWriter, r *http.Request) {
75+ w.Header().Set("Content-Type", "application/json")
76+ enc := json.NewEncoder(w)
77 dec := json.NewDecoder(r.Body)
78
79 var filter listFilter
80 if err := dec.Decode(&filter); err != nil && err != io.EOF {
81 w.WriteHeader(http.StatusInternalServerError)
82- fmt.Fprint(w, fmt.Sprintf("Error: %s", err))
83+ enc.Encode(fmt.Sprintf("Error: %s", err))
84 return
85 }
86
87 payload, err := h.allPackages(filter.InstalledOnly)
88 if err != nil {
89 w.WriteHeader(http.StatusInternalServerError)
90- fmt.Fprint(w, fmt.Sprintf("Error: %s", err))
91+ enc.Encode(fmt.Sprintf("Error: %s", err))
92 return
93 }
94
95- enc := json.NewEncoder(w)
96 if err := enc.Encode(payload); err != nil {
97 w.WriteHeader(http.StatusInternalServerError)
98- fmt.Fprint(w, fmt.Sprintf("Error: %s", err))
99- return
100+ // give up on json
101+ fmt.Fprintf(w, "Error: %s", err)
102+ log.Print(err)
103 }
104 }
105
106 func (h *Handler) get(w http.ResponseWriter, r *http.Request) {
107+ w.Header().Set("Content-Type", "application/json")
108 // Get the Key.
109 vars := mux.Vars(r)
110 pkgName := vars["pkg"]
111+ enc := json.NewEncoder(w)
112
113 payload, err := h.packagePayload(pkgName)
114 if err != nil {
115- http.NotFound(w, r)
116- fmt.Fprintln(w, err, pkgName)
117+ w.WriteHeader(http.StatusNotFound)
118+ enc.Encode(fmt.Sprintln(err, pkgName))
119 return
120 }
121
122- enc := json.NewEncoder(w)
123+ if payload.IsError {
124+ w.WriteHeader(http.StatusInternalServerError)
125+ }
126+
127 if err := enc.Encode(payload); err != nil {
128- fmt.Fprint(w, "Error")
129+ w.WriteHeader(http.StatusInternalServerError)
130+ // give up on json
131+ fmt.Fprintf(w, "Error: %s", err)
132+ log.Print(err)
133 }
134 }
135
136 func (h *Handler) add(w http.ResponseWriter, r *http.Request) {
137+ w.Header().Set("Content-Type", "application/json")
138 // Get the Key.
139 vars := mux.Vars(r)
140 pkgName := vars["pkg"]
141
142- enc := json.NewEncoder(w)
143 var msg string
144+ var status int
145
146 err := h.installPackage(pkgName)
147
148 switch err {
149 case snappy.ErrAlreadyInstalled:
150- w.WriteHeader(http.StatusOK)
151+ status = http.StatusOK
152 msg = "Installed"
153 case webprogress.ErrPackageInstallInProgress:
154- w.WriteHeader(http.StatusBadRequest)
155+ status = http.StatusBadRequest
156 msg = "Installation in progress"
157 case snappy.ErrPackageNotFound:
158- w.WriteHeader(http.StatusNotFound)
159+ status = http.StatusNotFound
160 msg = "Package not found"
161 case nil:
162- w.WriteHeader(http.StatusAccepted)
163+ status = http.StatusAccepted
164 msg = "Accepted"
165 default:
166- w.WriteHeader(http.StatusInternalServerError)
167+ status = http.StatusInternalServerError
168 msg = "Processing error"
169 }
170
171 response := response{Message: msg, Package: pkgName}
172- if err := enc.Encode(response); err != nil {
173+ bs, err := json.Marshal(response)
174+ if err != nil {
175+ // giving up on json
176+ w.WriteHeader(http.StatusInternalServerError)
177+ fmt.Fprintf(w, "Error: %s", err)
178 log.Print(err)
179+ return
180 }
181+
182+ w.WriteHeader(status)
183+ w.Write(bs)
184 }
185
186 // MakeMuxer sets up the handlers multiplexing to handle requests against snappy's
187
188=== modified file 'webprogress/meter.go'
189--- webprogress/meter.go 2015-05-03 20:46:10 +0000
190+++ webprogress/meter.go 2015-05-06 15:03:42 +0000
191@@ -48,7 +48,6 @@
192 }
193
194 go func() {
195- defer close(t.ErrorChan)
196 err := <-t.ErrorChan
197
198 if err != nil {

Subscribers

People subscribed via source and target branches

to all changes: