浏览代码

Don't police "te: trailers" at the grpc layer (#2022)

Motivation:

"te: trailers" is required in the request to detect incompatible
proxies. However, "te" is a hop-by-hop header so isn't meant to be
forwarded, as such the only validation the server should do is to check
whether the value is "trailers" iff "te" is present. This doesn't need
to be done at the gRPC layer because NIOHTTP2 already does this
validation.

Modifications:

- Remove the check for "te: trailers"

Result:

Fewer bugs
George Barnett 1 年之前
父节点
当前提交
bef2e5c104

+ 0 - 10
Sources/GRPCHTTP2Core/GRPCStreamStateMachine.swift

@@ -1456,16 +1456,6 @@ extension GRPCStreamStateMachine {
         )
       }
 
-      guard let te = headers.firstString(forKey: .te), te == "trailers" else {
-        self.state = closeServer(from: state, endStream: endStream)
-        return .rejectRPC_serverOnly(
-          trailers: .trailersOnly(
-            code: .invalidArgument,
-            message: "\"te\" header is expected to be present and have a value of \"trailers\"."
-          )
-        )
-      }
-
       // Firstly, find out if we support the client's chosen encoding, and reject
       // the RPC if we don't.
       let inboundEncoding: CompressionAlgorithm

+ 8 - 34
Tests/GRPCHTTP2CoreTests/GRPCStreamStateMachineTests.swift

@@ -1843,40 +1843,14 @@ final class GRPCStreamServerStateMachineTests: XCTestCase {
       endStream: false
     )
 
-    self.assertRejectedRPC(action) { trailers in
-      XCTAssertEqual(
-        trailers,
-        [
-          ":status": "200",
-          "content-type": "application/grpc",
-          "grpc-status": "3",
-          "grpc-message":
-            "\"te\" header is expected to be present and have a value of \"trailers\".",
-        ]
-      )
-    }
-  }
-
-  func testReceiveMetadataWhenClientIdleAndServerIdle_InvalidTE() throws {
-    var stateMachine = self.makeServerStateMachine(targetState: .clientIdleServerIdle)
-
-    let action = try stateMachine.receive(
-      headers: .receivedWithInvalidTE,
-      endStream: false
-    )
-
-    self.assertRejectedRPC(action) { trailers in
-      XCTAssertEqual(
-        trailers,
-        [
-          ":status": "200",
-          "content-type": "application/grpc",
-          "grpc-status": "3",
-          "grpc-message":
-            "\"te\" header is expected to be present and have a value of \"trailers\".",
-        ]
-      )
-    }
+    let metadata: Metadata = [
+      ":path": "/test/test",
+      ":scheme": "http",
+      ":method": "POST",
+      "content-type": "application/grpc",
+    ]
+    let descriptor = MethodDescriptor(service: "test", method: "test")
+    XCTAssertEqual(action, .receivedMetadata(metadata, descriptor))
   }
 
   func testReceiveMetadataWhenClientIdleAndServerIdle_MissingMethod() throws {

+ 0 - 39
Tests/GRPCHTTP2CoreTests/Server/GRPCServerStreamHandlerTests.swift

@@ -201,45 +201,6 @@ final class GRPCServerStreamHandlerTests: XCTestCase {
     XCTAssertTrue(writtenTrailersOnlyResponse.endStream)
   }
 
-  func testClientInitialMetadataWithoutTEResultsInRejectedRPC() throws {
-    let channel = EmbeddedChannel()
-    let handler = GRPCServerStreamHandler(
-      scheme: .http,
-      acceptedEncodings: [],
-      maximumPayloadSize: 1,
-      methodDescriptorPromise: channel.eventLoop.makePromise(of: MethodDescriptor.self)
-    )
-    try channel.pipeline.syncOperations.addHandler(handler)
-
-    // Receive client's initial metadata without TE
-    let clientInitialMetadata: HPACKHeaders = [
-      GRPCHTTP2Keys.path.rawValue: "/test/test",
-      GRPCHTTP2Keys.scheme.rawValue: "http",
-      GRPCHTTP2Keys.method.rawValue: "POST",
-      GRPCHTTP2Keys.contentType.rawValue: "application/grpc",
-    ]
-    XCTAssertNoThrow(
-      try channel.writeInbound(
-        HTTP2Frame.FramePayload.headers(.init(headers: clientInitialMetadata))
-      )
-    )
-
-    // Make sure we have sent a trailers-only response
-    let writtenTrailersOnlyResponse = try channel.assertReadHeadersOutbound()
-
-    XCTAssertEqual(
-      writtenTrailersOnlyResponse.headers,
-      [
-        GRPCHTTP2Keys.status.rawValue: "200",
-        GRPCHTTP2Keys.contentType.rawValue: "application/grpc",
-        GRPCHTTP2Keys.grpcStatus.rawValue: String(Status.Code.invalidArgument.rawValue),
-        GRPCHTTP2Keys.grpcStatusMessage.rawValue:
-          "\"te\" header is expected to be present and have a value of \"trailers\".",
-      ]
-    )
-    XCTAssertTrue(writtenTrailersOnlyResponse.endStream)
-  }
-
   func testNotAcceptedEncodingResultsInRejectedRPC() throws {
     let channel = EmbeddedChannel()
     let handler = GRPCServerStreamHandler(