@@ -14,6 +14,7 @@ class << self
1414
1515 GRPC_STATUS_HEADER = 'grpc-status'
1616 GRPC_MESSAGE_HEADER = 'grpc-message'
17+ GRPC_HEADERS = %W[ x-grpc-web #{ GRPC_STATUS_HEADER } #{ GRPC_MESSAGE_HEADER } ] . freeze
1718
1819 def request ( uri , rpc_desc , params = { } )
1920 req_proto = rpc_desc . input . new ( params )
@@ -82,32 +83,37 @@ def parse_headers(header_str)
8283 end
8384
8485 def raise_on_response_errors ( resp , headers , error_unpacking_frames )
86+ metadata = headers . reject { |key , _ | GRPC_HEADERS . include? ( key ) }
8587 status_str = headers [ GRPC_STATUS_HEADER ]
8688 status_code = status_str . to_i if status_str && status_str == status_str . to_i . to_s
8789
8890 # see https://github.com/grpc/grpc/blob/master/doc/http-grpc-status-mapping.md
8991 if status_code && status_code != 0
90- raise ::GRPC ::BadStatus . new_status_exception ( status_code , headers [ GRPC_MESSAGE_HEADER ] )
92+ raise ::GRPC ::BadStatus . new_status_exception (
93+ status_code ,
94+ headers [ GRPC_MESSAGE_HEADER ] ,
95+ metadata ,
96+ )
9197 end
9298
9399 case resp
94100 when Net ::HTTPBadRequest # 400
95- raise ::GRPC ::Internal , resp . message
101+ raise ::GRPC ::Internal . new ( resp . message , metadata )
96102 when Net ::HTTPUnauthorized # 401
97- raise ::GRPC ::Unauthenticated , resp . message
103+ raise ::GRPC ::Unauthenticated . new ( resp . message , metadata )
98104 when Net ::HTTPForbidden # 403
99- raise ::GRPC ::PermissionDenied , resp . message
105+ raise ::GRPC ::PermissionDenied . new ( resp . message , metadata )
100106 when Net ::HTTPNotFound # 404
101- raise ::GRPC ::Unimplemented , resp . message
107+ raise ::GRPC ::Unimplemented . new ( resp . message , metadata )
102108 when Net ::HTTPTooManyRequests , # 429
103109 Net ::HTTPBadGateway , # 502
104110 Net ::HTTPServiceUnavailable , # 503
105111 Net ::HTTPGatewayTimeOut # 504
106- raise ::GRPC ::Unavailable , resp . message
112+ raise ::GRPC ::Unavailable . new ( resp . message , metadata )
107113 else
108- raise ::GRPC ::Unknown , resp . message unless resp . is_a? ( Net ::HTTPSuccess ) # 200
109- raise ::GRPC ::Internal , resp . message if error_unpacking_frames
110- raise ::GRPC ::Unknown , resp . message if status_code . nil?
114+ raise ::GRPC ::Unknown . new ( resp . message , metadata ) unless resp . is_a? ( Net ::HTTPSuccess ) # 200
115+ raise ::GRPC ::Internal . new ( resp . message , metadata ) if error_unpacking_frames
116+ raise ::GRPC ::Unknown . new ( resp . message , metadata ) if status_code . nil?
111117 end
112118 end
113119 end
0 commit comments