Skip to content
57 changes: 9 additions & 48 deletions code/go/0chain.net/blobbercore/convert/convert.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (
"encoding/json"
"mime/multipart"
"net/http"
"strings"
"time"

"github.com/0chain/blobber/code/go/0chain.net/blobbercore/readmarker"
Expand Down Expand Up @@ -483,57 +482,19 @@ func WriteFileGRPCToHTTP(req *blobbergrpc.UploadFileRequest) (*http.Request, err
}

func DownloadFileGRPCToHTTP(req *blobbergrpc.DownloadFileRequest) (*http.Request, error) {
body := bytes.NewBuffer([]byte{})
writer := multipart.NewWriter(body)

err := writer.WriteField("path", req.Path)
r, err := http.NewRequest("GET", "", nil)
if err != nil {
return nil, err
}

err = writer.WriteField("path_hash", req.PathHash)
if err != nil {
return nil, err
}

err = writer.WriteField("rx_pay", req.RxPay)
if err != nil {
return nil, err
}

err = writer.WriteField("block_num", req.BlockNum)
if err != nil {
return nil, err
}

err = writer.WriteField("num_blocks", req.NumBlocks)
if err != nil {
return nil, err
}

err = writer.WriteField("read_marker", req.ReadMarker)
if err != nil {
return nil, err
}

err = writer.WriteField("auth_token", req.AuthToken)
if err != nil {
return nil, err
}

err = writer.WriteField("content", req.Content)
if err != nil {
return nil, err
}

writer.Close()

r, err := http.NewRequest("POST", "", strings.NewReader(body.String()))
if err != nil {
return nil, err
}

r.Header.Set("Content-Type", writer.FormDataContentType())

r.Header.Set("X-Path", req.Path)
r.Header.Set("X-Path-Hash", req.PathHash)
r.Header.Set("X-Rxpay", req.RxPay)
r.Header.Set("X-Block-Num", req.BlockNum)
r.Header.Set("X-Num-Blocks", req.NumBlocks)
r.Header.Set("X-Read-Marker", req.ReadMarker)
r.Header.Set("X-Auth-Token", req.AuthToken)
r.Header.Set("X-Mode", req.Content)
return r, nil
}
10 changes: 1 addition & 9 deletions code/go/0chain.net/blobbercore/handler/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,15 +71,7 @@ func WithHandler(handler func(ctx *Context) (interface{}, error)) func(w http.Re
return
}

if r.Method == http.MethodPost || r.Method == http.MethodPut || r.Method == http.MethodPatch {
ct := r.Header.Get("Content-Type")
if ct == "application/x-www-form-urlencoded" {
r.ParseForm() //nolint: errcheck
} else {
r.ParseMultipartForm(FormFileParseMaxMemory) //nolint: errcheck
}

}
TryParseForm(r)

w.Header().Set("Access-Control-Allow-Origin", "*") // CORS for all.
w.Header().Set("Content-Type", "application/json")
Expand Down
113 changes: 113 additions & 0 deletions code/go/0chain.net/blobbercore/handler/download_request_header.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
package handler

import (
"encoding/json"
"net/http"
"strconv"

"github.com/0chain/blobber/code/go/0chain.net/blobbercore/readmarker"
"github.com/0chain/blobber/code/go/0chain.net/blobbercore/reference"
"github.com/0chain/blobber/code/go/0chain.net/core/common"
"github.com/0chain/errors"
)

// DownloadRequestHeader metedata of download request
type DownloadRequestHeader struct {
req *http.Request
allocationID string
PathHash string
Path string
BlockNum int64
NumBlocks int64
ReadMarker readmarker.ReadMarker
AuthToken string
RxPay bool
DownloadMode string
}

func FromDownloadRequest(allocationID string, req *http.Request) (*DownloadRequestHeader, error) {
if allocationID == "" {
return nil, errors.Throw(common.ErrInvalidParameter, "allocationID")
}

if req == nil {
return nil, errors.Throw(common.ErrInvalidParameter, "req")
}

dr := &DownloadRequestHeader{
allocationID: allocationID,
req: req,
}

err := dr.Parse()
if err != nil {
return nil, err
}

return dr, nil
}

func (dr *DownloadRequestHeader) Parse() error {
if dr.req == nil {
return errors.Throw(common.ErrInvalidParameter, "req")
}

pathHash := dr.Get("X-Path-Hash")
path := dr.Get("X-Path")
if pathHash == "" {
if path == "" {
return errors.Throw(common.ErrInvalidParameter, "X-Path")
}
pathHash = reference.GetReferenceLookup(dr.allocationID, path)
}

dr.PathHash = pathHash
dr.Path = path

blockNum := dr.GetInt64("X-Block-Num", -1)
if blockNum <= 0 {
return errors.Throw(common.ErrInvalidParameter, "X-Block-Num")
}
dr.BlockNum = blockNum

numBlocks := dr.GetInt64("X-Num-Blocks", 1)
if numBlocks <= 0 {
return errors.Throw(common.ErrInvalidParameter, "X-Num-Blocks")
}
dr.NumBlocks = numBlocks

readMarker := dr.Get("X-Read-Marker")

if readMarker == "" {
return errors.Throw(common.ErrInvalidParameter, "X-Read-Marker")
}

err := json.Unmarshal([]byte(readMarker), &dr.ReadMarker)
if err != nil {
return errors.Throw(common.ErrInvalidParameter, "X-Read-Marker")
}

dr.AuthToken = dr.Get("X-Auth-Token")

dr.RxPay = dr.Get("X-Rxpay") == "true"
dr.DownloadMode = dr.Get("X-Mode")

return nil
}

func (dr *DownloadRequestHeader) Get(key string) string {
if dr.req == nil {
return ""
}
return dr.req.Header.Get(key)
}

func (dr *DownloadRequestHeader) GetInt64(key string, defaultValue int64) int64 {
v := dr.Get(key)
i, err := strconv.ParseInt(v, 10, 64)
if err != nil {
return defaultValue
}

return i
}
Loading