59 lines
1.7 KiB
Go

package jshttp
import (
"io"
"net/http"
"net/url"
"strconv"
"strings"
"syscall/js"
"github.com/syumai/workers/internal/jsutil"
)
// ToBody converts JavaScript sides ReadableStream (can be null) to io.ReadCloser.
// - ReadableStream: https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream
func ToBody(streamOrNull js.Value) io.ReadCloser {
if streamOrNull.IsNull() {
return nil
}
return jsutil.ConvertReadableStreamToReadCloser(streamOrNull)
}
// ToRequest converts JavaScript sides Request to *http.Request.
// - Request: https://developer.mozilla.org/docs/Web/API/Request
func ToRequest(req js.Value) (*http.Request, error) {
reqUrl, err := url.Parse(req.Get("url").String())
if err != nil {
return nil, err
}
header := ToHeader(req.Get("headers"))
// ignore err
contentLength, _ := strconv.ParseInt(header.Get("Content-Length"), 10, 64)
return &http.Request{
Method: req.Get("method").String(),
URL: reqUrl,
Header: header,
Body: ToBody(req.Get("body")),
ContentLength: contentLength,
TransferEncoding: strings.Split(header.Get("Transfer-Encoding"), ","),
Host: header.Get("Host"),
}, nil
}
// ToJSRequest converts *http.Request to JavaScript sides Request.
// - Request: https://developer.mozilla.org/docs/Web/API/Request
func ToJSRequest(req *http.Request) js.Value {
jsReqOptions := jsutil.NewObject()
jsReqOptions.Set("method", req.Method)
jsReqOptions.Set("headers", ToJSHeader(req.Header))
jsReqBody := js.Undefined()
if req.Body != nil {
jsReqBody = jsutil.ConvertReaderToReadableStream(req.Body)
}
jsReqOptions.Set("body", jsReqBody)
jsReq := jsutil.RequestClass.New(req.URL.String(), jsReqOptions)
return jsReq
}