mirror of
https://github.com/nlepage/go-wasm-http-server.git
synced 2025-03-10 17:29:10 +00:00
feat: uses ReadableStream for request (#16)
This commit is contained in:
parent
3220c94fa5
commit
b7e5adfd23
Binary file not shown.
Binary file not shown.
Binary file not shown.
85
internal/readablestream/reader.go
Normal file
85
internal/readablestream/reader.go
Normal file
@ -0,0 +1,85 @@
|
||||
package readablestream
|
||||
|
||||
import (
|
||||
"io"
|
||||
|
||||
promise "github.com/nlepage/go-js-promise"
|
||||
|
||||
"github.com/nlepage/go-wasm-http-server/internal/safejs"
|
||||
)
|
||||
|
||||
type Reader struct {
|
||||
value safejs.Value
|
||||
buf []byte
|
||||
off int
|
||||
}
|
||||
|
||||
var _ io.Reader = (*Reader)(nil)
|
||||
|
||||
func NewReader(r safejs.Value) *Reader {
|
||||
return &Reader{
|
||||
value: r,
|
||||
}
|
||||
}
|
||||
|
||||
func (r *Reader) Read(p []byte) (int, error) {
|
||||
if r.off < len(r.buf) {
|
||||
n := copy(p, r.buf[r.off:])
|
||||
|
||||
r.off += n
|
||||
|
||||
return n, nil
|
||||
}
|
||||
|
||||
r.off = 0
|
||||
|
||||
pRes, err := r.value.Call("read")
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
ures, err := promise.Await(safejs.Unsafe(pRes))
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
res := safejs.Safe(ures)
|
||||
|
||||
done, err := res.GetBool("done")
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
if done {
|
||||
return 0, io.EOF
|
||||
}
|
||||
|
||||
value, err := res.Get("value")
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
l, err := value.GetInt("length")
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
if cap(r.buf) < l {
|
||||
r.buf = make([]byte, l)
|
||||
}
|
||||
if len(r.buf) < cap(r.buf) {
|
||||
r.buf = r.buf[:cap(r.buf)]
|
||||
}
|
||||
|
||||
n, err := safejs.CopyBytesToGo(r.buf, value)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
r.buf = r.buf[:n]
|
||||
|
||||
n = copy(p, r.buf[r.off:])
|
||||
|
||||
r.off += n
|
||||
|
||||
return n, nil
|
||||
}
|
36
request.go
36
request.go
@ -1,49 +1,34 @@
|
||||
package wasmhttp
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"syscall/js"
|
||||
|
||||
promise "github.com/nlepage/go-js-promise"
|
||||
|
||||
"github.com/nlepage/go-wasm-http-server/internal/jstype"
|
||||
"github.com/nlepage/go-wasm-http-server/internal/readablestream"
|
||||
"github.com/nlepage/go-wasm-http-server/internal/safejs"
|
||||
)
|
||||
|
||||
// Request builds and returns the equivalent http.Request
|
||||
func Request(ur js.Value) (*http.Request, error) {
|
||||
r := safejs.Safe(ur)
|
||||
func Request(uvalue js.Value) (*http.Request, error) {
|
||||
value := safejs.Safe(uvalue)
|
||||
|
||||
ab, err := r.Call("arrayBuffer")
|
||||
body, err := value.Get("body")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
u8a, err := jstype.Uint8Array.New(promise.Await(safejs.Unsafe(ab)))
|
||||
r, err := body.Call("getReader")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
l, err := u8a.GetInt("length")
|
||||
method, err := value.GetString("method")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
b := make([]byte, l)
|
||||
|
||||
_, err = safejs.CopyBytesToGo(b, u8a)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
method, err := r.GetString("method")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
url, err := r.GetString("url")
|
||||
url, err := value.GetString("url")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -51,15 +36,18 @@ func Request(ur js.Value) (*http.Request, error) {
|
||||
req := httptest.NewRequest(
|
||||
method,
|
||||
url,
|
||||
bytes.NewReader(b),
|
||||
readablestream.NewReader(r),
|
||||
)
|
||||
|
||||
headers, err := r.Get("headers")
|
||||
headers, err := value.Get("headers")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
headersIt, err := headers.Call("entries")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for {
|
||||
e, err := headersIt.Call("next")
|
||||
if err != nil {
|
||||
|
Loading…
x
Reference in New Issue
Block a user