@cryptotaxi247 / kubo / commits / 96846358c

http gw: some golinting and unexport unused symbols

- NewDagReader() used the wrong context - Ip?sPathPrefix isn't used anywhere - a little bit of error handling cleanup

Henry committed May 4, 2015 at 13:39 UTC 96846358cc0d1ed383cfa829dd2178ebf2bc4c58
1 file changed +35 -48
core/corehttp/gateway_handler.go
+35 -48
@@ -25,8 +25,8 @@ import (
25 )
26
27 const (
28 - IpfsPathPrefix = "/ipfs/"
29 - IpnsPathPrefix = "/ipns/"
28 + ipfsPathPrefix = "/ipfs/"
29 + ipnsPathPrefix = "/ipns/"
30 )
31
32 // shortcut for templating
@@ -69,25 +69,16 @@ func (i *gatewayHandler) loadTemplate() error {
69 return nil
70 }
71
72 -
73 -// TODO(cryptix): these four helper funcs shoudl also be available elsewhere, i think?
74 -func (i *gatewayHandler) NewDagFromReader(r io.Reader) (*dag.Node, error) {
72 +// TODO(cryptix): find these helpers somewhere else
73 +func (i *gatewayHandler) newDagFromReader(r io.Reader) (*dag.Node, error) {
74 return importer.BuildDagFromReader(
75 r, i.node.DAG, i.node.Pinning.GetManual(), chunk.DefaultSplitter)
76 }
77
79 -func NewDagEmptyDir() *dag.Node {
78 +func newDagEmptyDir() *dag.Node {
79 return &dag.Node{Data: ufs.FolderPBData()}
80 }
81
83 -func (i *gatewayHandler) AddNodeToDAG(nd *dag.Node) (u.Key, error) {
84 - return i.node.DAG.Add(nd)
85 -}
86 -
87 -func (i *gatewayHandler) NewDagReader(nd *dag.Node) (uio.ReadSeekCloser, error) {
88 - return uio.NewDagReader(i.node.Context(), nd, i.node.DAG)
89 -}
90 -
82 // TODO(btc): break this apart into separate handlers using a more expressive muxer
83 func (i *gatewayHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
84 if i.config.Writable {
@@ -117,8 +108,8 @@ func (i *gatewayHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
108 w.WriteHeader(http.StatusBadRequest)
109 errmsg = errmsg + "bad request for " + r.URL.Path
110 }
120 - w.Write([]byte(errmsg))
121 - log.Error(errmsg) // TODO(cryptix): Why are we ignoring handler errors?
111 + fmt.Fprint(w, errmsg)
112 + log.Error(errmsg) // TODO(cryptix): log errors until we have a better way to expose these (counter metrics maybe)
113 }
114
115 func (i *gatewayHandler) getOrHeadHandler(w http.ResponseWriter, r *http.Request) {
@@ -153,7 +144,7 @@ func (i *gatewayHandler) getOrHeadHandler(w http.ResponseWriter, r *http.Request
144 pathRoot := strings.SplitN(urlPath, "/", 4)[2]
145 w.Header().Set("Suborigin", pathRoot)
146
156 - dr, err := i.NewDagReader(nd)
147 + dr, err := uio.NewDagReader(ctx, nd, i.node.DAG)
148 if err != nil && err != uio.ErrIsDir {
149 // not a directory and still an error
150 internalWebError(w, err)
@@ -165,7 +156,7 @@ func (i *gatewayHandler) getOrHeadHandler(w http.ResponseWriter, r *http.Request
156 // and only if it's /ipfs!
157 // TODO: break this out when we split /ipfs /ipns routes.
158 modtime := time.Now()
168 - if strings.HasPrefix(urlPath, IpfsPathPrefix) {
159 + if strings.HasPrefix(urlPath, ipfsPathPrefix) {
160 w.Header().Set("Etag", etag)
161 w.Header().Set("Cache-Control", "public, max-age=29030400")
162
@@ -199,7 +190,7 @@ func (i *gatewayHandler) getOrHeadHandler(w http.ResponseWriter, r *http.Request
190 internalWebError(w, err)
191 return
192 }
202 - dr, err := i.NewDagReader(nd)
193 + dr, err := uio.NewDagReader(ctx, nd, i.node.DAG)
194 if err != nil {
195 internalWebError(w, err)
196 return
@@ -234,13 +225,13 @@ func (i *gatewayHandler) getOrHeadHandler(w http.ResponseWriter, r *http.Request
225 }
226
227 func (i *gatewayHandler) postHandler(w http.ResponseWriter, r *http.Request) {
237 - nd, err := i.NewDagFromReader(r.Body)
228 + nd, err := i.newDagFromReader(r.Body)
229 if err != nil {
230 internalWebError(w, err)
231 return
232 }
233
243 - k, err := i.AddNodeToDAG(nd)
234 + k, err := i.node.DAG.Add(nd)
235 if err != nil {
236 internalWebError(w, err)
237 return
@@ -248,11 +239,11 @@ func (i *gatewayHandler) postHandler(w http.ResponseWriter, r *http.Request) {
239
240 h := mh.Multihash(k).B58String()
241 w.Header().Set("IPFS-Hash", h)
251 - http.Redirect(w, r, IpfsPathPrefix+h, http.StatusCreated)
242 + http.Redirect(w, r, ipfsPathPrefix+h, http.StatusCreated)
243 }
244
245 func (i *gatewayHandler) putEmptyDirHandler(w http.ResponseWriter, r *http.Request) {
255 - newnode := NewDagEmptyDir()
246 + newnode := newDagEmptyDir()
247
248 key, err := i.node.DAG.Add(newnode)
249 if err != nil {
@@ -261,7 +252,7 @@ func (i *gatewayHandler) putEmptyDirHandler(w http.ResponseWriter, r *http.Reque
252 }
253
254 w.Header().Set("IPFS-Hash", key.String())
264 - http.Redirect(w, r, IpfsPathPrefix+key.String()+"/", http.StatusCreated)
255 + http.Redirect(w, r, ipfsPathPrefix+key.String()+"/", http.StatusCreated)
256 }
257
258 func (i *gatewayHandler) putHandler(w http.ResponseWriter, r *http.Request) {
@@ -271,16 +262,16 @@ func (i *gatewayHandler) putHandler(w http.ResponseWriter, r *http.Request) {
262 urlPath := r.URL.Path
263 pathext := urlPath[5:]
264 var err error
274 - if urlPath == IpfsPathPrefix+"QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn/" {
265 + if urlPath == ipfsPathPrefix+"QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn/" {
266 i.putEmptyDirHandler(w, r)
267 return
268 }
269
270 var newnode *dag.Node
271 if pathext[len(pathext)-1] == '/' {
281 - newnode = NewDagEmptyDir()
272 + newnode = newDagEmptyDir()
273 } else {
283 - newnode, err = i.NewDagFromReader(r.Body)
274 + newnode, err = i.newDagFromReader(r.Body)
275 if err != nil {
276 webError(w, "Could not create DAG from request", err, http.StatusInternalServerError)
277 return
@@ -311,9 +302,7 @@ func (i *gatewayHandler) putHandler(w http.ResponseWriter, r *http.Request) {
302
303 if len(components) < 1 {
304 err = fmt.Errorf("Cannot override existing object")
314 - w.WriteHeader(http.StatusBadRequest)
315 - w.Write([]byte(err.Error()))
316 - log.Debug("%s", err)
305 + webError(w, "http gateway", err, http.StatusBadRequest)
306 return
307 }
308
@@ -328,19 +317,19 @@ func (i *gatewayHandler) putHandler(w http.ResponseWriter, r *http.Request) {
317
318 // resolving path components into merkledag nodes. if a component does not
319 // resolve, create empty directories (which will be linked and populated below.)
331 - path_nodes, err := i.node.Resolver.ResolveLinks(tctx, rootnd, components[:len(components)-1])
320 + pathNodes, err := i.node.Resolver.ResolveLinks(tctx, rootnd, components[:len(components)-1])
321 if _, ok := err.(path.ErrNoLink); ok {
322 // Create empty directories, links will be made further down the code
334 - for len(path_nodes) < len(components) {
335 - path_nodes = append(path_nodes, NewDagEmptyDir())
323 + for len(pathNodes) < len(components) {
324 + pathNodes = append(pathNodes, newDagEmptyDir())
325 }
326 } else if err != nil {
327 webError(w, "Could not resolve parent object", err, http.StatusBadRequest)
328 return
329 }
330
342 - for i := len(path_nodes) - 1; i >= 0; i-- {
343 - newnode, err = path_nodes[i].UpdateNodeLink(components[i], newnode)
331 + for i := len(pathNodes) - 1; i >= 0; i-- {
332 + newnode, err = pathNodes[i].UpdateNodeLink(components[i], newnode)
333 if err != nil {
334 webError(w, "Could not update node links", err, http.StatusInternalServerError)
335 return
@@ -361,7 +350,7 @@ func (i *gatewayHandler) putHandler(w http.ResponseWriter, r *http.Request) {
350 }
351
352 w.Header().Set("IPFS-Hash", key.String())
364 - http.Redirect(w, r, IpfsPathPrefix+key.String()+"/"+strings.Join(components, "/"), http.StatusCreated)
353 + http.Redirect(w, r, ipfsPathPrefix+key.String()+"/"+strings.Join(components, "/"), http.StatusCreated)
354 }
355
356 func (i *gatewayHandler) deleteHandler(w http.ResponseWriter, r *http.Request) {
@@ -396,22 +385,22 @@ func (i *gatewayHandler) deleteHandler(w http.ResponseWriter, r *http.Request) {
385 return
386 }
387
399 - path_nodes, err := i.node.Resolver.ResolveLinks(tctx, rootnd, components[:len(components)-1])
388 + pathNodes, err := i.node.Resolver.ResolveLinks(tctx, rootnd, components[:len(components)-1])
389 if err != nil {
390 webError(w, "Could not resolve parent object", err, http.StatusBadRequest)
391 return
392 }
393
405 - // TODO(cyrptix): assumes len(path_nodes) > 1 - not found is an error above?
406 - err = path_nodes[len(path_nodes)-1].RemoveNodeLink(components[len(components)-1])
394 + // TODO(cyrptix): assumes len(pathNodes) > 1 - not found is an error above?
395 + err = pathNodes[len(pathNodes)-1].RemoveNodeLink(components[len(components)-1])
396 if err != nil {
397 webError(w, "Could not delete link", err, http.StatusBadRequest)
398 return
399 }
400
412 - newnode := path_nodes[len(path_nodes)-1]
413 - for i := len(path_nodes) - 2; i >= 0; i-- {
414 - newnode, err = path_nodes[i].UpdateNodeLink(components[i], newnode)
401 + newnode := pathNodes[len(pathNodes)-1]
402 + for i := len(pathNodes) - 2; i >= 0; i-- {
403 + newnode, err = pathNodes[i].UpdateNodeLink(components[i], newnode)
404 if err != nil {
405 webError(w, "Could not update node links", err, http.StatusInternalServerError)
406 return
@@ -432,7 +421,7 @@ func (i *gatewayHandler) deleteHandler(w http.ResponseWriter, r *http.Request) {
421 }
422
423 w.Header().Set("IPFS-Hash", key.String())
435 - http.Redirect(w, r, IpfsPathPrefix+key.String()+"/"+strings.Join(components[:len(components)-1], "/"), http.StatusCreated)
424 + http.Redirect(w, r, ipfsPathPrefix+key.String()+"/"+strings.Join(components[:len(components)-1], "/"), http.StatusCreated)
425 }
426
427 func webError(w http.ResponseWriter, message string, err error, defaultCode int) {
@@ -449,15 +438,13 @@ func webError(w http.ResponseWriter, message string, err error, defaultCode int)
438
439 func webErrorWithCode(w http.ResponseWriter, message string, err error, code int) {
440 w.WriteHeader(code)
452 - log.Debugf("%s: %s", message, err)
453 - w.Write([]byte(message + ": " + err.Error()))
441 + log.Errorf("%s: %s", message, err) // TODO(cryptix): log errors until we have a better way to expose these (counter metrics maybe)
442 + fmt.Fprintf(w, "%s: %s", message, err)
443 }
444
445 // return a 500 error and log
446 func internalWebError(w http.ResponseWriter, err error) {
458 - w.WriteHeader(http.StatusInternalServerError)
459 - w.Write([]byte(err.Error()))
460 - log.Error("%s", err) // TODO(cryptix): Why are we ignoring handler errors?
447 + webErrorWithCode(w, "internalWebError", err, http.StatusInternalServerError)
448 }
449
450 // Directory listing template