diff --git a/docs/hello-state/api.go b/docs/hello-state/api.go index c1e201d..d0f3b48 100644 --- a/docs/hello-state/api.go +++ b/docs/hello-state/api.go @@ -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 { diff --git a/docs/hello-state/api.wasm b/docs/hello-state/api.wasm index ff4dec6..4c976cd 100755 Binary files a/docs/hello-state/api.wasm and b/docs/hello-state/api.wasm differ diff --git a/docs/hello/api.go b/docs/hello/api.go index 0c0ae18..8b25e4f 100644 --- a/docs/hello/api.go +++ b/docs/hello/api.go @@ -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 { diff --git a/docs/hello/api.wasm b/docs/hello/api.wasm index d3cf2f8..12f64a5 100755 Binary files a/docs/hello/api.wasm and b/docs/hello/api.wasm differ diff --git a/request.go b/request.go index 9ebc204..2e4ae34 100644 --- a/request.go +++ b/request.go @@ -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 { diff --git a/response_recorder.go b/response_recorder.go new file mode 100644 index 0000000..855fde2 --- /dev/null +++ b/response_recorder.go @@ -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) +} diff --git a/response_writer.go b/response_writer.go deleted file mode 100644 index c776c9c..0000000 --- a/response_writer.go +++ /dev/null @@ -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) -} diff --git a/serve.go b/serve.go index beb8c8c..87e072a 100644 --- a/serve.go +++ b/serve.go @@ -43,7 +43,7 @@ func Serve(handler http.Handler) func() { panic(err) } - var res = NewResponseWriter() + var res = NewResponseRecorder() h.ServeHTTP(res, req)