This commit is contained in:
syumai 2022-05-20 00:11:47 +09:00
parent f93500a7f0
commit f12e359ef0
4 changed files with 35 additions and 18 deletions

View File

@ -46,14 +46,16 @@ func handleRequest(reqObj js.Value) (js.Value, error) {
w := &responseWriterBuffer{
header: http.Header{},
statusCode: http.StatusOK,
PipeReader: reader,
PipeWriter: writer,
reader: reader,
writer: writer,
readyCh: make(chan struct{}),
}
go func() {
defer w.ready()
defer writer.Close()
httpHandler.ServeHTTP(w, req)
}()
return w.toJSResponse()
return toJSResponse(w)
}
// Server serves http.Handler on Cloudflare Workers.

View File

@ -1,6 +1,7 @@
package workers
import (
"fmt"
"io"
"net/http"
"net/url"
@ -28,8 +29,11 @@ func toHeader(headers js.Value) http.Header {
for i := 0; i < headerLen; i++ {
entry := entries.Index(i)
key := entry.Index(0).String()
value := entry.Index(1).String()
h[key] = strings.Split(value, ",")
values := entry.Index(1).String()
fmt.Printf("key: %s, values: %s\n", key, values)
for _, value := range strings.Split(values, ",") {
h.Add(key, value)
}
}
return h
}

View File

@ -1,7 +1,6 @@
package workers
import (
"io"
"net/http"
"syscall/js"
)
@ -16,14 +15,16 @@ func toJSHeader(header http.Header) js.Value {
return h
}
func toJSResponse(body io.ReadCloser, status int, header http.Header) (js.Value, error) {
func toJSResponse(w *responseWriterBuffer) (js.Value, error) {
<-w.readyCh // wait until ready
status := w.statusCode
if status == 0 {
status = http.StatusOK
}
respInit := newObject()
respInit.Set("status", status)
respInit.Set("statusText", http.StatusText(status))
respInit.Set("headers", toJSHeader(header))
readableStream := convertReaderToReadableStream(body)
respInit.Set("headers", toJSHeader(w.Header()))
readableStream := convertReaderToReadableStream(w.reader)
return responseClass.New(readableStream, respInit), nil
}

View File

@ -3,26 +3,36 @@ package workers
import (
"io"
"net/http"
"syscall/js"
"sync"
)
type responseWriterBuffer struct {
header http.Header
statusCode int
*io.PipeReader
*io.PipeWriter
reader *io.PipeReader
writer *io.PipeWriter
readyCh chan struct{}
once sync.Once
}
var _ http.ResponseWriter = &responseWriterBuffer{}
func (w responseWriterBuffer) Header() http.Header {
// ready indicates that responseWriterBuffer is ready to be converted to Response.
func (w *responseWriterBuffer) ready() {
w.once.Do(func() {
close(w.readyCh)
})
}
func (w *responseWriterBuffer) Write(data []byte) (n int, err error) {
w.ready()
return w.writer.Write(data)
}
func (w *responseWriterBuffer) Header() http.Header {
return w.header
}
func (w responseWriterBuffer) WriteHeader(statusCode int) {
func (w *responseWriterBuffer) WriteHeader(statusCode int) {
w.statusCode = statusCode
}
func (w responseWriterBuffer) toJSResponse() (js.Value, error) {
return toJSResponse(w.PipeReader, w.statusCode, w.header)
}