mirror of
https://github.com/syumai/workers.git
synced 2025-03-10 17:29:11 +00:00
fix bugs
This commit is contained in:
parent
f93500a7f0
commit
f12e359ef0
@ -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.
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user