github.com/kaydxh/golang@v0.0.131/pkg/middleware/api/trivial/v1/http.interceptor.error.go (about) 1 /* 2 *Copyright (c) 2022, kaydxh 3 * 4 *Permission is hereby granted, free of charge, to any person obtaining a copy 5 *of this software and associated documentation files (the "Software"), to deal 6 *in the Software without restriction, including without limitation the rights 7 *to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 *copies of the Software, and to permit persons to whom the Software is 9 *furnished to do so, subject to the following conditions: 10 * 11 *The above copyright notice and this permission notice shall be included in all 12 *copies or substantial portions of the Software. 13 * 14 *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 *IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 *FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 *AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 *LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 *OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 *SOFTWARE. 21 */ 22 package v1 23 24 import ( 25 "context" 26 "encoding/json" 27 "fmt" 28 "net/http" 29 30 "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" 31 context_ "github.com/kaydxh/golang/go/context" 32 errors_ "github.com/kaydxh/golang/go/errors" 33 http_ "github.com/kaydxh/golang/go/net/http" 34 runtime_ "github.com/kaydxh/golang/go/runtime" 35 strings_ "github.com/kaydxh/golang/go/strings" 36 "github.com/sirupsen/logrus" 37 38 "google.golang.org/protobuf/proto" 39 ) 40 41 // HTTPError uses the mux-configured error handler. 42 func HTTPError(ctx context.Context, mux *runtime.ServeMux, 43 marshaler runtime.Marshaler, w http.ResponseWriter, r *http.Request, err error) { 44 45 requestId := context_.ExtractStringFromContext(ctx, http_.DefaultHTTPRequestIDKey) 46 if requestId == "" { 47 requestId = strings_.GetStringOrFallback( 48 append(runtime_.GetMetadata(ctx, http_.DefaultHTTPRequestIDKey), "")...) 49 } 50 51 errResponse := &TrivialErrorResponse{ 52 ErrorCode: int32(errors_.ErrorToCode(err)), 53 ErrorMsg: errors_.ErrorToString(err), 54 SessionId: requestId, 55 } 56 logrus.WithField("request_id", requestId).WithField("response", errResponse).Errorf("send") 57 58 // ForwardResponseMessage forwards the message "resp" from gRPC server to REST client 59 runtime.ForwardResponseMessage(ctx, mux, marshaler, w, r, errResponse) 60 } 61 62 //cant not rewrite message, only append message to response 63 func HTTPForwardResponse(ctx context.Context, r http.ResponseWriter, message proto.Message) error { 64 jb, err := json.Marshal(message) 65 if err != nil { 66 return fmt.Errorf("jsonpb.Marshal: %v", err) 67 } 68 69 r.Write(jb) 70 71 return nil 72 }