You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
sledge/runtime/src/http_response.c

114 lines
3.7 KiB

#include <http_response.h>
#ifdef USE_HTTP_UVIO
#include <uv.h>
#endif
/***************************************************
* General HTTP Response Functions *
**************************************************/
/**
* Encodes a sandbox's HTTP Response as an array of buffers
* @param sandbox the sandbox containing the HTTP response we want to encode as buffers
* @returns the number of buffers used to store the HTTP Response
*/
int
http_response_encode_as_vector(struct http_response *http_response)
{
int buffer_count = 0;
#ifdef USE_HTTP_UVIO
http_response->bufs[buffer_count] = uv_buf_init(http_response->status, http_response->status_length);
buffer_count++;
for (int i = 0; i < http_response->header_count; i++) {
http_response->bufs[buffer_count] = uv_buf_init(http_response->headers[i].header,
http_response->headers[i].length);
buffer_count++;
}
if (http_response->body) {
http_response->bufs[buffer_count] = uv_buf_init(http_response->body, http_response->body_length);
buffer_count++;
http_response->bufs[buffer_count] = uv_buf_init(http_response->status + http_response->status_length
- 2,
2); /* for crlf */
buffer_count++;
}
#else
http_response->bufs[buffer_count].iov_base = http_response->status;
http_response->bufs[buffer_count].iov_len = http_response->status_length;
buffer_count++;
for (int i = 0; i < http_response->header_count; i++) {
http_response->bufs[buffer_count].iov_base = http_response->headers[i].header;
http_response->bufs[buffer_count].iov_len = http_response->headers[i].length;
buffer_count++;
}
if (http_response->body) {
http_response->bufs[buffer_count].iov_base = http_response->body;
http_response->bufs[buffer_count].iov_len = http_response->body_length;
buffer_count++;
http_response->bufs[buffer_count].iov_base = http_response->status + http_response->status_length - 2;
http_response->bufs[buffer_count].iov_len = 2;
buffer_count++;
}
#endif
return buffer_count;
}
/**
* Set an HTTP Response Body on a Sandbox
* @param sandbox the sandbox we want to set the request header on
* @param body string of the body that we want to set
* @param length the length of the header string
* @returns 0 (abends program in case of error)
*/
int
http_response_set_body(struct http_response *http_response, char *body, int length)
{
// assert(length <= sandbox->module->max_response_size);
http_response->body = body;
http_response->body_length = length;
return 0;
}
/**
* Append a header to the HTTP Response of a Sandbox
* @param sandbox the sandbox we want to set the request header on
* @param header string containing the header that we want to append
* @param length the length of the header string
* @returns 0 (abends program in case of error)
*/
int
http_response_set_header(struct http_response *http_response, char *header, int length)
{
assert(http_response->header_count < HTTP_MAX_HEADER_COUNT);
http_response->header_count++;
http_response->headers[http_response->header_count - 1].header = header;
http_response->headers[http_response->header_count - 1].length = length;
return 0;
}
/**
* Set an HTTP Response Status on a Sandbox
* @param sandbox the sandbox we want to set the request status on
* @param status string of the status we want to set
* @param length the length of the status
* @returns 0 (abends program in case of error)
*/
int
http_response_set_status(struct http_response *http_response, char *status, int length)
{
http_response->status = status;
http_response->status_length = length;
return 0;
}