TLSVerificationHandler.swift 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*
  2. * Copyright 2019, gRPC Authors All rights reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. import Foundation
  17. import Logging
  18. import NIO
  19. import NIOSSL
  20. import NIOTLS
  21. /// Application protocol identifiers for ALPN.
  22. internal enum GRPCApplicationProtocolIdentifier {
  23. static let gRPC = "grpc-exp"
  24. static let h2 = "h2"
  25. static let http1_1 = "http/1.1"
  26. static let client = [gRPC, h2]
  27. static let server = [gRPC, h2, http1_1]
  28. static func isHTTP2Like(_ value: String) -> Bool {
  29. switch value {
  30. case self.gRPC, self.h2:
  31. return true
  32. default:
  33. return false
  34. }
  35. }
  36. static func isHTTP1(_ value: String) -> Bool {
  37. return value == self.http1_1
  38. }
  39. }
  40. internal class TLSVerificationHandler: ChannelInboundHandler, RemovableChannelHandler {
  41. typealias InboundIn = Any
  42. private let logger: Logger
  43. init(logger: Logger) {
  44. self.logger = logger
  45. }
  46. func userInboundEventTriggered(context: ChannelHandlerContext, event: Any) {
  47. if let tlsEvent = event as? TLSUserEvent {
  48. switch tlsEvent {
  49. case let .handshakeCompleted(negotiatedProtocol: .some(`protocol`)):
  50. self.logger.debug("TLS handshake completed, negotiated protocol: \(`protocol`)")
  51. case .handshakeCompleted(negotiatedProtocol: nil):
  52. self.logger.debug("TLS handshake completed, no protocol negotiated")
  53. case .shutdownCompleted:
  54. ()
  55. }
  56. }
  57. context.fireUserInboundEventTriggered(event)
  58. }
  59. }