Пример #1
0
/* 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;
}
Пример #2
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;
}