Skip to content

Commit dcd7e92

Browse files
authored
XHTTP server: Finish stream-up's HTTP POST when its request.Body is closed
#4373 (comment) Fixes #4373
1 parent 2d7ca4a commit dcd7e92

File tree

1 file changed

+27
-5
lines changed
  • transport/internet/splithttp

1 file changed

+27
-5
lines changed

transport/internet/splithttp/hub.go

+27-5
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Req
161161
}
162162
scMaxEachPostBytes := int(h.ln.config.GetNormalizedScMaxEachPostBytes().To)
163163

164-
if request.Method == "POST" && sessionId != "" {
164+
if request.Method == "POST" && sessionId != "" { // stream-up, packet-up
165165
seq := ""
166166
if len(subpath) > 1 {
167167
seq = subpath[1]
@@ -173,8 +173,12 @@ func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Req
173173
writer.WriteHeader(http.StatusBadRequest)
174174
return
175175
}
176+
uploadDone := done.New()
176177
err = currentSession.uploadQueue.Push(Packet{
177-
Reader: request.Body,
178+
Reader: &httpRequestBodyReader{
179+
requestReader: request.Body,
180+
uploadDone: uploadDone,
181+
},
178182
})
179183
if err != nil {
180184
errors.LogInfoInner(context.Background(), err, "failed to upload (PushReader)")
@@ -199,8 +203,12 @@ func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Req
199203
}
200204
}()
201205
}
202-
<-request.Context().Done()
206+
select {
207+
case <-request.Context().Done():
208+
case <-uploadDone.Wait():
209+
}
203210
}
211+
uploadDone.Close()
204212
return
205213
}
206214

@@ -243,7 +251,7 @@ func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Req
243251
}
244252

245253
writer.WriteHeader(http.StatusOK)
246-
} else if request.Method == "GET" || sessionId == "" {
254+
} else if request.Method == "GET" || sessionId == "" { // stream-down, stream-one
247255
responseFlusher, ok := writer.(http.Flusher)
248256
if !ok {
249257
panic("expected http.ResponseWriter to be an http.Flusher")
@@ -283,7 +291,7 @@ func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Req
283291
reader: request.Body,
284292
remoteAddr: remoteAddr,
285293
}
286-
if sessionId != "" {
294+
if sessionId != "" { // if not stream-one
287295
conn.reader = currentSession.uploadQueue
288296
}
289297

@@ -302,6 +310,20 @@ func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Req
302310
}
303311
}
304312

313+
type httpRequestBodyReader struct {
314+
requestReader io.ReadCloser
315+
uploadDone *done.Instance
316+
}
317+
318+
func (c *httpRequestBodyReader) Read(b []byte) (int, error) {
319+
return c.requestReader.Read(b)
320+
}
321+
322+
func (c *httpRequestBodyReader) Close() error {
323+
defer c.uploadDone.Close()
324+
return c.requestReader.Close()
325+
}
326+
305327
type httpResponseBodyWriter struct {
306328
sync.Mutex
307329
responseWriter http.ResponseWriter

0 commit comments

Comments
 (0)