mirror of
https://github.com/kataras/iris.git
synced 2025-02-13 04:26:18 +01:00
add a full gRPC example as previously requested at: https://github.com/kataras/iris/issues/1449
Former-commit-id: 0cb5121e7d44644f7f0eb34597ff34274157fe95
This commit is contained in:
parent
dd18dc9ee8
commit
aea836efc7
47
_examples/mvc/grpc-compatible/grpc-client/main.go
Normal file
47
_examples/mvc/grpc-compatible/grpc-client/main.go
Normal file
|
@ -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())
|
||||||
|
}
|
3
_examples/mvc/grpc-compatible/helloworld/README.md
Normal file
3
_examples/mvc/grpc-compatible/helloworld/README.md
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# Helloworld gRPC Example
|
||||||
|
|
||||||
|
https://github.com/grpc/grpc-go/tree/master/examples/helloworld
|
210
_examples/mvc/grpc-compatible/helloworld/helloworld.pb.go
Normal file
210
_examples/mvc/grpc-compatible/helloworld/helloworld.pb.go
Normal file
|
@ -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",
|
||||||
|
}
|
23
_examples/mvc/grpc-compatible/helloworld/helloworld.proto
Normal file
23
_examples/mvc/grpc-compatible/helloworld/helloworld.proto
Normal file
|
@ -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;
|
||||||
|
}
|
50
_examples/mvc/grpc-compatible/http-client/main.go
Normal file
50
_examples/mvc/grpc-compatible/http-client/main.go
Normal file
|
@ -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())
|
||||||
|
}
|
|
@ -3,8 +3,13 @@ package main
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
|
pb "github.com/kataras/iris/v12/_examples/mvc/grpc-compatible/helloworld"
|
||||||
|
|
||||||
"github.com/kataras/iris/v12"
|
"github.com/kataras/iris/v12"
|
||||||
|
grpcWrapper "github.com/kataras/iris/v12/middleware/grpc"
|
||||||
"github.com/kataras/iris/v12/mvc"
|
"github.com/kataras/iris/v12/mvc"
|
||||||
|
|
||||||
|
"google.golang.org/grpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
// See https://github.com/kataras/iris/issues/1449
|
// See https://github.com/kataras/iris/issues/1449
|
||||||
|
@ -18,33 +23,32 @@ func main() {
|
||||||
app := newApp()
|
app := newApp()
|
||||||
app.Logger().SetLevel("debug")
|
app.Logger().SetLevel("debug")
|
||||||
|
|
||||||
// POST: http://localhost:8080/login
|
// POST: https://localhost/hello
|
||||||
// with request data: {"username": "makis"}
|
// with request data: {"name": "John"}
|
||||||
// and expected output: {"message": "makis logged"}
|
// and expected output: {"message": "Hello John"}
|
||||||
app.Listen(":8080")
|
app.Run(iris.TLS(":443", "server.crt", "server.key"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func newApp() *iris.Application {
|
func newApp() *iris.Application {
|
||||||
app := iris.New()
|
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
|
return app
|
||||||
}
|
}
|
||||||
|
|
||||||
type myController struct{}
|
type myController struct{}
|
||||||
|
|
||||||
type loginRequest struct {
|
// PostHello implements helloworld.GreeterServer
|
||||||
Username string `json:"username"`
|
func (c *myController) PostHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
|
||||||
}
|
return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
|
||||||
|
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ func TestGRPCCompatible(t *testing.T) {
|
||||||
app := newApp()
|
app := newApp()
|
||||||
|
|
||||||
e := httptest.New(t, app)
|
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).
|
Status(httptest.StatusOK).
|
||||||
JSON().Equal(map[string]string{"message": "makis logged"})
|
JSON().Equal(map[string]string{"message": "Hello makis"})
|
||||||
}
|
}
|
||||||
|
|
22
_examples/mvc/grpc-compatible/server.crt
Normal file
22
_examples/mvc/grpc-compatible/server.crt
Normal file
|
@ -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-----
|
27
_examples/mvc/grpc-compatible/server.key
Normal file
27
_examples/mvc/grpc-compatible/server.key
Normal file
|
@ -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-----
|
4
_examples/mvc/grpc-compatible/server.keys.md
Normal file
4
_examples/mvc/grpc-compatible/server.keys.md
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
```sh
|
||||||
|
$ openssl genrsa -out server.key 2048
|
||||||
|
$ openssl req -new -x509 -sha256 -key server.key -out server.crt -days 3650
|
||||||
|
```
|
|
@ -20,11 +20,11 @@ import (
|
||||||
// app.WrapRouter(grpcWrapper.New(grpcServer))
|
// app.WrapRouter(grpcWrapper.New(grpcServer))
|
||||||
func New(grpcServer http.Handler) router.WrapperFunc {
|
func New(grpcServer http.Handler) router.WrapperFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request, mux http.HandlerFunc) {
|
return func(w http.ResponseWriter, r *http.Request, mux http.HandlerFunc) {
|
||||||
if r.ProtoMajor == 2 && strings.HasPrefix(
|
if r.ProtoMajor == 2 && strings.HasPrefix(r.Header.Get("Content-Type"), "application/grpc") {
|
||||||
r.Header.Get("Content-Type"), "application/grpc") {
|
|
||||||
grpcServer.ServeHTTP(w, r)
|
grpcServer.ServeHTTP(w, r)
|
||||||
} else {
|
return
|
||||||
|
}
|
||||||
|
|
||||||
mux.ServeHTTP(w, r)
|
mux.ServeHTTP(w, r)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user