func (s *server) handle(trans transport.Transport, req_ tmsg.Request) { req := mercury.FromTyphonRequest(req_) req, rsp := s.applyRequestMiddleware(req) if rsp == nil { if ep, ok := s.Endpoint(req.Endpoint()); !ok { log.Warnf("[Mercury:Server] Received request %s for unknown endpoint %s", req.Id(), req.Endpoint()) rsp = ErrorResponse(req, errEndpointNotFound) } else { if rsp_, err := ep.Handle(req); err != nil { log.Debugf("[Mercury:Server] Got error from endpoint %s for request %s: %v", ep.Name, req.Id(), err) rsp = ErrorResponse(req, err) // @todo happy to remove this verbose logging once we have tracing... For now it will allow us to debug things log.Debugf("[Mercury:Server] Full request: %+v", req.Body()) log.Debugf("[Mercury:Server] Full error: %+v", rsp.Body()) } else if rsp_ == nil { rsp = req.Response(nil) } else { rsp = rsp_ } } } rsp = s.applyResponseMiddleware(rsp, req) if rsp != nil { trans.Respond(req, rsp) } }
func (s *server) handle(trans transport.Transport, req_ tmsg.Request) { req := mercury.FromTyphonRequest(req_) req, rsp := s.applyRequestMiddleware(req) if rsp == nil { if ep, ok := s.Endpoint(req.Endpoint()); !ok { log.Warn(req, "[Mercury:Server] Received request %s for unknown endpoint %s", req.Id(), req.Endpoint()) rsp = ErrorResponse(req, errEndpointNotFound) } else { if rsp_, err := ep.Handle(req); err != nil { rsp = ErrorResponse(req, err) log.Info(req, "[Mercury:Server] Error from endpoint %s for %v: %v", ep.Name, req, err, map[string]string{ "request_payload": string(req.Payload())}) } else if rsp_ == nil { rsp = req.Response(nil) } else { rsp = rsp_ } } } rsp = s.applyResponseMiddleware(rsp, req) if rsp != nil { trans.Respond(req, rsp) } }
func (suite *clientSuite) SetupSuite() { trans := suite.TransF() select { case <-trans.Ready(): case <-time.After(2 * time.Second): panic("transport not ready") } suite.trans = trans // Add a listener that responds blindly to all messages inboundChan := make(chan tmsg.Request, 10) trans.Listen(testServiceName, inboundChan) go func() { for { select { case _req := <-inboundChan: req := mercury.FromTyphonRequest(_req) switch req.Endpoint() { case "timeout": continue case "invalid-payload": // Wrong proto here rsp := req.Response(nil) rsp.SetPayload([]byte("†HÎß ßHøܬ∂ÑT ∑ø®K")) suite.Require().NoError(trans.Respond(req, rsp)) case "error": err := terrors.BadRequest("", "foo bar", nil) rsp := req.Response(terrors.Marshal(err)) rsp.SetHeaders(req.Headers()) rsp.SetIsError(true) suite.Require().NoError(trans.Respond(req, rsp)) case "bulls--t": rsp := req.Response(map[string]string{}) rsp.SetHeaders(req.Headers()) rsp.SetHeader(marshaling.ContentTypeHeader, "application/bulls--t") suite.Require().NoError(trans.Respond(req, rsp)) default: rsp := req.Response(&testproto.DummyResponse{ Pong: "Pong"}) rsp.SetHeaders(req.Headers()) suite.Require().NoError(tmsg.JSONMarshaler().MarshalBody(rsp)) suite.Require().NoError(trans.Respond(req, rsp)) } case <-trans.Tomb().Dying(): return } } }() }