From d76d86a7e1be55cc02a681af45fa5a1a6e35c310 Mon Sep 17 00:00:00 2001 From: Lucas Clemente Date: Thu, 1 Sep 2016 20:09:41 +0200 Subject: [PATCH] fix detection of only-ack packets ref #315 --- packet_packer.go | 4 ++-- packet_packer_test.go | 6 +++--- session.go | 4 ++++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packet_packer.go b/packet_packer.go index 9c18aa63..5d96737b 100644 --- a/packet_packer.go +++ b/packet_packer.go @@ -113,11 +113,11 @@ func (p *packetPacker) packPacket(stopWaitingFrame *frames.StopWaitingFrame, con // Don't send out packets that only contain an ACK (plus optional STOP_WAITING), if requested if !maySendOnlyAck { if len(payloadFrames) == 1 { - if _, ok := payloadFrames[0].(*frames.AckFrameLegacy); ok { + if _, ok := payloadFrames[0].(*frames.AckFrame); ok { return nil, nil } } else if len(payloadFrames) == 2 && stopWaitingFrame != nil { - if _, ok := payloadFrames[1].(*frames.AckFrameLegacy); ok { + if _, ok := payloadFrames[1].(*frames.AckFrame); ok { return nil, nil } } diff --git a/packet_packer_test.go b/packet_packer_test.go index 06b4d96c..28d71d70 100644 --- a/packet_packer_test.go +++ b/packet_packer_test.go @@ -464,19 +464,19 @@ var _ = Describe("Packet packer", func() { }) It("returns nil if we only have a single STOP_WAITING and an ACK", func() { - p, err := packer.PackPacket(&frames.StopWaitingFrame{}, []frames.Frame{&frames.AckFrameLegacy{}}, 0, false) + p, err := packer.PackPacket(&frames.StopWaitingFrame{}, []frames.Frame{&frames.AckFrame{}}, 0, false) Expect(err).NotTo(HaveOccurred()) Expect(p).To(BeNil()) }) It("returns nil if we only have a single ACK", func() { - p, err := packer.PackPacket(nil, []frames.Frame{&frames.AckFrameLegacy{}}, 0, false) + p, err := packer.PackPacket(nil, []frames.Frame{&frames.AckFrame{}}, 0, false) Expect(err).NotTo(HaveOccurred()) Expect(p).To(BeNil()) }) It("does not return nil if we only have a single ACK but request it to be sent", func() { - p, err := packer.PackPacket(nil, []frames.Frame{&frames.AckFrameLegacy{}}, 0, true) + p, err := packer.PackPacket(nil, []frames.Frame{&frames.AckFrame{}}, 0, true) Expect(err).NotTo(HaveOccurred()) Expect(p).ToNot(BeNil()) }) diff --git a/session.go b/session.go index f8c0448b..f113dd0b 100644 --- a/session.go +++ b/session.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "net" + "runtime" "sync/atomic" "time" @@ -490,6 +491,9 @@ func (s *Session) sendPacket() error { // Check whether we are allowed to send a packet containing only an ACK maySendOnlyAck := time.Now().Sub(s.delayedAckOriginTime) > protocol.AckSendDelay + if runtime.GOOS == "windows" { + maySendOnlyAck = true + } hasRetransmission := s.streamFramer.HasFramesForRetransmission()