diff --git a/server_test.go b/server_test.go index 1aa987ef7..25bbbd31b 100644 --- a/server_test.go +++ b/server_test.go @@ -98,7 +98,7 @@ var _ = Describe("Server", func() { Expect(err).To(HaveOccurred()) }) - PIt("setups and responds with error on invalid frame", func() { + It("setups and responds with error on invalid frame", func() { path := os.Getenv("GOPATH") + "/src/github.com/lucas-clemente/quic-go/example/" server, err := NewServer(path+"cert.der", path+"key.der", nil) Expect(err).ToNot(HaveOccurred()) diff --git a/session.go b/session.go index 290133681..9d333d0d7 100644 --- a/session.go +++ b/session.go @@ -59,7 +59,7 @@ func NewSession(conn connection, v protocol.VersionNumber, connectionID protocol sentPacketHandler: ackhandler.NewSentPacketHandler(), receivedPacketHandler: ackhandler.NewReceivedPacketHandler(), receivedPackets: make(chan receivedPacket), - closeChan: make(chan struct{}), + closeChan: make(chan struct{}, 1), } cryptoStream, _ := session.NewStream(1) @@ -206,12 +206,17 @@ func (s *Session) Close(e error) error { errorCode = quicError.ErrorCode } s.closeStreamsWithError(e) - // TODO: Don't queue, but send immediately - _ = frames.ConnectionCloseFrame{ - ErrorCode: errorCode, - ReasonPhrase: reasonPhrase, + packet, err := s.packer.PackPacket([]frames.Frame{ + &frames.ConnectionCloseFrame{ErrorCode: errorCode, ReasonPhrase: reasonPhrase}, + }, false) + if err != nil { + return err } - return nil + if packet == nil { + panic("Session: internal inconsistency: expected packet not to be nil") + } + fmt.Printf("-> Sending close packet %d (%d bytes)\n", packet.number, len(packet.raw)) + return s.conn.write(packet.raw) } func (s *Session) closeStreamsWithError(err error) {