http gw: removed ResolvePath() in favour of core.Resolve()
Henry committed
May 3, 2015 at 05:04 UTC
1502f6bc71ba8fa48fcc4d1959f405f038d04d9a
1 file changed
+39
-63
core/corehttp/gateway_handler.go
+39
-63
@@ -69,39 +69,8 @@ func (i *gatewayHandler) loadTemplate() error {
69
return nil
70
}
71
72
-func (i *gatewayHandler) resolveNamePath(ctx context.Context, p string) (string, error) {
73
- p = gopath.Clean(p)
74
-
75
- if strings.HasPrefix(p, IpnsPathPrefix) {
76
- elements := strings.Split(p[len(IpnsPathPrefix):], "/")
77
- hash := elements[0]
78
- rp, err := i.node.Namesys.Resolve(ctx, hash)
79
- if err != nil {
80
- return "", err
81
- }
82
-
83
- elements = append(rp.Segments(), elements[1:]...)
84
- p = gopath.Join(elements...)
85
- }
86
- if !strings.HasPrefix(p, IpfsPathPrefix) {
87
- p = gopath.Join(IpfsPathPrefix, p)
88
- }
89
- return p, nil
90
-}
91
-
92
-func (i *gatewayHandler) ResolvePath(ctx context.Context, p string) (*dag.Node, string, error) {
93
- p, err := i.resolveNamePath(ctx, p)
94
- if err != nil {
95
- return nil, "", err
96
- }
97
-
98
- node, err := i.node.Resolver.ResolvePath(ctx, path.Path(p))
99
- if err != nil {
100
- return nil, "", err
101
- }
102
- return node, p, err
103
-}
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) {
75
return importer.BuildDagFromReader(
76
r, i.node.DAG, i.node.Pinning.GetManual(), chunk.DefaultSplitter)
@@ -119,30 +88,23 @@ func (i *gatewayHandler) NewDagReader(nd *dag.Node) (uio.ReadSeekCloser, error)
88
return uio.NewDagReader(i.node.Context(), nd, i.node.DAG)
89
}
90
122
-// TODO(btc): break this apart into separate handlers using a more expressive
123
-// muxer
91
+// TODO(btc): break this apart into separate handlers using a more expressive muxer
92
func (i *gatewayHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
125
- if i.config.Writable && r.Method == "POST" {
126
- i.postHandler(w, r)
127
- return
128
- }
129
-
130
- if i.config.Writable && r.Method == "PUT" {
131
- i.putHandler(w, r)
132
- return
133
- }
134
-
135
- if i.config.Writable && r.Method == "DELETE" {
136
- i.deleteHandler(w, r)
137
- return
138
- }
139
-
140
- if r.Method == "GET" {
141
- i.getOrHeadHandler(w, r)
142
- return
93
+ if i.config.Writable {
94
+ switch r.Method {
95
+ case "POST":
96
+ i.postHandler(w, r)
97
+ return
98
+ case "PUT":
99
+ i.putHandler(w, r)
100
+ return
101
+ case "DELETE":
102
+ i.deleteHandler(w, r)
103
+ return
104
+ }
105
}
106
145
- if r.Method == "HEAD" {
107
+ if r.Method == "GET" || r.Method == "HEAD" {
108
i.getOrHeadHandler(w, r)
109
return
110
}
@@ -156,7 +118,7 @@ func (i *gatewayHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
118
errmsg = errmsg + "bad request for " + r.URL.Path
119
}
120
w.Write([]byte(errmsg))
159
- log.Debug(errmsg)
121
+ log.Error(errmsg) // TODO(cryptix): Why are we ignoring handler errors?
122
}
123
124
func (i *gatewayHandler) getOrHeadHandler(w http.ResponseWriter, r *http.Request) {
@@ -171,19 +133,19 @@ func (i *gatewayHandler) getOrHeadHandler(w http.ResponseWriter, r *http.Request
133
return
134
}
135
174
- nd, p, err := i.ResolvePath(ctx, urlPath)
136
+ nd, err := core.Resolve(ctx, i.node, path.Path(urlPath))
137
if err != nil {
138
webError(w, "Path Resolve error", err, http.StatusBadRequest)
139
return
140
}
141
180
- etag := gopath.Base(p)
142
+ etag := gopath.Base(urlPath)
143
if r.Header.Get("If-None-Match") == etag {
144
w.WriteHeader(http.StatusNotModified)
145
return
146
}
147
186
- w.Header().Set("X-IPFS-Path", p)
148
+ w.Header().Set("X-IPFS-Path", urlPath)
149
150
// Suborigin header, sandboxes apps from each other in the browser (even
151
// though they are served from the same gateway domain). NOTE: This is not
@@ -232,7 +194,7 @@ func (i *gatewayHandler) getOrHeadHandler(w http.ResponseWriter, r *http.Request
194
log.Debug("found index")
195
foundIndex = true
196
// return index page instead.
235
- nd, _, err := i.ResolvePath(ctx, urlPath+"/index.html")
197
+ nd, err := core.Resolve(ctx, i.node, path.Path(urlPath+"/index.html"))
198
if err != nil {
199
internalWebError(w, err)
200
return
@@ -328,14 +290,20 @@ func (i *gatewayHandler) putHandler(w http.ResponseWriter, r *http.Request) {
290
ctx, cancel := context.WithCancel(i.node.Context())
291
defer cancel()
292
331
- ipfspath, err := i.resolveNamePath(ctx, urlPath)
293
+ ipfsNode, err := core.Resolve(ctx, i.node, path.Path(urlPath))
294
if err != nil {
295
// FIXME HTTP error code
296
webError(w, "Could not resolve name", err, http.StatusInternalServerError)
297
return
298
}
299
338
- h, components, err := path.SplitAbsPath(path.Path(ipfspath))
300
+ k, err := ipfsNode.Key()
301
+ if err != nil {
302
+ webError(w, "Could not get key from resolved node", err, http.StatusInternalServerError)
303
+ return
304
+ }
305
+
306
+ h, components, err := path.SplitAbsPath(path.FromKey(k))
307
if err != nil {
308
webError(w, "Could not split path", err, http.StatusInternalServerError)
309
return
@@ -351,6 +319,7 @@ func (i *gatewayHandler) putHandler(w http.ResponseWriter, r *http.Request) {
319
320
tctx, cancel := context.WithTimeout(ctx, time.Minute)
321
defer cancel()
322
+ // TODO(cryptix): could this be core.Resolve() too?
323
rootnd, err := i.node.Resolver.DAG.Get(tctx, u.Key(h))
324
if err != nil {
325
webError(w, "Could not resolve root object", err, http.StatusBadRequest)
@@ -400,14 +369,20 @@ func (i *gatewayHandler) deleteHandler(w http.ResponseWriter, r *http.Request) {
369
ctx, cancel := context.WithCancel(i.node.Context())
370
defer cancel()
371
403
- ipfspath, err := i.resolveNamePath(ctx, urlPath)
372
+ ipfsNode, err := core.Resolve(ctx, i.node, path.Path(urlPath))
373
if err != nil {
374
// FIXME HTTP error code
375
webError(w, "Could not resolve name", err, http.StatusInternalServerError)
376
return
377
}
378
410
- h, components, err := path.SplitAbsPath(path.Path(ipfspath))
379
+ k, err := ipfsNode.Key()
380
+ if err != nil {
381
+ webError(w, "Could not get key from resolved node", err, http.StatusInternalServerError)
382
+ return
383
+ }
384
+
385
+ h, components, err := path.SplitAbsPath(path.FromKey(k))
386
if err != nil {
387
webError(w, "Could not split path", err, http.StatusInternalServerError)
388
return
@@ -427,6 +402,7 @@ func (i *gatewayHandler) deleteHandler(w http.ResponseWriter, r *http.Request) {
402
return
403
}
404
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])
407
if err != nil {
408
webError(w, "Could not delete link", err, http.StatusBadRequest)
@@ -481,7 +457,7 @@ func webErrorWithCode(w http.ResponseWriter, message string, err error, code int
457
func internalWebError(w http.ResponseWriter, err error) {
458
w.WriteHeader(http.StatusInternalServerError)
459
w.Write([]byte(err.Error()))
484
- log.Debug("%s", err)
460
+ log.Error("%s", err) // TODO(cryptix): Why are we ignoring handler errors?
461
}
462
463
// Directory listing template