@@ -438,6 +438,10 @@ void param_parser_terminate(param_parser_t* parser)
438438 case PARAM_TYPE_INT :
439439 * (int * )(parser -> parsed + dispatch -> offset ) = (int )(parser -> numeric_parser .result + 0.5 );
440440 break ;
441+ case PARAM_TYPE_ID :
442+ if (* (int * )(parser -> parsed + dispatch -> offset ) < 0 ) // original is illegal resource id
443+ * (int * )(parser -> parsed + dispatch -> offset ) = (int )(parser -> numeric_parser .result + 0.5 );
444+ break ;
441445 case PARAM_TYPE_FLOAT :
442446 * (float * )(parser -> parsed + dispatch -> offset ) = (float )parser -> numeric_parser .result ;
443447 break ;
@@ -458,6 +462,7 @@ void param_parser_terminate(param_parser_t* parser)
458462 dispatch -> on_string (parser -> context , parser -> string_parser .string );
459463 break ;
460464 case PARAM_TYPE_BLOB :
465+ case PARAM_TYPE_BODY :
461466 if (dispatch -> on_blob )
462467 dispatch -> on_blob (parser -> context , parser -> blob_parser .data );
463468 break ;
@@ -477,6 +482,7 @@ static void param_type_parser_init(param_parser_t* parser)
477482 switch (parser -> param_map [parser -> state ].type )
478483 {
479484 case PARAM_TYPE_INT :
485+ case PARAM_TYPE_ID :
480486 case PARAM_TYPE_FLOAT :
481487 case PARAM_TYPE_DOUBLE :
482488 numeric_parser_init (& parser -> numeric_parser );
@@ -492,6 +498,7 @@ static void param_type_parser_init(param_parser_t* parser)
492498 string_parser_init (& parser -> string_parser );
493499 break ;
494500 case PARAM_TYPE_BLOB :
501+ case PARAM_TYPE_BODY :
495502 blob_parser_init (& parser -> blob_parser );
496503 break ;
497504 }
@@ -503,6 +510,7 @@ static void param_type_parser_execute(param_parser_t* parser, const char* buf, s
503510 switch (parser -> param_map [parser -> state ].type )
504511 {
505512 case PARAM_TYPE_INT :
513+ case PARAM_TYPE_ID :
506514 case PARAM_TYPE_FLOAT :
507515 case PARAM_TYPE_DOUBLE :
508516 numeric_parser_execute (& parser -> numeric_parser , buf , len );
@@ -526,6 +534,7 @@ static void param_type_parser_execute(param_parser_t* parser, const char* buf, s
526534 parser -> state = s_param_skip ;
527535 break ;
528536 case PARAM_TYPE_BLOB :
537+ case PARAM_TYPE_BODY :
529538 blob_parser_execute (& parser -> blob_parser , buf , len );
530539 break ;
531540 }
@@ -585,11 +594,27 @@ void param_parser_init(param_parser_t* parser, const param_dispatch_t* param_map
585594 parser -> context = context ;
586595 parser -> cursor = 0 ;
587596 memset (parser -> name , 0 , sizeof (parser -> name ));
588- // we treat "source" differently, because it is the parameter for content body
589- parser -> source = find_param_dispatch_state (parser , "source" );
597+ // find out the special bodies that we cared about (PARAM_TYPE_BODY and PARAM_TYPE_ID)
598+ parser -> body = parser -> resource = s_param_start ;
599+ int i ;
600+ for (i = 0 ; i < len ; i ++ )
601+ switch (param_map [i ].type )
602+ {
603+ default :
604+ break ;
605+ case PARAM_TYPE_ID :
606+ assert (parser -> resource == s_param_start );
607+ * (int * )(parser -> parsed + param_map [i ].offset ) = -1 ; // set id == -1 first.
608+ parser -> resource = i ;
609+ break ;
610+ case PARAM_TYPE_BODY :
611+ assert (parser -> body == s_param_start );
612+ parser -> body = i ;
613+ break ;
614+ }
590615}
591616
592- void param_parser_execute (param_parser_t * parser , const char * buf , size_t len , uri_parse_state_t state , int header_index )
617+ void param_parser_execute (param_parser_t * parser , int resource_id , const char * buf , size_t len , uri_parse_state_t state , int header_index )
593618{
594619 switch (state )
595620 {
@@ -599,13 +624,13 @@ void param_parser_execute(param_parser_t* parser, const char* buf, size_t len, u
599624 query_string_parser_execute (& parser -> query_string_parser , buf , len );
600625 break ;
601626 case URI_CONTENT_BODY :
602- if (parser -> source == s_param_skip )
627+ if (parser -> body == s_param_skip )
603628 break ;
604- if (parser -> state != s_param_start && parser -> state != parser -> source )
629+ if (parser -> state != s_param_start && parser -> state != parser -> body )
605630 param_parser_terminate (parser );
606631 if (parser -> state == s_param_start )
607632 {
608- parser -> state = parser -> source ;
633+ parser -> state = parser -> body ;
609634 param_type_parser_init (parser );
610635 }
611636 param_type_parser_execute (parser , buf , len );
@@ -632,6 +657,8 @@ void param_parser_execute(param_parser_t* parser, const char* buf, size_t len, u
632657 param_type_parser_execute (parser , buf , len );
633658 break ;
634659 }
660+ if (resource_id >= 0 && parser -> resource != s_param_start )
661+ * (int * )(parser -> parsed + parser -> param_map [parser -> resource ].offset ) = resource_id ;
635662}
636663
637664ebb_buf param_parser_map_http_body (const param_dispatch_t * param_map , size_t len , const char * response_format )
@@ -652,6 +679,7 @@ ebb_buf param_parser_map_http_body(const param_dispatch_t* param_map, size_t len
652679 switch (param_map [i ].type )
653680 {
654681 case PARAM_TYPE_INT :
682+ case PARAM_TYPE_ID :
655683 body_len += sizeof (int_type ) - 1 ;
656684 break ;
657685 case PARAM_TYPE_FLOAT :
@@ -671,6 +699,7 @@ ebb_buf param_parser_map_http_body(const param_dispatch_t* param_map, size_t len
671699 body_len += sizeof (string_type ) - 1 ;
672700 break ;
673701 case PARAM_TYPE_BLOB :
702+ case PARAM_TYPE_BODY :
674703 body_len += sizeof (blob_type ) - 1 ;
675704 break ;
676705 }
@@ -695,6 +724,7 @@ ebb_buf param_parser_map_http_body(const param_dispatch_t* param_map, size_t len
695724 switch (param_map [i ].type )
696725 {
697726 case PARAM_TYPE_INT :
727+ case PARAM_TYPE_ID :
698728 memcpy (data + body .written , int_type , sizeof (int_type ) - 1 );
699729 body .written += sizeof (int_type ) + 2 ;
700730 break ;
@@ -720,6 +750,7 @@ ebb_buf param_parser_map_http_body(const param_dispatch_t* param_map, size_t len
720750 body .written += sizeof (string_type ) + 2 ;
721751 break ;
722752 case PARAM_TYPE_BLOB :
753+ case PARAM_TYPE_BODY :
723754 memcpy (data + body .written , blob_type , sizeof (blob_type ) - 1 );
724755 body .written += sizeof (blob_type ) + 2 ;
725756 break ;
0 commit comments