in lambda/rapi/handler/invocationresponse.go [24:80]
func (h *invocationResponseHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
appCtx := appctx.FromRequest(request)
server := appctx.LoadInteropServer(appCtx)
if server == nil {
log.Panic("Invalid state, cannot access interop server")
}
runtime := h.registrationService.GetRuntime()
if err := runtime.InvocationResponse(); err != nil {
log.Warn(err)
rendering.RenderForbiddenWithTypeMsg(writer, request, rendering.ErrorTypeInvalidStateTransition, StateTransitionFailedForRuntimeMessageFormat,
runtime.GetState().Name(), core.RuntimeInvocationResponseStateName, err)
return
}
invokeID := chi.URLParam(request, "awsrequestid")
responseContentType := request.Header.Get(contentTypeOverrideHeaderName)
if err := server.SendResponse(invokeID, responseContentType, request.Body); err != nil {
switch err := err.(type) {
case *interop.ErrorResponseTooLarge:
if server.SendErrorResponse(invokeID, err.AsInteropError()) != nil {
rendering.RenderInteropError(writer, request, err)
return
}
appctx.StoreErrorResponse(appCtx, err.AsInteropError())
if err := runtime.ResponseSent(); err != nil {
log.Panic(err)
}
rendering.RenderRequestEntityTooLarge(writer, request)
return
case *interop.ErrorResponseTooLargeDI:
// in DirectInvoke case, the (truncated) response is already sent back to the caller
if err := runtime.ResponseSent(); err != nil {
log.Panic(err)
}
rendering.RenderRequestEntityTooLarge(writer, request)
return
default:
rendering.RenderInteropError(writer, request, err)
return
}
}
if err := runtime.ResponseSent(); err != nil {
log.Panic(err)
}
rendering.RenderAccepted(writer, request)
}