@@ -1345,4 +1345,49 @@ class SimpleClientServerTests: XCTestCase {
13451345 XCTAssertNoThrow ( try self . clientChannel. finish ( ) )
13461346 XCTAssertNoThrow ( try self . serverChannel. finish ( ) )
13471347 }
1348+
1349+ func testBadClientMagic( ) throws {
1350+ class WaitForErrorHandler : ChannelInboundHandler {
1351+ typealias InboundIn = Never
1352+
1353+ private var errorSeenPromise : EventLoopPromise < Error > ?
1354+
1355+ init ( errorSeenPromise: EventLoopPromise < Error > ) {
1356+ self . errorSeenPromise = errorSeenPromise
1357+ }
1358+
1359+ func channelRead( ctx: ChannelHandlerContext , data: NIOAny ) {
1360+ XCTFail ( " shouldnt' have received \( data) " )
1361+ }
1362+
1363+ func errorCaught( ctx: ChannelHandlerContext , error: Error ) {
1364+ if let errorSeenPromise = self . errorSeenPromise {
1365+ errorSeenPromise. succeed ( result: error)
1366+ } else {
1367+ XCTFail ( " extra error \( error) received " )
1368+ }
1369+ }
1370+ }
1371+
1372+ let errorSeenPromise : EventLoopPromise < Error > = self . clientChannel. eventLoop. newPromise ( )
1373+ XCTAssertNoThrow ( try self . serverChannel. pipeline. add ( handler: HTTP2Parser ( mode: . server) ) . wait ( ) )
1374+ XCTAssertNoThrow ( try self . serverChannel. pipeline. add ( handler: WaitForErrorHandler ( errorSeenPromise: errorSeenPromise) ) . wait ( ) )
1375+
1376+ self . clientChannel? . pipeline. fireChannelActive ( )
1377+ self . serverChannel? . pipeline. fireChannelActive ( )
1378+
1379+ var buffer = self . clientChannel. allocator. buffer ( capacity: 16 )
1380+ buffer. write ( staticString: " GET / HTTP/1.1 \r \n Host: apple.com \r \n \r \n " )
1381+ XCTAssertNoThrow ( try self . clientChannel. writeAndFlush ( buffer) . wait ( ) )
1382+
1383+ self . interactInMemory ( self . clientChannel, self . serverChannel)
1384+
1385+ XCTAssertNoThrow ( try XCTAssertEqual ( NIOHTTP2Errors . BadClientMagic ( ) ,
1386+ errorSeenPromise. futureResult. wait ( ) as? NIOHTTP2Errors . BadClientMagic ) )
1387+ let clientReceived : ByteBuffer ? = self . clientChannel. readInbound ( )
1388+ XCTAssertNotNil ( clientReceived)
1389+
1390+ XCTAssertNoThrow ( try XCTAssertFalse ( self . clientChannel. finish ( ) ) )
1391+ XCTAssertNoThrow ( try XCTAssertFalse ( self . serverChannel. finish ( ) ) )
1392+ }
13481393}
0 commit comments