@ -25,48 +25,48 @@ static const keyvalue http_versions[] = {
{ HTTP_VERSION_UNSET , 0 , NULL }
} ;
static const keyvalue http_methods [ ] = {
{ HTTP_METHOD_GET , CONST_ LEN_STR ( " GET " ) } ,
{ HTTP_METHOD_HEAD , CONST_ LEN_STR ( " HEAD " ) } ,
{ HTTP_METHOD_POST , CONST_ LEN_STR ( " POST " ) } ,
{ HTTP_METHOD_PUT , CONST_ LEN_STR ( " PUT " ) } ,
{ HTTP_METHOD_DELETE , CONST_ LEN_STR ( " DELETE " ) } ,
{ HTTP_METHOD_CONNECT , CONST_ LEN_STR ( " CONNECT " ) } ,
{ HTTP_METHOD_OPTIONS , CONST_ LEN_STR ( " OPTIONS " ) } ,
{ HTTP_METHOD_TRACE , CONST_ LEN_STR ( " TRACE " ) } ,
{ HTTP_METHOD_ACL , CONST_ LEN_STR ( " ACL " ) } ,
{ HTTP_METHOD_BASELINE_CONTROL , CONST_ LEN_ STR( " BASELINE-CONTROL " ) } ,
{ HTTP_METHOD_BIND , CONST_ LEN_STR ( " BIND " ) } ,
{ HTTP_METHOD_CHECKIN , CONST_ LEN_STR ( " CHECKIN " ) } ,
{ HTTP_METHOD_CHECKOUT , CONST_ LEN_STR ( " CHECKOUT " ) } ,
{ HTTP_METHOD_COPY , CONST_ LEN_STR ( " COPY " ) } ,
{ HTTP_METHOD_LABEL , CONST_ LEN_STR ( " LABEL " ) } ,
{ HTTP_METHOD_LINK , CONST_ LEN_STR ( " LINK " ) } ,
{ HTTP_METHOD_LOCK , CONST_ LEN_STR ( " LOCK " ) } ,
{ HTTP_METHOD_MERGE , CONST_ LEN_STR ( " MERGE " ) } ,
{ HTTP_METHOD_MKACTIVITY , CONST_ LEN_STR ( " MKACTIVITY " ) } ,
{ HTTP_METHOD_MKCALENDAR , CONST_ LEN_STR ( " MKCALENDAR " ) } ,
{ HTTP_METHOD_MKCOL , CONST_ LEN_STR ( " MKCOL " ) } ,
{ HTTP_METHOD_MKREDIRECTREF , CONST_ LEN_ STR( " MKREDIRECTREF " ) } ,
{ HTTP_METHOD_MKWORKSPACE , CONST_ LEN_ STR( " MKWORKSPACE " ) } ,
{ HTTP_METHOD_MOVE , CONST_ LEN_STR ( " MOVE " ) } ,
{ HTTP_METHOD_ORDERPATCH , CONST_ LEN_STR ( " ORDERPATCH " ) } ,
{ HTTP_METHOD_PATCH , CONST_ LEN_STR ( " PATCH " ) } ,
{ HTTP_METHOD_PROPFIND , CONST_ LEN_STR ( " PROPFIND " ) } ,
{ HTTP_METHOD_PROPPATCH , CONST_ LEN_STR ( " PROPPATCH " ) } ,
{ HTTP_METHOD_REBIND , CONST_ LEN_STR ( " REBIND " ) } ,
{ HTTP_METHOD_REPORT , CONST_ LEN_STR ( " REPORT " ) } ,
{ HTTP_METHOD_SEARCH , CONST_ LEN_STR ( " SEARCH " ) } ,
{ HTTP_METHOD_UNBIND , CONST_ LEN_STR ( " UNBIND " ) } ,
{ HTTP_METHOD_UNCHECKOUT , CONST_ LEN_STR ( " UNCHECKOUT " ) } ,
{ HTTP_METHOD_UNLINK , CONST_ LEN_STR ( " UNLINK " ) } ,
{ HTTP_METHOD_UNLOCK , CONST_ LEN_STR ( " UNLOCK " ) } ,
{ HTTP_METHOD_UPDATE , CONST_ LEN_STR ( " UPDATE " ) } ,
{ HTTP_METHOD_UPDATEREDIRECTREF , CONST_ LEN_ STR( " UPDATEREDIRECTREF " ) } ,
{ HTTP_METHOD_VERSION_CONTROL , CONST_ LEN_ STR( " VERSION-CONTROL " ) } ,
{ HTTP_METHOD_PRI , CONST_ LEN_STR ( " PRI " ) } ,
{ HTTP_METHOD_UNSET , 0 , NULL }
static const buffer http_methods [ ] = {
{ CONST_ STR_ LEN( " GET " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " HEAD " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " POST " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " PUT " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " DELETE " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " CONNECT " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " OPTIONS " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " TRACE " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " ACL " ) + 1 , 0 } ,
{ CONST_ STR_LEN ( " BASELINE-CONTROL " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " BIND " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " CHECKIN " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " CHECKOUT " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " COPY " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " LABEL " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " LINK " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " LOCK " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " MERGE " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " MKACTIVITY " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " MKCALENDAR " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " MKCOL " ) + 1 , 0 } ,
{ CONST_ STR_LEN ( " MKREDIRECTREF " ) + 1 , 0 } ,
{ CONST_ STR_LEN ( " MKWORKSPACE " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " MOVE " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " ORDERPATCH " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " PATCH " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " PROPFIND " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " PROPPATCH " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " REBIND " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " REPORT " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " SEARCH " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " UNBIND " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " UNCHECKOUT " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " UNLINK " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " UNLOCK " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " UPDATE " ) + 1 , 0 } ,
{ CONST_ STR_LEN ( " UPDATEREDIRECTREF " ) + 1 , 0 } ,
{ CONST_ STR_LEN ( " VERSION-CONTROL " ) + 1 , 0 } ,
{ CONST_ STR_ LEN( " PRI " ) + 1 , 0 } ,
{ " " , 0 , 0 }
} ;
/* https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml */
@ -137,6 +137,15 @@ static const keyvalue http_status[] = {
} ;
const buffer * http_method_buf ( http_method_t i )
{
return ( ( unsigned int ) i < sizeof ( http_methods ) / sizeof ( * http_methods ) - 2 )
? http_methods + i
: http_methods + i + sizeof ( http_methods ) / sizeof ( * http_methods ) ;
/* HTTP_METHOD_PRI is -2, HTTP_METHOD_UNSET is -1 */
}
__attribute_noinline__
__attribute_pure__
static const keyvalue * keyvalue_from_key ( const keyvalue * kv , const int k )
@ -147,6 +156,7 @@ static const keyvalue * keyvalue_from_key (const keyvalue *kv, const int k)
}
#if 0 /*(unused)*/
__attribute_pure__
static int keyvalue_get_key ( const keyvalue * kv , const char * const s , const unsigned int slen )
{
@ -155,19 +165,18 @@ static int keyvalue_get_key(const keyvalue *kv, const char * const s, const unsi
+ + kv ;
return kv - > key ;
}
# endif
const char * get_http_version_name ( int i ) {
return keyvalue_from_key ( http_versions , i ) - > value ;
}
#if 0 /*(unused)*/
const char * get_http_status_name ( int i ) {
return keyvalue_from_key ( http_status , i ) - > value ;
}
const char * get_http_method_name ( http_method_t i ) {
return keyvalue_from_key ( http_methods , i ) - > value ;
}
# endif
#if 0 /*(unused)*/
int get_http_version_key ( const char * s , size_t slen ) {
@ -178,7 +187,16 @@ int get_http_version_key(const char *s, size_t slen) {
http_method_t get_http_method_key ( const char * s , const size_t slen ) {
if ( slen = = 3 & & s [ 0 ] = = ' G ' & & s [ 1 ] = = ' E ' & & s [ 2 ] = = ' T ' )
return HTTP_METHOD_GET ;
return ( http_method_t ) keyvalue_get_key ( http_methods , s , ( unsigned int ) slen ) ;
const buffer * kv = http_methods ;
while ( kv - > used & & ( kv - > used - 1 ! = slen | | 0 ! = memcmp ( kv - > ptr , s , slen ) ) )
+ + kv ;
const uint_fast32_t i = kv - http_methods ;
/*(not done: could overload kv->size and store enum in kv->size)*/
return ( i < sizeof ( http_methods ) / sizeof ( * http_methods ) - 2 )
? ( http_method_t ) i
: i = = sizeof ( http_methods ) / sizeof ( * http_methods ) - 2
? HTTP_METHOD_PRI
: HTTP_METHOD_UNSET ;
}
@ -197,12 +215,6 @@ void http_status_append(buffer * const b, const int status) {
}
}
void http_method_append ( buffer * const b , const http_method_t method ) {
const keyvalue * const kv = keyvalue_from_key ( http_methods , method ) ;
if ( __builtin_expect ( ( 0 ! = kv - > vlen ) , 1 ) )
buffer_append_string_len ( b , kv - > value , kv - > vlen ) ;
}
void http_version_append ( buffer * const b , const http_version_t version ) {
const keyvalue * const kv = keyvalue_from_key ( http_versions , version ) ;
if ( __builtin_expect ( ( 0 ! = kv - > vlen ) , 1 ) )