Baby steps towards handlers responding with data.
diff --git a/server.go b/server.go
index 51db688..c214dce 100644
--- a/server.go
+++ b/server.go
@@ -841,9 +841,10 @@
wbuf bytes.Buffer
// mutated by http.Handler goroutine:
- h http.Header // h goes from maybe-nil to non-nil; contents changed by http.Handler goroutine
- wroteHeaders bool
- calledHeader bool
+ h http.Header // h goes from maybe-nil to non-nil; contents changed by http.Handler goroutine
+ wroteHeaders bool // WriteHeader called (explicitly or implicitly). Not necessarily sent to user yet.
+ writeHeaderCode int
+ calledHeader bool
}
// Optional http.ResponseWriter interfaces implemented.
@@ -881,12 +882,13 @@
if rws.wroteHeaders {
return
}
+ rws.wroteHeaders = true
+ rws.writeHeaderCode = code
// TODO: defer actually writing this frame until a Flush or
// handlerDone, like net/http's Server. then we can coalesce
// e.g. a 204 response to have a Header response frame with
// END_STREAM set, without a separate frame being sent in
// handleDone.
- rws.wroteHeaders = true
rws.sc.writeHeader(headerWriteReq{
streamID: rws.streamID,
httpResCode: code,
@@ -894,12 +896,19 @@
})
}
-func (w *responseWriter) WriteString(s string) (n int, err error) {
- // TODO: better impl
- return w.Write([]byte(s))
+// The Life Of A Write is like this:
+//
+// TODO: copy/adapt the similar comment from Go's http server.go
+func (w *responseWriter) Write(p []byte) (n int, err error) {
+ return w.write(len(p), p, "")
}
-func (w *responseWriter) Write(p []byte) (n int, err error) {
+func (w *responseWriter) WriteString(s string) (n int, err error) {
+ return w.write(len(s), nil, s)
+}
+
+// either dataB or dataS is non-zero.
+func (w *responseWriter) write(lenData int, dataB []byte, dataS string) (n int, err error) {
rws := w.rws
if rws == nil {
panic("Write called after Handler finished")
@@ -907,7 +916,13 @@
if !rws.wroteHeaders {
w.WriteHeader(200)
}
- return rws.sc.writeData(rws.streamID, p) // blocks waiting for tokens
+ // TODO: write to a bufio.Writer instead like the
+ if dataB != nil {
+ rws.wbuf.Write(dataB)
+ } else {
+ rws.wbuf.WriteString(dataS)
+ }
+ return lenData, nil
}
func (w *responseWriter) handlerDone() {