From 6d6df4fb7c93804b726dac2faa6de31a55a68f7e Mon Sep 17 00:00:00 2001 From: Michael Rebello Date: Mon, 26 Jun 2023 09:26:13 -0700 Subject: [PATCH] Add assertion when using gRPC with URLSession (#138) Add a debug assertion failure that will trigger when the `URLSessionHTTPClient` is used with gRPC to make it more apparent as to why some "successful" responses are still invalid. For context, URLSession does not support trailers and is thus incompatible with gRPC. --- .../Connect/Implementation/URLSessionHTTPClient.swift | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Libraries/Connect/Implementation/URLSessionHTTPClient.swift b/Libraries/Connect/Implementation/URLSessionHTTPClient.swift index 0dae302f..7312eec6 100644 --- a/Libraries/Connect/Implementation/URLSessionHTTPClient.swift +++ b/Libraries/Connect/Implementation/URLSessionHTTPClient.swift @@ -45,6 +45,7 @@ open class URLSessionHTTPClient: NSObject, HTTPClientInterface { onMetrics: @Sendable @escaping (HTTPMetrics) -> Void, onResponse: @Sendable @escaping (HTTPResponse) -> Void ) -> Cancelable { + assert(!request.isGRPC, "URLSessionHTTPClient does not support gRPC, use NIOHTTPClient") let urlRequest = URLRequest(httpRequest: request) let task = self.session.dataTask(with: urlRequest) { data, urlResponse, error in if let httpURLResponse = urlResponse as? HTTPURLResponse { @@ -93,6 +94,7 @@ open class URLSessionHTTPClient: NSObject, HTTPClientInterface { open func stream( request: HTTPRequest, responseCallbacks: ResponseCallbacks ) -> RequestCallbacks { + assert(!request.isGRPC, "URLSessionHTTPClient does not support gRPC, use NIOHTTPClient") let urlSessionStream = URLSessionStream( request: URLRequest(httpRequest: request), session: self.session, @@ -196,6 +198,15 @@ extension Code { } } +private extension HTTPRequest { + var isGRPC: Bool { + return self.headers[HeaderConstants.contentType]?.first.map { contentType in + return contentType.hasPrefix("application/grpc") + && !contentType.hasPrefix("application/grpc-web") + } ?? false + } +} + private extension URLRequest { init(httpRequest: HTTPRequest) { self.init(url: httpRequest.url)