forked from quic-go/quic-go
close the response chan on header stream erros in h2quic client
This commit is contained in:
@@ -123,7 +123,7 @@ func (c *Client) handleHeaderStream() {
|
|||||||
utils.Debugf("Error handling header stream %d: %s", lastStream, c.headerErr.Error())
|
utils.Debugf("Error handling header stream %d: %s", lastStream, c.headerErr.Error())
|
||||||
c.mutex.Lock()
|
c.mutex.Lock()
|
||||||
for _, responseChan := range c.responses {
|
for _, responseChan := range c.responses {
|
||||||
responseChan <- nil
|
close(responseChan)
|
||||||
}
|
}
|
||||||
c.mutex.Unlock()
|
c.mutex.Unlock()
|
||||||
}
|
}
|
||||||
@@ -142,14 +142,14 @@ func (c *Client) Do(req *http.Request) (*http.Response, error) {
|
|||||||
hasBody := (req.Body != nil)
|
hasBody := (req.Body != nil)
|
||||||
|
|
||||||
<-c.dialChan // wait until the handshake has completed
|
<-c.dialChan // wait until the handshake has completed
|
||||||
hdrChan := make(chan *http.Response)
|
responseChan := make(chan *http.Response)
|
||||||
dataStream, err := c.session.OpenStreamSync()
|
dataStream, err := c.session.OpenStreamSync()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.Close(err)
|
c.Close(err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
c.mutex.Lock()
|
c.mutex.Lock()
|
||||||
c.responses[dataStream.StreamID()] = hdrChan
|
c.responses[dataStream.StreamID()] = responseChan
|
||||||
c.mutex.Unlock()
|
c.mutex.Unlock()
|
||||||
|
|
||||||
var requestedGzip bool
|
var requestedGzip bool
|
||||||
@@ -182,7 +182,7 @@ func (c *Client) Do(req *http.Request) (*http.Response, error) {
|
|||||||
|
|
||||||
for !(bodySent && receivedResponse) {
|
for !(bodySent && receivedResponse) {
|
||||||
select {
|
select {
|
||||||
case res = <-hdrChan:
|
case res = <-responseChan:
|
||||||
receivedResponse = true
|
receivedResponse = true
|
||||||
c.mutex.Lock()
|
c.mutex.Lock()
|
||||||
delete(c.responses, dataStream.StreamID())
|
delete(c.responses, dataStream.StreamID())
|
||||||
|
|||||||
@@ -403,9 +403,7 @@ var _ = Describe("Client", func() {
|
|||||||
handlerReturned = true
|
handlerReturned = true
|
||||||
}()
|
}()
|
||||||
|
|
||||||
var rsp *http.Response
|
Eventually(client.responses[23]).Should(BeClosed())
|
||||||
Eventually(client.responses[23]).Should(Receive(&rsp))
|
|
||||||
Expect(rsp).To(BeNil())
|
|
||||||
Expect(client.headerErr).To(MatchError(qerr.Error(qerr.InvalidHeadersStreamData, "not a headers frame")))
|
Expect(client.headerErr).To(MatchError(qerr.Error(qerr.InvalidHeadersStreamData, "not a headers frame")))
|
||||||
Eventually(func() bool { return handlerReturned }).Should(BeTrue())
|
Eventually(func() bool { return handlerReturned }).Should(BeTrue())
|
||||||
})
|
})
|
||||||
@@ -423,9 +421,7 @@ var _ = Describe("Client", func() {
|
|||||||
handlerReturned = true
|
handlerReturned = true
|
||||||
}()
|
}()
|
||||||
|
|
||||||
var rsp *http.Response
|
Eventually(client.responses[23]).Should(BeClosed())
|
||||||
Eventually(client.responses[23]).Should(Receive(&rsp))
|
|
||||||
Expect(rsp).To(BeNil())
|
|
||||||
Expect(client.headerErr).To(MatchError(qerr.Error(qerr.InvalidHeadersStreamData, "cannot read header fields")))
|
Expect(client.headerErr).To(MatchError(qerr.Error(qerr.InvalidHeadersStreamData, "cannot read header fields")))
|
||||||
Eventually(func() bool { return handlerReturned }).Should(BeTrue())
|
Eventually(func() bool { return handlerReturned }).Should(BeTrue())
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user