Handle implements HTTPServer.
(ctx context.Context, r *httpgrpc.HTTPRequest)
| 72 | |
| 73 | // Handle implements HTTPServer. |
| 74 | func (s Server) Handle(ctx context.Context, r *httpgrpc.HTTPRequest) (*httpgrpc.HTTPResponse, error) { |
| 75 | ctx = context.WithValue(ctx, handledByHttpgrpcServer, true) |
| 76 | |
| 77 | req, err := httpgrpc.ToHTTPRequest(ctx, r) |
| 78 | if err != nil { |
| 79 | return nil, err |
| 80 | } |
| 81 | |
| 82 | recorder := httptest.NewRecorder() |
| 83 | s.handler.ServeHTTP(recorder, req) |
| 84 | header := recorder.Header() |
| 85 | |
| 86 | doNotLogError := false |
| 87 | if _, ok := header[DoNotLogErrorHeaderKey]; ok { |
| 88 | doNotLogError = true |
| 89 | header.Del(DoNotLogErrorHeaderKey) // remove before converting to httpgrpc resp |
| 90 | } |
| 91 | |
| 92 | errorMessageFromHeader := "" |
| 93 | if msg, ok := header[ErrorMessageHeaderKey]; ok { |
| 94 | errorMessageFromHeader = msg[0] |
| 95 | header.Del(ErrorMessageHeaderKey) // remove before converting to httpgrpc resp |
| 96 | } |
| 97 | |
| 98 | resp := &httpgrpc.HTTPResponse{ |
| 99 | Code: int32(recorder.Code), |
| 100 | Headers: httpgrpc.FromHeader(header), |
| 101 | Body: recorder.Body.Bytes(), |
| 102 | } |
| 103 | if s.shouldReturnError(resp) { |
| 104 | var err error |
| 105 | if errorMessageFromHeader != "" { |
| 106 | err = httpgrpc.ErrorFromHTTPResponseWithMessage(resp, errorMessageFromHeader) |
| 107 | } else { |
| 108 | err = httpgrpc.ErrorFromHTTPResponse(resp) |
| 109 | } |
| 110 | if doNotLogError { |
| 111 | err = middleware.DoNotLogError{Err: err} |
| 112 | } |
| 113 | return nil, err |
| 114 | } |
| 115 | return resp, nil |
| 116 | } |
| 117 | |
| 118 | func (s Server) shouldReturnError(resp *httpgrpc.HTTPResponse) bool { |
| 119 | mask := resp.GetCode() / 100 |