@@ -1317,4 +1317,50 @@ class SimpleClientServerTests: XCTestCase {
13171317 XCTAssertNoThrow ( try self . clientChannel. finish ( ) )
13181318 XCTAssertNoThrow ( try self . serverChannel. finish ( ) )
13191319 }
1320+
1321+ func testBadClientMagic( ) throws {
1322+ class WaitForErrorHandler : ChannelInboundHandler {
1323+ typealias InboundIn = Never
1324+
1325+ private var errorSeenPromise : EventLoopPromise < Error > ?
1326+
1327+ init ( errorSeenPromise: EventLoopPromise < Error > ) {
1328+ self . errorSeenPromise = errorSeenPromise
1329+ }
1330+
1331+ func channelRead( ctx: ChannelHandlerContext , data: NIOAny ) {
1332+ XCTFail ( " shouldnt' have received \( data) " )
1333+ }
1334+
1335+ func errorCaught( ctx: ChannelHandlerContext , error: Error ) {
1336+ if let errorSeenPromise = self . errorSeenPromise {
1337+ errorSeenPromise. succeed ( result: error)
1338+ } else {
1339+ XCTFail ( " extra error \( error) received " )
1340+ }
1341+ }
1342+ }
1343+
1344+ let errorSeenPromise : EventLoopPromise < Error > = self . clientChannel. eventLoop. newPromise ( )
1345+ XCTAssertNoThrow ( try self . serverChannel. pipeline. add ( handler: HTTP2Parser ( mode: . server) ) . wait ( ) )
1346+ XCTAssertNoThrow ( try self . serverChannel. pipeline. add ( handler: WaitForErrorHandler ( errorSeenPromise: errorSeenPromise) ) . wait ( ) )
1347+
1348+ self . clientChannel? . pipeline. fireChannelActive ( )
1349+ self . serverChannel? . pipeline. fireChannelActive ( )
1350+
1351+ var buffer = self . clientChannel. allocator. buffer ( capacity: 16 )
1352+ buffer. write ( staticString: " GET / HTTP/1.1 \r \n Host: apple.com \r \n \r \n " )
1353+ XCTAssertNoThrow ( try self . clientChannel. writeAndFlush ( buffer) . wait ( ) )
1354+
1355+ self . interactInMemory ( self . clientChannel, self . serverChannel)
1356+
1357+ XCTAssertNoThrow ( try XCTAssertEqual ( NIOHTTP2Errors . BadClientMagic ( ) ,
1358+ errorSeenPromise. futureResult. wait ( ) as? NIOHTTP2Errors . BadClientMagic ) )
1359+ let clientReceived : ByteBuffer ? = self . clientChannel. readInbound ( )
1360+ XCTAssertNotNil ( clientReceived)
1361+
1362+ XCTAssertNoThrow ( try XCTAssertFalse ( self . clientChannel. finish ( ) ) )
1363+ XCTAssertNoThrow ( try XCTAssertFalse ( self . serverChannel. finish ( ) ) )
1364+ }
1365+
13201366}
0 commit comments