2021-01-24 18:03:17 +01:00
|
|
|
package wasmhttp
|
2019-11-27 00:04:00 +01:00
|
|
|
|
|
|
|
import (
|
2024-10-14 23:28:21 +02:00
|
|
|
"io"
|
2019-11-27 00:04:00 +01:00
|
|
|
"net/http"
|
2024-12-14 10:12:55 +00:00
|
|
|
"net/url"
|
2019-11-27 00:04:00 +01:00
|
|
|
"syscall/js"
|
2021-08-16 23:40:53 +02:00
|
|
|
|
2024-10-17 01:11:41 +02:00
|
|
|
promise "github.com/nlepage/go-js-promise"
|
2024-10-14 22:24:46 +02:00
|
|
|
"github.com/nlepage/go-wasm-http-server/v2/internal/readablestream"
|
|
|
|
"github.com/nlepage/go-wasm-http-server/v2/internal/safejs"
|
2019-11-27 00:04:00 +01:00
|
|
|
)
|
|
|
|
|
2021-01-24 18:03:17 +01:00
|
|
|
// Request builds and returns the equivalent http.Request
|
2024-10-14 22:23:22 +02:00
|
|
|
func Request(uvalue js.Value) (*http.Request, error) {
|
|
|
|
value := safejs.Safe(uvalue)
|
2024-10-14 09:14:50 +02:00
|
|
|
|
2024-10-14 23:28:21 +02:00
|
|
|
method, err := value.GetString("method")
|
2024-10-14 09:14:50 +02:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2024-12-14 10:12:55 +00:00
|
|
|
rawURL, err := value.GetString("url")
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
u, err := url.Parse(rawURL)
|
2024-10-14 09:14:50 +02:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2024-10-14 23:28:21 +02:00
|
|
|
body, err := value.Get("body")
|
2024-10-14 09:14:50 +02:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2024-10-14 23:28:21 +02:00
|
|
|
var bodyReader io.Reader
|
2024-10-17 01:11:41 +02:00
|
|
|
|
|
|
|
if !body.IsNull() {
|
|
|
|
// WORKAROUND: Firefox does not have request.body ReadableStream
|
|
|
|
if body.IsUndefined() {
|
|
|
|
blobp, err := value.Call("blob")
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
blob, err := promise.Await(safejs.Unsafe(blobp))
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
body, err = safejs.Safe(blob).Call("stream")
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-10-14 23:28:21 +02:00
|
|
|
r, err := body.Call("getReader")
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
bodyReader = readablestream.NewReader(r)
|
2024-10-14 09:14:50 +02:00
|
|
|
}
|
2019-11-27 00:04:00 +01:00
|
|
|
|
2024-12-14 10:12:55 +00:00
|
|
|
req := &http.Request{
|
|
|
|
Method: method,
|
|
|
|
URL: u,
|
|
|
|
Body: io.NopCloser(bodyReader),
|
|
|
|
Header: make(http.Header),
|
|
|
|
}
|
2019-11-27 00:04:00 +01:00
|
|
|
|
2024-10-14 22:23:22 +02:00
|
|
|
headers, err := value.Get("headers")
|
2024-10-14 09:14:50 +02:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
headersIt, err := headers.Call("entries")
|
2024-10-14 22:23:22 +02:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2019-11-27 00:19:46 +01:00
|
|
|
for {
|
2024-10-14 09:14:50 +02:00
|
|
|
e, err := headersIt.Call("next")
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
done, err := e.GetBool("done")
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if done {
|
2019-11-27 00:19:46 +01:00
|
|
|
break
|
|
|
|
}
|
2024-10-14 09:14:50 +02:00
|
|
|
|
|
|
|
v, err := e.Get("value")
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
key, err := v.IndexString(0)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
value, err := v.IndexString(1)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
req.Header.Set(key, value)
|
2019-11-27 00:19:46 +01:00
|
|
|
}
|
|
|
|
|
2024-10-14 09:14:50 +02:00
|
|
|
return req, nil
|
2019-11-27 00:04:00 +01:00
|
|
|
}
|