diff --git a/_examples/mvc/grpc-compatible/grpc-client/main.go b/_examples/mvc/grpc-compatible/grpc-client/main.go new file mode 100644 index 000000000..b8a982f8d --- /dev/null +++ b/_examples/mvc/grpc-compatible/grpc-client/main.go @@ -0,0 +1,47 @@ +// Package main implements a client for Greeter service. +package main + +import ( + "context" + "log" + "os" + "time" + + pb "github.com/kataras/iris/v12/_examples/mvc/grpc-compatible/helloworld" + + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" +) + +const ( + address = "localhost:443" + defaultName = "world" +) + +func main() { + // Set up a connection to the server. + cred, err := credentials.NewClientTLSFromFile("../server.crt", "localhost") + if err != nil { + log.Fatal(err) + } + + conn, err := grpc.Dial(address, grpc.WithTransportCredentials(cred), grpc.WithBlock()) + if err != nil { + log.Fatalf("did not connect: %v", err) + } + defer conn.Close() + c := pb.NewGreeterClient(conn) + + // Contact the server and print out its response. + name := defaultName + if len(os.Args) > 1 { + name = os.Args[1] + } + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + r, err := c.PostHello(ctx, &pb.HelloRequest{Name: name}) + if err != nil { + log.Fatalf("could not greet: %v", err) + } + log.Printf("Greeting: %s", r.GetMessage()) +} diff --git a/_examples/mvc/grpc-compatible/helloworld/README.md b/_examples/mvc/grpc-compatible/helloworld/README.md new file mode 100644 index 000000000..61b3729c3 --- /dev/null +++ b/_examples/mvc/grpc-compatible/helloworld/README.md @@ -0,0 +1,3 @@ +# Helloworld gRPC Example + +https://github.com/grpc/grpc-go/tree/master/examples/helloworld \ No newline at end of file diff --git a/_examples/mvc/grpc-compatible/helloworld/helloworld.pb.go b/_examples/mvc/grpc-compatible/helloworld/helloworld.pb.go new file mode 100644 index 000000000..94a0a1dee --- /dev/null +++ b/_examples/mvc/grpc-compatible/helloworld/helloworld.pb.go @@ -0,0 +1,210 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: helloworld.proto + +package helloworld + +import ( + context "context" + fmt "fmt" + math "math" + + proto "github.com/golang/protobuf/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// The request message containing the user's name. +type HelloRequest struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *HelloRequest) Reset() { *m = HelloRequest{} } +func (m *HelloRequest) String() string { return proto.CompactTextString(m) } +func (*HelloRequest) ProtoMessage() {} +func (*HelloRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_17b8c58d586b62f2, []int{0} +} + +func (m *HelloRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_HelloRequest.Unmarshal(m, b) +} +func (m *HelloRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_HelloRequest.Marshal(b, m, deterministic) +} +func (m *HelloRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_HelloRequest.Merge(m, src) +} +func (m *HelloRequest) XXX_Size() int { + return xxx_messageInfo_HelloRequest.Size(m) +} +func (m *HelloRequest) XXX_DiscardUnknown() { + xxx_messageInfo_HelloRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_HelloRequest proto.InternalMessageInfo + +func (m *HelloRequest) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +// The response message containing the greetings +type HelloReply struct { + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *HelloReply) Reset() { *m = HelloReply{} } +func (m *HelloReply) String() string { return proto.CompactTextString(m) } +func (*HelloReply) ProtoMessage() {} +func (*HelloReply) Descriptor() ([]byte, []int) { + return fileDescriptor_17b8c58d586b62f2, []int{1} +} + +func (m *HelloReply) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_HelloReply.Unmarshal(m, b) +} +func (m *HelloReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_HelloReply.Marshal(b, m, deterministic) +} +func (m *HelloReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_HelloReply.Merge(m, src) +} +func (m *HelloReply) XXX_Size() int { + return xxx_messageInfo_HelloReply.Size(m) +} +func (m *HelloReply) XXX_DiscardUnknown() { + xxx_messageInfo_HelloReply.DiscardUnknown(m) +} + +var xxx_messageInfo_HelloReply proto.InternalMessageInfo + +func (m *HelloReply) GetMessage() string { + if m != nil { + return m.Message + } + return "" +} + +func init() { + proto.RegisterType((*HelloRequest)(nil), "helloworld.HelloRequest") + proto.RegisterType((*HelloReply)(nil), "helloworld.HelloReply") +} + +func init() { proto.RegisterFile("helloworld.proto", fileDescriptor_17b8c58d586b62f2) } + +var fileDescriptor_17b8c58d586b62f2 = []byte{ + // 175 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0xc8, 0x48, 0xcd, 0xc9, + 0xc9, 0x2f, 0xcf, 0x2f, 0xca, 0x49, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x42, 0x88, + 0x28, 0x29, 0x71, 0xf1, 0x78, 0x80, 0x78, 0x41, 0xa9, 0x85, 0xa5, 0xa9, 0xc5, 0x25, 0x42, 0x42, + 0x5c, 0x2c, 0x79, 0x89, 0xb9, 0xa9, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0x9c, 0x41, 0x60, 0xb6, 0x92, + 0x1a, 0x17, 0x17, 0x54, 0x4d, 0x41, 0x4e, 0xa5, 0x90, 0x04, 0x17, 0x7b, 0x6e, 0x6a, 0x71, 0x71, + 0x62, 0x3a, 0x4c, 0x11, 0x8c, 0x6b, 0xe4, 0xc9, 0xc5, 0xee, 0x5e, 0x94, 0x9a, 0x5a, 0x92, 0x5a, + 0x24, 0x64, 0xc7, 0xc5, 0x11, 0x9c, 0x58, 0x09, 0xd6, 0x25, 0x24, 0xa1, 0x87, 0xe4, 0x02, 0x64, + 0xcb, 0xa4, 0xc4, 0xb0, 0xc8, 0x14, 0xe4, 0x54, 0x2a, 0x31, 0x38, 0x19, 0x70, 0x49, 0x67, 0xe6, + 0xeb, 0xa5, 0x17, 0x15, 0x24, 0xeb, 0xa5, 0x56, 0x24, 0xe6, 0x16, 0xe4, 0xa4, 0x16, 0x23, 0xa9, + 0x75, 0xe2, 0x07, 0x2b, 0x0e, 0x07, 0xb1, 0x03, 0x40, 0x5e, 0x0a, 0x60, 0x4c, 0x62, 0x03, 0xfb, + 0xcd, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x0f, 0xb7, 0xcd, 0xf2, 0xef, 0x00, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConnInterface + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion6 + +// GreeterClient is the client API for Greeter service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type GreeterClient interface { + // Sends a greeting + PostHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error) +} + +type greeterClient struct { + cc grpc.ClientConnInterface +} + +func NewGreeterClient(cc grpc.ClientConnInterface) GreeterClient { + return &greeterClient{cc} +} + +func (c *greeterClient) PostHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error) { + out := new(HelloReply) + err := c.cc.Invoke(ctx, "/helloworld.Greeter/PostHello", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// GreeterServer is the server API for Greeter service. +type GreeterServer interface { + // Sends a greeting + PostHello(context.Context, *HelloRequest) (*HelloReply, error) +} + +// UnimplementedGreeterServer can be embedded to have forward compatible implementations. +type UnimplementedGreeterServer struct { +} + +func (*UnimplementedGreeterServer) PostHello(ctx context.Context, req *HelloRequest) (*HelloReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method PostHello not implemented") +} + +func RegisterGreeterServer(s *grpc.Server, srv GreeterServer) { + s.RegisterService(&_Greeter_serviceDesc, srv) +} + +func _Greeter_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(HelloRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GreeterServer).PostHello(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/helloworld.Greeter/PostHello", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GreeterServer).PostHello(ctx, req.(*HelloRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Greeter_serviceDesc = grpc.ServiceDesc{ + ServiceName: "helloworld.Greeter", + HandlerType: (*GreeterServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "PostHello", + Handler: _Greeter_SayHello_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "helloworld.proto", +} diff --git a/_examples/mvc/grpc-compatible/helloworld/helloworld.proto b/_examples/mvc/grpc-compatible/helloworld/helloworld.proto new file mode 100644 index 000000000..180194d0f --- /dev/null +++ b/_examples/mvc/grpc-compatible/helloworld/helloworld.proto @@ -0,0 +1,23 @@ +syntax = "proto3"; + +option java_multiple_files = true; +option java_package = "io.grpc.examples.helloworld"; +option java_outer_classname = "HelloWorldProto"; + +package helloworld; + +// The greeting service definition. +service Greeter { + // Sends a greeting + rpc PostHello (HelloRequest) returns (HelloReply) {} +} + +// The request message containing the user's name. +message HelloRequest { + string name = 1; +} + +// The response message containing the greetings +message HelloReply { + string message = 1; +} \ No newline at end of file diff --git a/_examples/mvc/grpc-compatible/http-client/main.go b/_examples/mvc/grpc-compatible/http-client/main.go new file mode 100644 index 000000000..d4560c096 --- /dev/null +++ b/_examples/mvc/grpc-compatible/http-client/main.go @@ -0,0 +1,50 @@ +package main + +import ( + "bytes" + "crypto/tls" + "crypto/x509" + "encoding/json" + "io/ioutil" + "log" + "net/http" + + pb "github.com/kataras/iris/v12/_examples/mvc/grpc-compatible/helloworld" +) + +func main() { + b, err := ioutil.ReadFile("../server.crt") + if err != nil { + log.Fatal(err) + } + cp := x509.NewCertPool() + if !cp.AppendCertsFromPEM(b) { + log.Fatal("credentials: failed to append certificates") + } + + transport := &http.Transport{ + TLSClientConfig: &tls.Config{ + RootCAs: cp, + }, + } + + client := http.Client{Transport: transport} + buf := new(bytes.Buffer) + err = json.NewEncoder(buf).Encode(pb.HelloRequest{Name: "world"}) + if err != nil { + log.Fatal(err) + } + + resp, err := client.Post("https://localhost/hello", "application/json", buf) + if err != nil { + log.Fatal(err) + } + defer resp.Body.Close() + + var reply pb.HelloReply + err = json.NewDecoder(resp.Body).Decode(&reply) + if err != nil { + log.Fatal(err) + } + log.Printf("Greeting: %s", reply.GetMessage()) +} diff --git a/_examples/mvc/grpc-compatible/main.go b/_examples/mvc/grpc-compatible/main.go index 121653219..b192f64d0 100644 --- a/_examples/mvc/grpc-compatible/main.go +++ b/_examples/mvc/grpc-compatible/main.go @@ -3,8 +3,13 @@ package main import ( "context" + pb "github.com/kataras/iris/v12/_examples/mvc/grpc-compatible/helloworld" + "github.com/kataras/iris/v12" + grpcWrapper "github.com/kataras/iris/v12/middleware/grpc" "github.com/kataras/iris/v12/mvc" + + "google.golang.org/grpc" ) // See https://github.com/kataras/iris/issues/1449 @@ -18,33 +23,32 @@ func main() { app := newApp() app.Logger().SetLevel("debug") - // POST: http://localhost:8080/login - // with request data: {"username": "makis"} - // and expected output: {"message": "makis logged"} - app.Listen(":8080") + // POST: https://localhost/hello + // with request data: {"name": "John"} + // and expected output: {"message": "Hello John"} + app.Run(iris.TLS(":443", "server.crt", "server.key")) } func newApp() *iris.Application { app := iris.New() - mvc.New(app).Handle(&myController{}) + ctrl := &myController{} + // Register gRPC server. + grpcServer := grpc.NewServer() + pb.RegisterGreeterServer(grpcServer, ctrl) + // Register MVC application controller. + mvc.New(app).Handle(ctrl) + + // Serve the gRPC server under the Iris HTTP webserver one, + // the Iris server should ran under TLS (it's a gRPC requirement). + app.WrapRouter(grpcWrapper.New(grpcServer)) return app } type myController struct{} -type loginRequest struct { - Username string `json:"username"` -} - -type loginResponse struct { - Message string `json:"message"` -} - -func (c *myController) PostLogin(ctx context.Context, input loginRequest) (loginResponse, error) { - // [use of ctx to call a gRpc method or a database call...] - return loginResponse{ - Message: input.Username + " logged", - }, nil +// PostHello implements helloworld.GreeterServer +func (c *myController) PostHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { + return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil } diff --git a/_examples/mvc/grpc-compatible/main_test.go b/_examples/mvc/grpc-compatible/main_test.go index 2211b5b76..1b9e7f511 100644 --- a/_examples/mvc/grpc-compatible/main_test.go +++ b/_examples/mvc/grpc-compatible/main_test.go @@ -10,7 +10,7 @@ func TestGRPCCompatible(t *testing.T) { app := newApp() e := httptest.New(t, app) - e.POST("/login").WithJSON(map[string]string{"username": "makis"}).Expect(). + e.POST("/hello").WithJSON(map[string]string{"name": "makis"}).Expect(). Status(httptest.StatusOK). - JSON().Equal(map[string]string{"message": "makis logged"}) + JSON().Equal(map[string]string{"message": "Hello makis"}) } diff --git a/_examples/mvc/grpc-compatible/server.crt b/_examples/mvc/grpc-compatible/server.crt new file mode 100644 index 000000000..c554e9b17 --- /dev/null +++ b/_examples/mvc/grpc-compatible/server.crt @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDkzCCAnugAwIBAgIUZLvkZXRRB1CP8FEjpRslVNRW4HwwDQYJKoZIhvcNAQEL +BQAwWTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDESMBAGA1UEAwwJbG9jYWxob3N0MB4X +DTIwMDMwNzEwNDk0N1oXDTMwMDMwNTEwNDk0N1owWTELMAkGA1UEBhMCQVUxEzAR +BgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5 +IEx0ZDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEA1M0frpMcALlH2BGNNXdUlH3wmJSe9IUkfu/Il5/8SWuMWed39gL0 +Ps70TLi2cklyu5ZDuos6VRQecrkhtPWqcvM67YGM1unIJDVJJJZaiEMTLCv+1srE ++6DZBPZ3vrtA1Z3GH0xzDGyGyTNeQ+yRjdZkjYlalFkswi83qQzbwMx9bba76Tmg +ojfwMbYeoXMmQsIeKuCtpHNYo1uY1fIKnBa9CjOaJfshI+ch9YcFuntRYYS/UrXe +6XTnweFFN4MsSjkxlu7AImT2xW56y9Z64CYLwmT4MDB80FcKS/eRpCyG+KILoZXb +Jj8weneyG0An6gsAkZuN0I6M+XlXxYCzgQIDAQABo1MwUTAdBgNVHQ4EFgQUZLMV +958+SxbRbS3Yjy/9Yyo+FYAwHwYDVR0jBBgwFoAUZLMV958+SxbRbS3Yjy/9Yyo+ +FYAwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEANNSkFO6bxt8f +b7ZoNXYdBBopwx6o9e8uMLlWP1Wv3l0AWdn5WBlTj5ZoS90lKPEvLKO+BI096fwc +lC1P073k3mbXz0fQ/zyyz+7xn6h5FCe66LXU8AhpewolkIogSGwx4NT7lwIYpJ8T +BQXRtNtP3dH9w8iOpFECQIcLCMBamM1UGithrZRNmzYomFMnQYUz7A41eyXyTZ80 +IE5NbwVmd2XYpwrfqror6wkE5Psp3Fb7flKgMT1bU1ugmojIQEmFAYSUTSI7aNmT +W1XenU5tvCmSUnUgUW/vxj8u6W5SP5Lr0jirKT6WUON8lo5C/uWjzkX5Ij6J63JI +w0xukwlSLg== +-----END CERTIFICATE----- diff --git a/_examples/mvc/grpc-compatible/server.key b/_examples/mvc/grpc-compatible/server.key new file mode 100644 index 000000000..af79c0d12 --- /dev/null +++ b/_examples/mvc/grpc-compatible/server.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEA1M0frpMcALlH2BGNNXdUlH3wmJSe9IUkfu/Il5/8SWuMWed3 +9gL0Ps70TLi2cklyu5ZDuos6VRQecrkhtPWqcvM67YGM1unIJDVJJJZaiEMTLCv+ +1srE+6DZBPZ3vrtA1Z3GH0xzDGyGyTNeQ+yRjdZkjYlalFkswi83qQzbwMx9bba7 +6TmgojfwMbYeoXMmQsIeKuCtpHNYo1uY1fIKnBa9CjOaJfshI+ch9YcFuntRYYS/ +UrXe6XTnweFFN4MsSjkxlu7AImT2xW56y9Z64CYLwmT4MDB80FcKS/eRpCyG+KIL +oZXbJj8weneyG0An6gsAkZuN0I6M+XlXxYCzgQIDAQABAoIBAQCY12d8/L4tKuaW +Iy0YDMhcCwSmooB0wbhPz6t0c/1BQpTA8gZwVPjWr9A51qV7+pMEds3Yiy1vdA7W +eW/jSFuPSnG1qsnchncwwnDxbWhC3GJF5KeZ4HORA5s7/EZPYLEVfMeTLVaowr4g +ftuiz6RPioAYRGIhkNcb9cv1iH3BwA7B5D1T+qnOcxgrc4pK5Ecle9NyImU5q002 +vMh3zGuHz+H4zY66oOTplQ5gDONXkEGXCKIKczeFUMUiTVhQwEn/MYHmc+Gm2UVE +S29Is4/DdxCt3x2CRdC/2tsUK20azT51vzKs6qZ/Zvu4smOeov7KJ3Yedye62Dvx +SMrnVwJRAoGBAOovi0Mq1JYPUFBztSza9IiaKXgf9KVE34fPa41aSiLsqQIoiXel +My/LXmrjAKtUiusqUscC+KD+PvR926ceEyObE0lqYuE5MH3XYn25KF35RibD3qhv +Fd57GrgXVuTuB7Rqi8bvmgq/aTSSeFjNF1grojGvSHOb/i1LW8+9jiO1AoGBAOif +o+ndgkkpGloQv34Lko8YZyySaLoQDSrtyCmcE3DGTRVTtuVxZbU8ZRp726km6dQg +w+XbnlF07j7S3S2jvkIx1a/q3DhOe50uMlgEMUtvLtcgTKeqxBL0WWg1wZDWZI5R +Km1JzNl9QxN5MOMkD7XHdTZLO8wDwhr7ggp9xQgdAoGAXMOIfoqwuuBGCBhNY/83 +bgTi+FpwJicqBDn9eHiTdVIZgGleSq59oCkGtYBF+5f5jz2snHho1BziAyb3ozMe +kbQT57jkgiKNOsvej76QZukfCKv9vuqB1yccZl+YZAaFtsmdpKe0dR1tJw397e8P +mDVwgg3UvTbFcFuxepCzhSECgYBl/rEA9nWMnHAIc3Vyz6IoCbwbJ+qxQh5z5yQv +UlaXyOq9YiI8QdcleuCdlxb9+KjnsKIUI5IsBwf7FbuSqkvefDlEU8bRDWBXz4yV +WOlAOPShsHDLxy0HXonhDkjbt5UJbX8bwhMGfUyuuiF8RjB5NIYpEx2Z2z/9Uq92 +6CQ+5QKBgFZemvsuHfuAmEeHS0YfEs47IJIC1GtzfmJXT6w05wPKhMQbB+89HBlJ +Qbn1fG8B3hye6VCRAXk7B7w/FIPCeGUu4TQpoBzmtkH9LC8q09CPCxDISY64MQ1a +fJ2xUWbJbEQv799eTyxIXMG7+L+WYbKrZaiQzB2G/36ID1h7wCXi +-----END RSA PRIVATE KEY----- diff --git a/_examples/mvc/grpc-compatible/server.keys.md b/_examples/mvc/grpc-compatible/server.keys.md new file mode 100644 index 000000000..2205e31a4 --- /dev/null +++ b/_examples/mvc/grpc-compatible/server.keys.md @@ -0,0 +1,4 @@ +```sh +$ openssl genrsa -out server.key 2048 +$ openssl req -new -x509 -sha256 -key server.key -out server.crt -days 3650 +``` diff --git a/middleware/grpc/grpc.go b/middleware/grpc/grpc.go index 504b8a9ca..b073fdf1e 100644 --- a/middleware/grpc/grpc.go +++ b/middleware/grpc/grpc.go @@ -20,11 +20,11 @@ import ( // app.WrapRouter(grpcWrapper.New(grpcServer)) func New(grpcServer http.Handler) router.WrapperFunc { return func(w http.ResponseWriter, r *http.Request, mux http.HandlerFunc) { - if r.ProtoMajor == 2 && strings.HasPrefix( - r.Header.Get("Content-Type"), "application/grpc") { + if r.ProtoMajor == 2 && strings.HasPrefix(r.Header.Get("Content-Type"), "application/grpc") { grpcServer.ServeHTTP(w, r) - } else { - mux.ServeHTTP(w, r) + return } + + mux.ServeHTTP(w, r) } }