JeffDeCola/my-go-examples

View on GitHub
inter-process-communication-ipc/message-passing/operating-system/synchronous/grpc-os/rpcserver/rpcserver.go

Summary

Maintainability
A
0 mins
Test Coverage
package rpcserver

import (
    "metasolserver/pbmessage"
    "net"

    log "github.com/sirupsen/logrus"
    "golang.org/x/net/context"

    "strings"

    "google.golang.org/grpc"
    "google.golang.org/grpc/peer"
)

const safeWebServerIP = "76.168.114.206"

type chatServer struct {
    pbmessage.UnimplementedGreeterServer
}

func PrintHi() {
    log.Infof("rpcserver: Hi, I'm in rpcserver")
}

func StartRPCServer() {

    // TCP - LISTEN ON TCP PORT 9000
    log.Info("rpcserver: TCP - Listening on tcp port 9000")
    tcpListen, err := net.Listen("tcp", ":3334")
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    log.Infof("rpcserver: TCP Server listening at %v", tcpListen.Addr())

    // gRPC SERVER - START
    log.Info("rpcserver: gRPC server - Start")
    grpcServer := grpc.NewServer()

    // CONNECT - PROTOBUF gRPC FUNCTIONS WITH gRPC SERVER
    log.Info("rpcserver: CONNECT - Register protobuf gRPC Functions with gRPC Server")
    pbmessage.RegisterGreeterServer(grpcServer, &chatServer{})

    // ATTACH - gRPC SERVER TO TCP Port (This will block)
    log.Info("rpcserver: Attach - gRPC erver to TCP Port")
    err = grpcServer.Serve(tcpListen)
    if err != nil {
        log.Fatalf("failed to serve: %s", err)
    }

}

func (s *chatServer) SayHello(ctx context.Context, in *pbmessage.HelloRequestMessage) (*pbmessage.HelloReplyMessage, error) {
    log.Infof("pbmessage: SayHello: Receive message body from client: %s", in.Name)
    // CHECK IP
    if checkIP(ctx) {
        return &pbmessage.HelloReplyMessage{Message: "Hello " + in.Name + "Your IP is blocked"}, nil
    }
    // DO STUFF
    //
    //
    return &pbmessage.HelloReplyMessage{Message: "Hello " + in.Name + "I hope you're having a good day"}, nil
}

func (s *chatServer) SayHelloAgain(ctx context.Context, in *pbmessage.HelloRequestMessage) (*pbmessage.HelloReplyMessage, error) {
    log.Infof("pbmessage: SayHelloAgain: Receive message body from client: %s", in.Name)
    // CHECK IP
    if checkIP(ctx) {
        return &pbmessage.HelloReplyMessage{Message: "Hello " + in.Name + "Your IP is blocked"}, nil
    }
    // DO STUFF
    //
    //
    return &pbmessage.HelloReplyMessage{Message: "Hello again " + in.Name}, nil
}

func checkIP(ctx context.Context) bool {
    p, _ := peer.FromContext(ctx)
    clientAddr := p.Addr.String()
    clientIP := strings.Split(clientAddr, ":")[0]
    log.Infof("rpcserver: Client IP is %v", clientIP)
    if safeWebServerIP == clientIP {
        return false
    }
    return true
}