func Execute()

in lambda/rapidcore/standalone/executeHandler.go [14:63]


func Execute(w http.ResponseWriter, r *http.Request, sandbox rapidcore.Sandbox) {

	invokePayload := &interop.Invoke{
		TraceID:         r.Header.Get("X-Amzn-Trace-Id"),
		LambdaSegmentID: r.Header.Get("X-Amzn-Segment-Id"),
		Payload:         r.Body,
		CorrelationID:   "invokeCorrelationID",
	}

	// If we write to 'w' directly and waitUntilRelease fails, we won't be able to propagate error anymore
	invokeResp := &ResponseWriterProxy{}
	if err := sandbox.Invoke(invokeResp, invokePayload); err != nil {
		switch err {
		// Reserve errors:
		case rapidcore.ErrAlreadyReserved:
			log.Errorf("Failed to reserve: %s", err)
			w.WriteHeader(400)
		case rapidcore.ErrInternalServerError:
			w.WriteHeader(http.StatusInternalServerError)

		// Invoke errors:
		case rapidcore.ErrNotReserved, rapidcore.ErrAlreadyReplied, rapidcore.ErrAlreadyInvocating:
			log.Errorf("Failed to set reply stream: %s", err)
			w.WriteHeader(400)

		case rapidcore.ErrInvokeResponseAlreadyWritten:
			return
		case rapidcore.ErrInvokeTimeout:
			w.WriteHeader(http.StatusGatewayTimeout)

		// DONE failures:
		case rapidcore.ErrTerminated, rapidcore.ErrInitDoneFailed, rapidcore.ErrInvokeDoneFailed:
			copyHeaders(invokeResp, w)
			w.WriteHeader(DoneFailedHTTPCode)
			w.Write(invokeResp.Body)
			return
		// Reservation canceled errors
		case rapidcore.ErrReserveReservationDone, rapidcore.ErrInvokeReservationDone, rapidcore.ErrReleaseReservationDone:
			w.WriteHeader(http.StatusGatewayTimeout)
		}

		return
	}

	copyHeaders(invokeResp, w)
	if invokeResp.StatusCode != 0 {
		w.WriteHeader(invokeResp.StatusCode)
	}
	w.Write(invokeResp.Body)
}