Annotation of embedaddon/lighttpd/src/http_chunk.c, revision 1.1
1.1 ! misho 1: /**
! 2: * the HTTP chunk-API
! 3: *
! 4: *
! 5: */
! 6:
! 7: #include "server.h"
! 8: #include "chunk.h"
! 9: #include "http_chunk.h"
! 10: #include "log.h"
! 11:
! 12: #include <sys/types.h>
! 13: #include <sys/stat.h>
! 14:
! 15: #include <stdlib.h>
! 16: #include <fcntl.h>
! 17: #include <unistd.h>
! 18:
! 19: #include <stdio.h>
! 20: #include <errno.h>
! 21: #include <string.h>
! 22:
! 23: static int http_chunk_append_len(server *srv, connection *con, size_t len) {
! 24: size_t i, olen = len, j;
! 25: buffer *b;
! 26:
! 27: b = srv->tmp_chunk_len;
! 28:
! 29: if (len == 0) {
! 30: buffer_copy_string_len(b, CONST_STR_LEN("0"));
! 31: } else {
! 32: for (i = 0; i < 8 && len; i++) {
! 33: len >>= 4;
! 34: }
! 35:
! 36: /* i is the number of hex digits we have */
! 37: buffer_prepare_copy(b, i + 1);
! 38:
! 39: for (j = i-1, len = olen; j+1 > 0; j--) {
! 40: b->ptr[j] = (len & 0xf) + (((len & 0xf) <= 9) ? '0' : 'a' - 10);
! 41: len >>= 4;
! 42: }
! 43: b->used = i;
! 44: b->ptr[b->used++] = '\0';
! 45: }
! 46:
! 47: buffer_append_string_len(b, CONST_STR_LEN("\r\n"));
! 48: chunkqueue_append_buffer(con->write_queue, b);
! 49:
! 50: return 0;
! 51: }
! 52:
! 53:
! 54: int http_chunk_append_file(server *srv, connection *con, buffer *fn, off_t offset, off_t len) {
! 55: chunkqueue *cq;
! 56:
! 57: if (!con) return -1;
! 58:
! 59: cq = con->write_queue;
! 60:
! 61: if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED) {
! 62: http_chunk_append_len(srv, con, len);
! 63: }
! 64:
! 65: chunkqueue_append_file(cq, fn, offset, len);
! 66:
! 67: if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED && len > 0) {
! 68: chunkqueue_append_mem(cq, "\r\n", 2 + 1);
! 69: }
! 70:
! 71: return 0;
! 72: }
! 73:
! 74: int http_chunk_append_buffer(server *srv, connection *con, buffer *mem) {
! 75: chunkqueue *cq;
! 76:
! 77: if (!con) return -1;
! 78:
! 79: cq = con->write_queue;
! 80:
! 81: if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED) {
! 82: http_chunk_append_len(srv, con, mem->used - 1);
! 83: }
! 84:
! 85: chunkqueue_append_buffer(cq, mem);
! 86:
! 87: if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED && mem->used > 0) {
! 88: chunkqueue_append_mem(cq, "\r\n", 2 + 1);
! 89: }
! 90:
! 91: return 0;
! 92: }
! 93:
! 94: int http_chunk_append_mem(server *srv, connection *con, const char * mem, size_t len) {
! 95: chunkqueue *cq;
! 96:
! 97: if (!con) return -1;
! 98:
! 99: cq = con->write_queue;
! 100:
! 101: if (len == 0) {
! 102: if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED) {
! 103: chunkqueue_append_mem(cq, "0\r\n\r\n", 5 + 1);
! 104: } else {
! 105: chunkqueue_append_mem(cq, "", 1);
! 106: }
! 107: return 0;
! 108: }
! 109:
! 110: if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED) {
! 111: http_chunk_append_len(srv, con, len - 1);
! 112: }
! 113:
! 114: chunkqueue_append_mem(cq, mem, len);
! 115:
! 116: if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED) {
! 117: chunkqueue_append_mem(cq, "\r\n", 2 + 1);
! 118: }
! 119:
! 120: return 0;
! 121: }
! 122:
! 123:
! 124: off_t http_chunkqueue_length(server *srv, connection *con) {
! 125: if (!con) {
! 126: log_error_write(srv, __FILE__, __LINE__, "s", "connection is NULL!!");
! 127:
! 128: return 0;
! 129: }
! 130:
! 131: return chunkqueue_length(con->write_queue);
! 132: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>