diff --git a/qse/include/qse/cmn/mem.h b/qse/include/qse/cmn/mem.h index 953f6915..7e2ba46a 100644 --- a/qse/include/qse/cmn/mem.h +++ b/qse/include/qse/cmn/mem.h @@ -1,5 +1,5 @@ /* - * $Id: mem.h 348 2010-08-26 06:26:28Z hyunghwan.chung $ + * $Id: mem.h 375 2010-11-30 11:35:28Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. This file is part of QSE. @@ -38,18 +38,27 @@ */ #define QSE_MMGR_SETDFL(m) ((qse_mmgr)=(m)) -/* allocate a memory block */ +/** + * The QSE_MMGR_ALLOC() macro allocates a memory block of the @a size bytes + * using the @a mmgr memory manager. + */ #define QSE_MMGR_ALLOC(mmgr,size) \ ((mmgr)->alloc((mmgr)->udd,size)) -/* reallocate a memory block */ +/** + * The QSE_MMGR_REALLOC() macro resizes a memory block pointed to by @a ptr + * to the @a size bytes using the @a mmgr memory manager. + */ #define QSE_MMGR_REALLOC(mmgr,ptr,size) \ ((mmgr)->realloc((mmgr)->udd,ptr,size)) -/* free a memory block */ +/** + * The QSE_MMGR_FREE() macro deallocates the memory block pointed to by @a ptr. + */ #define QSE_MMGR_FREE(mmgr,ptr) \ ((mmgr)->free((mmgr)->udd,ptr)) + #ifdef __cplusplus extern "C" { #endif @@ -86,7 +95,7 @@ void* qse_memmove ( qse_size_t n /**< number of bytes to copy */ ); -/* +/** * The qse_memset() function fills leading @a n bytes of the destination * memory block @a dst with the byte @a val. * @@ -130,7 +139,7 @@ void* qse_membyte ( qse_size_t n /**< number of bytes to scan */ ); -/* +/** * The qse_memrbyte() function scans the memory block @a s from the nth byte * backward to the first byte in search of the byte @a val. If it finds a match, * it aborts scanning the memory block and returns the pointer to the matching @@ -162,7 +171,7 @@ void* qse_memmem ( qse_size_t nl /**< number of bytes in the block */ ); -/* +/** * The qse_memrmem() functions scans the first @a hl bytes of the memory * block @a hs backward in search of the byte block @a nd of the length * @a nl bytes. diff --git a/qse/include/qse/utl/http.h b/qse/include/qse/utl/http.h index 099448d9..b9582aaf 100644 --- a/qse/include/qse/utl/http.h +++ b/qse/include/qse/utl/http.h @@ -31,6 +31,12 @@ enum qse_http_errnum_t typedef enum qse_http_errnum_t qse_http_errnum_t; +enum qse_http_option_t +{ + QSE_HTTP_LEADINGEMPTYLINES = (1 << 0) +}; + +typedef enum qse_http_option_t qse_http_option_t; typedef struct qse_http_req_t qse_http_req_t; @@ -88,11 +94,11 @@ struct qse_http_reqcbs_t int (*request) (qse_http_t* http, qse_http_req_t* req); }; - struct qse_http_t { QSE_DEFINE_COMMON_FIELDS (http) qse_http_errnum_t errnum; + int option; const qse_http_reqcbs_t* reqcbs; @@ -161,6 +167,15 @@ void qse_http_clear ( qse_http_t* http ); +int qse_http_getoption ( + qse_http_t* http +); + +void qse_http_setoption ( + qse_http_t* http, + int opts +); + const qse_http_reqcbs_t* qse_http_getreqcbs ( qse_http_t* http ); diff --git a/qse/lib/utl/http.c b/qse/lib/utl/http.c index 5ddd4ca1..0d93fb44 100644 --- a/qse/lib/utl/http.c +++ b/qse/lib/utl/http.c @@ -326,7 +326,7 @@ static qse_byte_t* parse_reqline (qse_http_t* http, qse_byte_t* line) /* ? must be explicit to be a argument instroducer. * %3f is just a literal. */ http->req.path.len = tmp - http->req.path.ptr; - /**tmp++ = '\0';*/ + *tmp++ = '\0'; http->req.args.ptr = tmp; p++; } @@ -342,7 +342,8 @@ static qse_byte_t* parse_reqline (qse_http_t* http, qse_byte_t* line) http->req.args.len = tmp - http->req.args.ptr; else http->req.path.len = tmp - http->req.path.ptr; - /* *tmp = '\0'; */ /* null-terminate the url part */ + /* null-terminate the url part though we record the length */ + *tmp = '\0'; /* skip spaces after the url part */ do { p++; } while (is_space_octet(*p)); @@ -393,6 +394,16 @@ void qse_http_clear (qse_http_t* http) clear_request (http); } +int qse_http_getoption (qse_http_t* http) +{ + return http->option; +} + +void qse_http_setoption (qse_http_t* http, int opts) +{ + http->option = opts; +} + const qse_http_reqcbs_t* qse_http_getreqcbs (qse_http_t* http) { return http->reqcbs; @@ -797,7 +808,11 @@ static QSE_INLINE int parse_request ( p = http->reqx.b.raw.data; - while (is_whspace_octet(*p)) p++; + if (http->option & QSE_HTTP_LEADINGEMPTYLINES) + while (is_whspace_octet(*p)) p++; + else + while (is_space_octet(*p)) p++; + QSE_ASSERT (*p != '\0'); /* parse the request line */ @@ -1001,7 +1016,8 @@ int qse_http_feed (qse_http_t* http, const qse_byte_t* req, qse_size_t len) { register qse_byte_t b = *ptr++; - if (http->reqx.s.plen <= 0 && is_whspace_octet(b)) + if (http->option & QSE_HTTP_LEADINGEMPTYLINES && + http->reqx.s.plen <= 0 && is_whspace_octet(b)) { /* let's drop leading whitespaces across multiple * lines */ @@ -1160,9 +1176,8 @@ int qse_http_feed (qse_http_t* http, const qse_byte_t* req, qse_size_t len) } } - - QSE_ASSERTX (http->reqcbs != QSE_NULL, - "Set the request callback before feeding data"); + QSE_ASSERTX (http->reqcbs->request != QSE_NULL, + "set request callbacks before feeding"); http->errnum = QSE_HTTP_ENOERR; if (http->reqcbs->request (http, &http->req) <= -1) { @@ -1216,3 +1231,4 @@ feedme_more: return 0; } +