From 06b8871a9c512e1efa667822ab8fb8341983022d Mon Sep 17 00:00:00 2001 From: geek Date: Fri, 13 Apr 2018 16:18:50 +0900 Subject: [PATCH] ing --- servlet/data-servlet.go | 166 +++++++++++++++++++++++++--------------- 1 file changed, 105 insertions(+), 61 deletions(-) diff --git a/servlet/data-servlet.go b/servlet/data-servlet.go index 75e9304..a9e4ec3 100644 --- a/servlet/data-servlet.go +++ b/servlet/data-servlet.go @@ -1,66 +1,110 @@ package servlet import ( - //crpj "git.loafle.net/commons/rpc-go/protocol/json" - //"git.loafle.net/commons/server-go" - // - //"log" - //"github.com/valyala/fasthttp" - //"crypto/rsa" - //"sync" + "fmt" + "encoding/json" + "context" + "crypto/rsa" + "sync" + + "github.com/valyala/fasthttp" + + "git.loafle.net/commons/server-go" + "git.loafle.net/commons/server-go/socket" + "git.loafle.net/overflow/gateway/external/grpc" + og "git.loafle.net/overflow/gateway" + ocpc "git.loafle.net/overflow/commons-go/probe/constants" + ocpm "git.loafle.net/overflow/commons-go/probe/model" + ogrs "git.loafle.net/overflow/gateway_rpc/servlet" ) -//type WebappServlet interface { -// ogrs.RPCServlet -//} -// -//type WebappServlets struct { -// ogrs.RPCServlets -// -// VerifyKey *rsa.PublicKey -// SignKey *rsa.PrivateKey -// -// connections sync.Map -//} -// -//func init() { -// // member RSA file read -//} -// -//func (s *RPCServlet) Handshake(servletCtx server.ServletCtx, ctx *fasthttp.RequestCtx) (*fasthttp.ResponseHeader, error) { -// // probe key extraction -// -// return nil, nil -//} -// -//func (s *RPCServlet) Handle( -// servletCtx server.ServletCtx, -// stopChan <-chan struct{}, -// doneChan chan<- struct{}, -// readChan <-chan []byte, -// writeChan chan<- []byte ) { -// defer func() { -// doneChan <- struct{}{} -// }() -// -// sc := crpj.NewServerCodec() -// -// for { -// select { -// case msg, ok := <-readChan: -// if !ok { -// return -// } -// // grpc exec method call -// src, _ := sc.NewRequest(msg) -// m := src.Method() -// p,_ := src.Params() -// log.Println("METHOD : %s", m) -// log.Println("Params : %s", p) -// case <-stopChan: -// return -// } -// -// } -// -//} \ No newline at end of file +type DataServlet interface { + ogrs.RPCServlet +} + +type DataServlets struct { + ogrs.RPCServlets + + VerifyKey *rsa.PublicKey + SignKey *rsa.PrivateKey + + connections sync.Map +} + +func (s *DataServlets) Init(serverCtx server.ServerCtx) error { + if err := s.RPCServlets.Init(serverCtx); nil != err { + return err + } + + return nil +} + +func (s *DataServlets) OnStart(serverCtx server.ServerCtx) error { + if err := s.RPCServlets.OnStart(serverCtx); nil != err { + return err + } + + return nil +} + +func (s *DataServlets) OnStop(serverCtx server.ServerCtx) { + + s.RPCServlets.OnStop(serverCtx) +} + +func (s *DataServlets) Destroy(serverCtx server.ServerCtx) { + + s.RPCServlets.Destroy(serverCtx) +} + +func (s *DataServlets) Handshake(servletCtx server.ServletCtx, ctx *fasthttp.RequestCtx) (*fasthttp.ResponseHeader, error) { + // probe key extraction + bMethod := ctx.Request.Header.Peek(ocpc.HTTPRequestHeaderKey_Probe_Method) + if nil == bMethod { + return nil, fmt.Errorf("Unexpected probe method: %v", bMethod) + } + + method := string(bMethod) + + switch method { + case ocpc.HTTPRequestHeaderValue_Probe_Method_Connect: + default: + return nil, fmt.Errorf("Unexpected noauth probe httpRequestHeaderValue: %v", method) + } + + bProbeKey := ctx.Request.Header.Peek(ocpc.HTTPRequestHeaderKey_Probe_ProbeKey) + if nil == bProbeKey { + return nil, fmt.Errorf("Unexpected probe key : %v", bProbeKey) + } + + probeKey := string(bProbeKey) + + grpcCTX := context.Background() + r, err := grpc.Exec(grpcCTX, "ProbeService.readByProbeKey", probeKey) + if nil != err { + return nil, fmt.Errorf("grpc call Error: %s", err.Error()) + } + + probe := ocpm.Probe{} + err = json.Unmarshal([]byte(r), probe) + if nil != err { + return nil, fmt.Errorf("grpc result unMarshal Error: %s", err.Error()) + } + + extHeader := &fasthttp.ResponseHeader{} + extHeader.Add(ocpc.HTTPResponseHeaderKey_Probe_SetEncryptionKey, probe.EncryptionKey) + + servletCtx.SetAttribute(og.SessionIDKey, probe.ProbeKey) + servletCtx.SetAttribute(og.SessionClientTypeKey, og.PROBE) + servletCtx.SetAttribute(og.SessionTargetIDKey, probe.ProbeKey) + + return extHeader, nil +} + +func (s *DataServlets) OnConnect(servletCtx server.ServletCtx, conn socket.Conn) { + s.RPCServlets.OnConnect(servletCtx, conn) +} + +func (s *DataServlets) OnDisconnect(servletCtx server.ServletCtx) { + s.RPCServlets.OnDisconnect(servletCtx) +} \ No newline at end of file