From 8a15f9760f2344670501b24b6d78e14ccd1b907a Mon Sep 17 00:00:00 2001 From: snowdrop Date: Fri, 15 Oct 2004 14:26:15 +0000 Subject: development --- nanohttp/nanohttp-stream.h | 220 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 207 insertions(+), 13 deletions(-) (limited to 'nanohttp/nanohttp-stream.h') diff --git a/nanohttp/nanohttp-stream.h b/nanohttp/nanohttp-stream.h index edbf371..fb44284 100755 --- a/nanohttp/nanohttp-stream.h +++ b/nanohttp/nanohttp-stream.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: nanohttp-stream.h,v 1.1 2004/09/19 07:05:03 snowdrop Exp $ + * $Id: nanohttp-stream.h,v 1.2 2004/10/15 14:26:15 snowdrop Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003-2004 Ferhat Ayaz @@ -23,53 +23,247 @@ ******************************************************************/ #ifndef NANO_HTTP_STREAM_H #define NANO_HTTP_STREAM_H +#include + +void _log_str(char *fn, char *str, int size); + +/* + HTTP Stream modul: + + nanohttp supports 2 different streams: + + 1. http_input_stream_t + 2. http_output_stream_t + + These are not regular streams. They will care about + transfer styles while sending/receiving data. + + Supported transfer styles are + + o Content-length + o Chunked encoding + o Connection: "close" + + A stream will set its transfer style from the header + information, which must be given while creating a stream. + + A stream will start sending/receiving data "after" + sending/receiving header information. (After )" + +*/ #include #include +#include + + /** - Supported transfer types + Transfer types supported while + sending/receiving data. */ typedef enum http_transfer_type { + /** The stream cares about Content-length */ HTTP_TRANSFER_CONTENT_LENGTH, - HTTP_TRANSFER_CONTENT_CHUNKED, - HTTP_TRANSFER_CONNECTION_CLOSE + + /** The stream sends/receives chunked data */ + HTTP_TRANSFER_CHUNKED, + + /** The stream sends/receives data until + connection is closed */ + HTTP_TRANSFER_CONNECTION_CLOSE, + + /** This transfer style will be used by MIME support + and for debug purposes.*/ + HTTP_TRANSFER_FILE + }http_transfer_type_t; + /** - HTTP INPUT STREAM + HTTP INPUT STREAM. Receives data from a socket/file + and cares about the transfer style. */ typedef struct http_input_stream { - hsocket_t sock; + hsocket_t sock; + hstatus_t err; http_transfer_type_t type; - size_t received; - size_t content_length; - size_t chunk_size; + int received; + int content_length; + int chunk_size; + byte_t connection_closed; + FILE *fd; }http_input_stream_t; /** - Creates a new input stream. + HTTP OUTPUT STREAM. Sends data to a socket + and cares about the transfer style. +*/ +typedef struct http_output_stream +{ + hsocket_t sock; + http_transfer_type_t type; + int content_length; + int sent; +}http_output_stream_t; + + +/* +-------------------------------------------------------------- + HTTP INPUT STREAM +-------------------------------------------------------------- +*/ + +/** + Creates a new input stream. The transfer style will be + choosen from the given header. + + @param sock the socket to receive data from + @param header the http header. This must be received before + creating a http_input_stream_t. + + @returns a newly created http_input_stream_t object. If no + transfer style was found in the header, + HTTP_TRANSFER_CONNECTION_CLOSE will be used as default. + + @see http_input_stream_free */ http_input_stream_t *http_input_stream_new(hsocket_t sock, hpair_t *header); + /** - Free input stream + Creates a new input stream from file. + This function was added for MIME messages + and for debugging. The transfer style is always + HTTP_TRANSFER_FILE. + + @param filename the name of the file to open and read. + + @returns The return value is a http_input_stream_t object + if the file exists and could be opened. NULL otherwise. + + @see http_input_stream_free +*/ +http_input_stream_t *http_input_stream_new_from_file(const char* filename); + + +/** + Free input stream. Note that the socket will not be closed + by this functions. + + @param stream the input stream to free. */ void http_input_stream_free(http_input_stream_t *stream); + /** Returns the actual status of the stream. + + @param stream the stream to check its status + @returns
1 if there are still data to read. +
0 if no more data exists. */ int http_input_stream_is_ready(http_input_stream_t *stream); + /** - Returns the actual read bytes + Tries to read 'size' bytes from the stream. Check always + with http_input_stream_is_ready() if there are some data + to read. If it returns 0, no more data is available on + stream. +

+ On error this function will return -1. In this case the + "err" field of stream will be set to the actual error. + This can be one of the followings:

+ +
STREAM_ERROR_NO_CHUNK_SIZE +
STREAM_ERROR_WRONG_CHUNK_SIZE +
STREAM_ERROR_INVALID_TYPE +
HSOCKET_ERROR_RECEIVE + + @param stream the stream to read data from + @param dest destination memory to store readed bytes + @param size maximum size of 'dest' (size to read) + + @returns the actual readed bytes or -1 on error. */ int http_input_stream_read(http_input_stream_t *stream, - byte_t *dest, size_t size); + byte_t *dest, int size); + + +/* +-------------------------------------------------------------- + HTTP OUTPUT STREAM +-------------------------------------------------------------- +*/ + +/** + Creates a new output stream. Transfer style will be found + from the given header. + + @param sock the socket to to send data to + @param header the header which must be sent before + + @returns a http_output_stream_t object. If no proper transfer + style was found in the header, HTTP_TRANSFER_CONNECTION_CLOSE + will be used as default. + + @see http_output_stream_free +*/ +http_output_stream_t *http_output_stream_new(hsocket_t sock, hpair_t *header); + + +/** + Free output stream. Note that this functions will not + close any socket connections. + + @param stream the stream to free. +*/ +void http_output_stream_free(http_output_stream_t *stream); + + +/** + Writes 'size' bytes of 'bytes' into stream. + + @param stream the stream to use to send data + @param bytes bytes to send + @param size size of bytes to send + + @returns H_OK if success. One of the followings otherwise +
HSOCKET_ERROR_NOT_INITIALIZED +
HSOCKET_ERROR_SEND +*/ +hstatus_t http_output_stream_write(http_output_stream_t *stream, + const byte_t *bytes, int size); + +/** + Writes a null terminated string to the stream. + + @param stream the stream to use to send data + @param str a null terminated string to send + + @returns H_OK if success. One of the followings otherwise +
HSOCKET_ERROR_NOT_INITIALIZED +
HSOCKET_ERROR_SEND +*/ +hstatus_t http_output_stream_write_string(http_output_stream_t *stream, + const char *str); + + +/** + Sends finish flags if nesseccary (like in chunked transport). + Call always this function before closing the connections. + + @param stream the stream to send post data. + + @returns H_OK if success. One of the followings otherwise +
HSOCKET_ERROR_NOT_INITIALIZED +
HSOCKET_ERROR_SEND +*/ +hstatus_t http_output_stream_flush(http_output_stream_t *stream); #endif -- cgit v1.1-32-gdbae