func ReceiveDirectInvoke()

in lambda/core/directinvoke/directinvoke.go [47:100]


func ReceiveDirectInvoke(w http.ResponseWriter, r *http.Request, token interop.Token) (*interop.Invoke, error) {
	w.Header().Set("Trailer", EndOfResponseTrailer)

	custHeaders := CustomerHeaders{}
	if err := custHeaders.Load(r.Header.Get(CustomerHeadersHeader)); err != nil {
		renderBadRequest(w, r, interop.ErrMalformedCustomerHeaders.Error())
		return nil, interop.ErrMalformedCustomerHeaders
	}

	now := metering.Monotime()
	inv := &interop.Invoke{
		ID:                    r.Header.Get(InvokeIDHeader),
		ReservationToken:      chi.URLParam(r, "reservationtoken"),
		InvokedFunctionArn:    r.Header.Get(InvokedFunctionArnHeader),
		VersionID:             r.Header.Get(VersionIDHeader),
		ContentType:           r.Header.Get(ContentTypeHeader),
		CognitoIdentityID:     custHeaders.CognitoIdentityID,
		CognitoIdentityPoolID: custHeaders.CognitoIdentityPoolID,
		TraceID:               token.TraceID,
		LambdaSegmentID:       token.LambdaSegmentID,
		ClientContext:         custHeaders.ClientContext,
		Payload:               r.Body,
		CorrelationID:         "invokeCorrelationID",
		DeadlineNs:            fmt.Sprintf("%d", now+token.FunctionTimeout.Nanoseconds()),
		NeedDebugLogs:         token.NeedDebugLogs,
		InvokeReceivedTime:    now,
	}

	if inv.ID != token.InvokeID {
		renderBadRequest(w, r, interop.ErrInvalidInvokeID.Error())
		return nil, interop.ErrInvalidInvokeID
	}

	if inv.ReservationToken != token.ReservationToken {
		renderBadRequest(w, r, interop.ErrInvalidReservationToken.Error())
		return nil, interop.ErrInvalidReservationToken
	}

	if inv.VersionID != token.VersionID {
		renderBadRequest(w, r, interop.ErrInvalidFunctionVersion.Error())
		return nil, interop.ErrInvalidFunctionVersion
	}

	if now > token.InvackDeadlineNs {
		renderBadRequest(w, r, interop.ErrReservationExpired.Error())
		return nil, interop.ErrReservationExpired
	}

	w.Header().Set(VersionIDHeader, token.VersionID)
	w.Header().Set(ReservationTokenHeader, token.ReservationToken)
	w.Header().Set(InvokeIDHeader, token.InvokeID)

	return inv, nil
}