This commit is contained in:
Nicolas Lepage 2021-01-24 21:18:18 +01:00
parent 37bf64f9dc
commit 32e6c6349c
No known key found for this signature in database
GPG Key ID: B0879E35E66D8F6F
8 changed files with 54 additions and 69 deletions

View File

@ -17,6 +17,7 @@ func main() {
panic(err)
}
res.Header().Add("Content-Type", "application/json")
if err := json.NewEncoder(res).Encode(map[string]string{
"message": fmt.Sprintf("Hello %s! (request n°%d)", params["name"], no),
}); err != nil {

Binary file not shown.

View File

@ -15,6 +15,7 @@ func main() {
panic(err)
}
res.Header().Add("Content-Type", "application/json")
if err := json.NewEncoder(res).Encode(map[string]string{
"message": fmt.Sprintf("Hello %s!", params["name"]),
}); err != nil {

Binary file not shown.

View File

@ -3,6 +3,7 @@ package wasmhttp
import (
"bytes"
"net/http"
"net/http/httptest"
"syscall/js"
)
@ -12,14 +13,11 @@ func Request(r js.Value) (*http.Request, error) {
body := make([]byte, jsBody.Get("length").Int())
js.CopyBytesToGo(body, jsBody)
req, err := http.NewRequest(
req := httptest.NewRequest(
r.Get("method").String(),
r.Get("url").String(),
bytes.NewBuffer(body),
)
if err != nil {
return nil, err
}
headersIt := r.Get("headers").Call("entries")
for {

49
response_recorder.go Normal file
View File

@ -0,0 +1,49 @@
package wasmhttp
import (
"io/ioutil"
"net/http/httptest"
"syscall/js"
)
// ResponseRecorder extends httptest.ResponseRecorder and implements js.Wrapper
type ResponseRecorder struct {
*httptest.ResponseRecorder
}
// NewResponseRecorder returns a new ResponseRecorder
func NewResponseRecorder() ResponseRecorder {
return ResponseRecorder{httptest.NewRecorder()}
}
var _ js.Wrapper = ResponseRecorder{}
// JSValue builds and returns the equivalent JS Response (implementing js.Wrapper)
func (rr ResponseRecorder) JSValue() js.Value {
var res = rr.Result()
var init = make(map[string]interface{})
if res.StatusCode != 0 {
init["status"] = res.StatusCode
}
if len(res.Header) != 0 {
var headers = make(map[string]interface{}, len(res.Header))
for k := range res.Header {
headers[k] = res.Header.Get(k)
}
init["headers"] = headers
}
var body js.Value = js.Undefined()
if res.ContentLength != 0 {
body = js.Global().Get("Uint8Array").New(res.ContentLength)
var b, err = ioutil.ReadAll(res.Body)
if err != nil {
panic(err)
}
js.CopyBytesToJS(body, b)
}
return js.Global().Get("Response").New(body, init)
}

View File

@ -1,64 +0,0 @@
package wasmhttp
import (
"bytes"
"net/http"
"syscall/js"
)
// ResponseWriter implements http.ResponseWriter
type ResponseWriter struct {
header http.Header
buf *bytes.Buffer
statusCode int
}
// NewResponseWriter creates a new ResponseWriter
func NewResponseWriter() ResponseWriter {
return ResponseWriter{
header: http.Header{},
buf: bytes.NewBuffer(nil),
statusCode: 0,
}
}
var _ http.ResponseWriter = ResponseWriter{}
// Header implements http.ResponseWriter.Header
func (rw ResponseWriter) Header() http.Header {
return rw.header
}
// Write implements http.ResponseWriter.Write
func (rw ResponseWriter) Write(p []byte) (int, error) {
return rw.buf.Write(p)
}
// WriteHeader implements http.ResponseWriter.WriteHeader
func (rw ResponseWriter) WriteHeader(statusCode int) {
rw.statusCode = statusCode
}
var _ js.Wrapper = ResponseWriter{}
// JSValue builds and returns the equivalent JS Response (implementing js.Wrapper)
func (rw ResponseWriter) JSValue() js.Value {
init := js.Global().Get("Object").New()
if rw.statusCode != 0 {
init.Set("status", rw.statusCode)
}
if len(rw.header) != 0 {
headers := make(map[string]interface{}, len(rw.header))
for k := range rw.header {
headers[k] = rw.header.Get(k)
}
init.Set("headers", headers)
}
jsBody := js.Global().Get("Uint8Array").New(rw.buf.Len())
js.CopyBytesToJS(jsBody, rw.buf.Bytes())
return js.Global().Get("Response").New(jsBody, init)
}

View File

@ -43,7 +43,7 @@ func Serve(handler http.Handler) func() {
panic(err)
}
var res = NewResponseWriter()
var res = NewResponseRecorder()
h.ServeHTTP(res, req)