@@ -14,6 +14,7 @@ class << self
14
14
15
15
GRPC_STATUS_HEADER = 'grpc-status'
16
16
GRPC_MESSAGE_HEADER = 'grpc-message'
17
+ GRPC_HEADERS = %W[ x-grpc-web #{ GRPC_STATUS_HEADER } #{ GRPC_MESSAGE_HEADER } ] . freeze
17
18
18
19
def request ( uri , rpc_desc , params = { } )
19
20
req_proto = rpc_desc . input . new ( params )
@@ -82,32 +83,37 @@ def parse_headers(header_str)
82
83
end
83
84
84
85
def raise_on_response_errors ( resp , headers , error_unpacking_frames )
86
+ metadata = headers . reject { |key , _ | GRPC_HEADERS . include? ( key ) }
85
87
status_str = headers [ GRPC_STATUS_HEADER ]
86
88
status_code = status_str . to_i if status_str && status_str == status_str . to_i . to_s
87
89
88
90
# see https://github.com/grpc/grpc/blob/master/doc/http-grpc-status-mapping.md
89
91
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
+ )
91
97
end
92
98
93
99
case resp
94
100
when Net ::HTTPBadRequest # 400
95
- raise ::GRPC ::Internal , resp . message
101
+ raise ::GRPC ::Internal . new ( resp . message , metadata )
96
102
when Net ::HTTPUnauthorized # 401
97
- raise ::GRPC ::Unauthenticated , resp . message
103
+ raise ::GRPC ::Unauthenticated . new ( resp . message , metadata )
98
104
when Net ::HTTPForbidden # 403
99
- raise ::GRPC ::PermissionDenied , resp . message
105
+ raise ::GRPC ::PermissionDenied . new ( resp . message , metadata )
100
106
when Net ::HTTPNotFound # 404
101
- raise ::GRPC ::Unimplemented , resp . message
107
+ raise ::GRPC ::Unimplemented . new ( resp . message , metadata )
102
108
when Net ::HTTPTooManyRequests , # 429
103
109
Net ::HTTPBadGateway , # 502
104
110
Net ::HTTPServiceUnavailable , # 503
105
111
Net ::HTTPGatewayTimeOut # 504
106
- raise ::GRPC ::Unavailable , resp . message
112
+ raise ::GRPC ::Unavailable . new ( resp . message , metadata )
107
113
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?
111
117
end
112
118
end
113
119
end
0 commit comments