/* Compose the body_buffer */ int _body_print(duda_request_t *dr, char *raw, int len, int free) { int ret; struct duda_body_buffer *body_buffer; struct duda_queue_item *item; item = duda_queue_last(&dr->queue_out); if (!item || item->type != DUDA_QTYPE_BODY_BUFFER) { body_buffer = duda_body_buffer_new(); item = duda_queue_item_new(DUDA_QTYPE_BODY_BUFFER); item->data = body_buffer; duda_queue_add(item, &dr->queue_out); } else { body_buffer = item->data; } /* perform realloc if body_write() is called more than body_buffer_size */ if (body_buffer->buf->iov_idx >= body_buffer->size) { ret = duda_body_buffer_expand(body_buffer); if (ret == -1) { return -1; } } /* Link data */ if (free == MK_TRUE) { mk_api->iov_add_entry(body_buffer->buf, raw, len, mk_iov_none, MK_IOV_FREE_BUF); } else { mk_api->iov_add_entry(body_buffer->buf, raw, len, mk_iov_none, MK_IOV_NOT_FREE_BUF); } return 0; }
/* * @METHOD_NAME: sendfile * @METHOD_DESC: It enqueue a filesystem file to be send to the HTTP client as response body. Multiple * files can be enqueued, all of them are send in order. * @METHOD_PARAM: dr the request context information hold by a duda_request_t type * @METHOD_PARAM: path the absolute path of the file to be send. * @METHOD_RETURN: Upon successful completion it returns 0, on error returns -1. */ int duda_response_sendfile(duda_request_t *dr, char *path) { struct duda_sendfile *sf; struct duda_queue_item *item; sf = duda_sendfile_new(path, 0, 0); if (!sf) { return -1; } item = duda_queue_item_new(DUDA_QTYPE_SENDFILE); item->data = sf; duda_queue_add(item, &dr->queue_out); return 0; }