cmd/ipfs: Added gateway server to daemon
Matt Bell committed
Dec 10, 2014 at 00:58 UTC
9119435cb68cc8ff37bf8a29cc2b280a4802eb2d
1 file changed
+51
-3
cmd/ipfs/daemon.go
+51
-3
@@ -108,6 +108,13 @@ func daemonFunc(req cmds.Request) (interface{}, error) {
108
return nil, err
109
}
110
111
+ // ignore error for gateway address
112
+ // if there is an error (invalid address), then don't run the gateway
113
+ gatewayMaddr, _ := ma.NewMultiaddr(cfg.Addresses.Gateway)
114
+ if gatewayMaddr == nil {
115
+ fmt.Println("Invalid gateway address, not running gateway")
116
+ }
117
+
118
// mount if the user provided the --mount flag
119
mount, _, err := req.Option(mountKwd).Bool()
120
if err != nil {
@@ -138,11 +145,14 @@ func daemonFunc(req cmds.Request) (interface{}, error) {
145
fmt.Printf("IPNS mounted at: %s\n", nsdir)
146
}
147
148
+ if gatewayMaddr != nil {
149
+ listenAndServeGateway(node, gatewayMaddr)
150
+ }
151
+
152
return nil, listenAndServeAPI(node, req, apiMaddr)
153
}
154
155
func listenAndServeAPI(node *core.IpfsNode, req cmds.Request, addr ma.Multiaddr) error {
145
-
156
_, host, err := manet.DialArgs(addr)
157
if err != nil {
158
return err
@@ -163,7 +173,7 @@ func listenAndServeAPI(node *core.IpfsNode, req cmds.Request, addr ma.Multiaddr)
173
serverExited := make(chan struct{})
174
175
go func() {
166
- fmt.Printf("daemon listening on %s\n", addr)
176
+ fmt.Printf("API server listening on %s\n", addr)
177
serverError = server.ListenAndServe(host, mux)
178
close(serverExited)
179
}()
@@ -176,9 +186,47 @@ func listenAndServeAPI(node *core.IpfsNode, req cmds.Request, addr ma.Multiaddr)
186
case <-node.Closing():
187
log.Infof("daemon at %s terminating...", addr)
188
server.Shutdown <- true
179
- <-serverExited // now, DO wait until server exits
189
+ <-serverExited // now, DO wait until server exit
190
}
191
192
log.Infof("daemon at %s terminated", addr)
193
return serverError
194
}
195
+
196
+func listenAndServeGateway(node *core.IpfsNode, addr ma.Multiaddr) error {
197
+ _, host, err := manet.DialArgs(addr)
198
+ if err != nil {
199
+ return err
200
+ }
201
+
202
+ server := manners.NewServer()
203
+ mux := http.NewServeMux()
204
+ ifpsHandler := &ipfsHandler{node}
205
+ mux.Handle("/ipfs/", ifpsHandler)
206
+
207
+ done := make(chan struct{}, 1)
208
+ defer func() {
209
+ done <- struct{}{}
210
+ }()
211
+
212
+ // go wait until the node dies
213
+ go func() {
214
+ select {
215
+ case <-node.Closed():
216
+ case <-done:
217
+ return
218
+ }
219
+
220
+ log.Infof("terminating gateway at %s...", addr)
221
+ server.Shutdown <- true
222
+ }()
223
+
224
+ fmt.Printf("Gateway listening on %s\n", addr)
225
+ go func() {
226
+ if err := server.ListenAndServe(host, mux); err != nil {
227
+ log.Error(err)
228
+ }
229
+ }()
230
+
231
+ return nil
232
+}