mirror of
https://github.com/ipfs/kubo.git
synced 2025-07-02 03:28:25 +08:00
commands/http: Moved HTTP RPC into commands/http package
This commit is contained in:

committed by
Juan Batiz-Benet

parent
a65c99e71e
commit
8b61daa1db
70
commands/http/client.go
Normal file
70
commands/http/client.go
Normal file
@ -0,0 +1,70 @@
|
||||
package http
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
cmds "github.com/jbenet/go-ipfs/commands"
|
||||
)
|
||||
|
||||
const ApiPath = "/api/v0"
|
||||
|
||||
func Send(req cmds.Request) (cmds.Response, error) {
|
||||
// TODO: load RPC host from config
|
||||
url := "http://localhost:8080" + ApiPath
|
||||
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