Commit c89826c1 authored by Matt Bell's avatar Matt Bell Committed by Juan Batiz-Benet

cmd/ipfs: Added HTTP RPC client to entry point

parent 26495b79
package main package main
import ( import (
"encoding/json"
"fmt" "fmt"
"io" "io"
"net/http"
"os" "os"
"runtime/pprof" "runtime/pprof"
"strings"
cmds "github.com/jbenet/go-ipfs/commands" cmds "github.com/jbenet/go-ipfs/commands"
"github.com/jbenet/go-ipfs/commands/cli" "github.com/jbenet/go-ipfs/commands/cli"
...@@ -24,13 +27,19 @@ func main() { ...@@ -24,13 +27,19 @@ func main() {
os.Exit(1) os.Exit(1)
} }
// TODO: call command locally if option tells us to, or if command is CLI-only (e.g. ipfs init)
cmd, err := commands.Root.Get(req.Path()) cmd, err := commands.Root.Get(req.Path())
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
os.Exit(1) os.Exit(1)
} }
// TODO: send request to daemon via HTTP API res, err := sendRequest(req)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
if debug, ok := req.Option("debug"); ok && debug.(bool) { if debug, ok := req.Option("debug"); ok && debug.(bool) {
u.Debug = true u.Debug = true
...@@ -48,7 +57,7 @@ func main() { ...@@ -48,7 +57,7 @@ func main() {
} }
} }
res := commands.Root.Call(req) //res := commands.Root.Call(req)
if res.Error() != nil { if res.Error() != nil {
fmt.Println(res.Error().Error()) fmt.Println(res.Error().Error())
...@@ -66,3 +75,61 @@ func main() { ...@@ -66,3 +75,61 @@ func main() {
fmt.Println(err.Error()) fmt.Println(err.Error())
} }
} }
func sendRequest(req cmds.Request) (cmds.Response, error) {
// TODO: load RPC host from config
url := "http://localhost:8080" + API_PATH
url += "/" + strings.Join(req.Path(), "/")
// TODO: support other encodings once we have multicodec to decode response
// (we shouldn't have to set this here)
encoding := cmds.JSON
req.SetOption(cmds.EncShort, encoding)
query := "?"
options := req.Options()
for k, v := range options {
query += "&" + k + "=" + v.(string)
}
httpRes, err := http.Post(url+query, "application/octet-stream", req.Stream())
if err != nil {
return nil, err
}
res := cmds.NewResponse(req)
contentType := httpRes.Header["Content-Type"][0]
contentType = strings.Split(contentType, ";")[0]
if contentType == "application/octet-stream" {
res.SetValue(httpRes.Body)
return res, nil
}
// TODO: decode based on `encoding`, using multicodec
dec := json.NewDecoder(httpRes.Body)
if httpRes.StatusCode >= http.StatusBadRequest {
e := cmds.Error{}
err = dec.Decode(&e)
if err != nil {
fmt.Println(err)
return nil, err
}
res.SetError(e, e.Code)
} else {
var v interface{}
err = dec.Decode(&v)
if err != nil {
fmt.Println(err)
return nil, err
}
res.SetValue(v)
}
return res, nil
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment