mirror of
https://github.com/ipfs/kubo.git
synced 2025-06-30 09:59:13 +08:00
cmd/ipfs: Added HTTP RPC client to entry point
This commit is contained in:

committed by
Juan Batiz-Benet

parent
26495b799d
commit
c89826c1ef
@ -1,10 +1,13 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
"runtime/pprof"
|
||||
"strings"
|
||||
|
||||
cmds "github.com/jbenet/go-ipfs/commands"
|
||||
"github.com/jbenet/go-ipfs/commands/cli"
|
||||
@ -24,13 +27,19 @@ func main() {
|
||||
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())
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
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) {
|
||||
u.Debug = true
|
||||
@ -48,7 +57,7 @@ func main() {
|
||||
}
|
||||
}
|
||||
|
||||
res := commands.Root.Call(req)
|
||||
//res := commands.Root.Call(req)
|
||||
|
||||
if res.Error() != nil {
|
||||
fmt.Println(res.Error().Error())
|
||||
@ -66,3 +75,61 @@ func main() {
|
||||
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
|
||||
}
|
||||
|
Reference in New Issue
Block a user