202 lines
5.3 KiB
C
202 lines
5.3 KiB
C
|
// Copyright 2023 The NATS Authors
|
||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
// you may not use this file except in compliance with the License.
|
||
|
// You may obtain a copy of the License at
|
||
|
//
|
||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||
|
//
|
||
|
// Unless required by applicable law or agreed to in writing, software
|
||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
// See the License for the specific language governing permissions and
|
||
|
// limitations under the License.
|
||
|
|
||
|
#include "microp.h"
|
||
|
|
||
|
microError *
|
||
|
microRequest_Respond(microRequest *req, const char *data, size_t len)
|
||
|
{
|
||
|
return microRequest_RespondCustom(req, NULL, data, len);
|
||
|
}
|
||
|
|
||
|
microError *
|
||
|
microRequest_RespondError(microRequest *req, microError *err)
|
||
|
{
|
||
|
return microRequest_RespondCustom(req, err, NULL, 0);
|
||
|
}
|
||
|
|
||
|
microError *
|
||
|
microRequest_RespondCustom(microRequest *req, microError *service_error, const char *data, size_t len)
|
||
|
{
|
||
|
natsMsg *msg = NULL;
|
||
|
natsStatus s = NATS_OK;
|
||
|
char buf[64];
|
||
|
|
||
|
if ((req == NULL) || (req->Message == NULL) || (req->Message->sub == NULL) || (req->Message->sub->conn == NULL))
|
||
|
{
|
||
|
s = NATS_INVALID_ARG;
|
||
|
}
|
||
|
if (s == NATS_OK)
|
||
|
{
|
||
|
s = natsMsg_Create(&msg, natsMsg_GetReply(req->Message), NULL, data, (int)len);
|
||
|
}
|
||
|
if ((s == NATS_OK) && (service_error != NULL))
|
||
|
{
|
||
|
micro_update_last_error(req->Endpoint, service_error);
|
||
|
if (service_error->status != NATS_OK)
|
||
|
{
|
||
|
s = natsMsgHeader_Set(msg, MICRO_STATUS_HDR, natsStatus_GetText(service_error->status));
|
||
|
}
|
||
|
if (s == NATS_OK)
|
||
|
{
|
||
|
s = natsMsgHeader_Set(msg, MICRO_ERROR_HDR, service_error->message);
|
||
|
}
|
||
|
if (s == NATS_OK)
|
||
|
{
|
||
|
snprintf(buf, sizeof(buf), "%u", service_error->code);
|
||
|
s = natsMsgHeader_Set(msg, MICRO_ERROR_CODE_HDR, buf);
|
||
|
}
|
||
|
}
|
||
|
if (s == NATS_OK)
|
||
|
{
|
||
|
s = natsConnection_PublishMsg(req->Message->sub->conn, msg);
|
||
|
}
|
||
|
|
||
|
microError_Destroy(service_error);
|
||
|
natsMsg_Destroy(msg);
|
||
|
return microError_Wrapf(
|
||
|
micro_ErrorFromStatus(s),
|
||
|
"microRequest_RespondErrorWithData failed");
|
||
|
}
|
||
|
|
||
|
microError *
|
||
|
microRequest_AddHeader(microRequest *req, const char *key, const char *value)
|
||
|
{
|
||
|
return micro_ErrorFromStatus(
|
||
|
natsMsgHeader_Add(microRequest_GetMsg(req), key, value));
|
||
|
}
|
||
|
|
||
|
microError *
|
||
|
microRequest_DeleteHeader(microRequest *req, const char *key)
|
||
|
{
|
||
|
return micro_ErrorFromStatus(
|
||
|
natsMsgHeader_Delete(microRequest_GetMsg(req), key));
|
||
|
}
|
||
|
|
||
|
natsConnection *
|
||
|
microRequest_GetConnection(microRequest *req)
|
||
|
{
|
||
|
return ((req != NULL) && (req->Service != NULL)) ? req->Service->nc : NULL;
|
||
|
}
|
||
|
|
||
|
const char *
|
||
|
microRequest_GetData(microRequest *req)
|
||
|
{
|
||
|
return natsMsg_GetData(microRequest_GetMsg(req));
|
||
|
}
|
||
|
|
||
|
int microRequest_GetDataLength(microRequest *req)
|
||
|
{
|
||
|
return natsMsg_GetDataLength(microRequest_GetMsg(req));
|
||
|
}
|
||
|
|
||
|
microEndpoint *
|
||
|
microRequest_GetEndpoint(microRequest *req)
|
||
|
{
|
||
|
return (req != NULL) ? req->Endpoint : NULL;
|
||
|
}
|
||
|
|
||
|
microError *
|
||
|
microRequest_GetHeaderKeys(microRequest *req, const char ***keys, int *count)
|
||
|
{
|
||
|
return micro_ErrorFromStatus(
|
||
|
natsMsgHeader_Keys(microRequest_GetMsg(req), keys, count));
|
||
|
}
|
||
|
|
||
|
microError *
|
||
|
microRequest_GetHeaderValue(microRequest *req, const char *key, const char **value)
|
||
|
{
|
||
|
return micro_ErrorFromStatus(
|
||
|
natsMsgHeader_Get(microRequest_GetMsg(req), key, value));
|
||
|
}
|
||
|
|
||
|
microError *
|
||
|
microRequest_GetHeaderValues(microRequest *req, const char *key, const char ***values, int *count)
|
||
|
{
|
||
|
return micro_ErrorFromStatus(
|
||
|
natsMsgHeader_Values(microRequest_GetMsg(req), key, values, count));
|
||
|
}
|
||
|
|
||
|
natsMsg *
|
||
|
microRequest_GetMsg(microRequest *req)
|
||
|
{
|
||
|
return (req != NULL) ? req->Message : NULL;
|
||
|
}
|
||
|
|
||
|
const char *
|
||
|
microRequest_GetReply(microRequest *req)
|
||
|
{
|
||
|
return natsMsg_GetReply(microRequest_GetMsg(req));
|
||
|
}
|
||
|
|
||
|
const char *microRequest_GetSubject(microRequest *req)
|
||
|
{
|
||
|
return natsMsg_GetSubject(microRequest_GetMsg(req));
|
||
|
}
|
||
|
|
||
|
void *microRequest_GetServiceState(microRequest *req)
|
||
|
{
|
||
|
if ((req == NULL) || (req->Service == NULL) || (req->Service->cfg == NULL))
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
return req->Service->cfg->State;
|
||
|
}
|
||
|
|
||
|
void *microRequest_GetEndpointState(microRequest *req)
|
||
|
{
|
||
|
if ((req == NULL) || (req->Endpoint == NULL) || (req->Endpoint->config == NULL))
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
return req->Endpoint->config->State;
|
||
|
}
|
||
|
|
||
|
microError *
|
||
|
microRequest_SetHeader(microRequest *req, const char *key, const char *value)
|
||
|
{
|
||
|
return micro_ErrorFromStatus(
|
||
|
natsMsgHeader_Set(microRequest_GetMsg(req), key, value));
|
||
|
}
|
||
|
|
||
|
microService *
|
||
|
microRequest_GetService(microRequest *req)
|
||
|
{
|
||
|
return (req != NULL) ? req->Service : NULL;
|
||
|
}
|
||
|
|
||
|
void micro_free_request(microRequest *req)
|
||
|
{
|
||
|
NATS_FREE(req);
|
||
|
}
|
||
|
|
||
|
microError *
|
||
|
micro_new_request(microRequest **new_request, microService *m, microEndpoint *ep, natsMsg *msg)
|
||
|
{
|
||
|
microRequest *req = NULL;
|
||
|
|
||
|
// endpoint is optional, service and message references are required.
|
||
|
if ((new_request == NULL) || (m == NULL) || (msg == NULL))
|
||
|
return micro_ErrorInvalidArg;
|
||
|
|
||
|
req = (microRequest *)NATS_CALLOC(1, sizeof(microRequest));
|
||
|
if (req == NULL)
|
||
|
return micro_ErrorOutOfMemory;
|
||
|
|
||
|
req->Message = msg;
|
||
|
req->Service = m;
|
||
|
req->Endpoint = ep;
|
||
|
*new_request = req;
|
||
|
return NULL;
|
||
|
}
|