66#include "tp.h"
77#include "tp_transcode.h"
88
9+ #define DEBUG
910#if defined DEBUG
1011#define dd (...) fprintf(stderr, __VA_ARGS__)
1112#else
@@ -39,7 +40,14 @@ while (0)
3940
4041enum { MAX_STACK_SIZE = 254 - 1 };
4142enum type { TYPE_MAP = 1 , TYPE_ARRAY = 2 };
42- enum stage { START = 0 , PARAMS = 4 , ID = 8 , METHOD = 16 };
43+ enum stage {
44+ INIT = 0 ,
45+ BATCH = 1 ,
46+ WAIT_NEXT = 2 ,
47+ PARAMS = 4 ,
48+ ID = 8 ,
49+ METHOD = 16
50+ };
4351
4452typedef struct {
4553 char * ptr ;
@@ -200,7 +208,7 @@ yajl_integer(void *ctx, long long v)
200208 }
201209
202210 s_ctx -> id = v ;
203- s_ctx -> stage = START ;
211+ s_ctx -> stage = WAIT_NEXT ;
204212 }
205213
206214 return 1 ;
@@ -320,7 +328,7 @@ yajl_string(void *ctx, const unsigned char * str, size_t len)
320328
321329 dd ("METHOD END\n" );
322330
323- s_ctx -> stage = START ;
331+ s_ctx -> stage = WAIT_NEXT ;
324332 s_ctx -> been_stages |= METHOD ;
325333
326334 return rc ;
@@ -334,6 +342,11 @@ yajl_map_key(void *ctx, const unsigned char * key, size_t len)
334342{
335343 yajl_ctx_t * s_ctx = (yajl_ctx_t * )ctx ;
336344
345+ if (mp_unlikely (s_ctx -> stage == INIT )) {
346+ dd ("MESSAGE START\n" );
347+ s_ctx -> stage = WAIT_NEXT ;
348+ }
349+
337350 if (mp_likely (s_ctx -> stage == PARAMS )) {
338351
339352 dd ("key: %.*s\n" , (int )len , key );
@@ -343,7 +356,7 @@ yajl_map_key(void *ctx, const unsigned char * key, size_t len)
343356 if (mp_unlikely (!tp_encode_str (& s_ctx -> tp , (char * )key , len )))
344357 say_overflow_r_2 (s_ctx );
345358
346- } else if (s_ctx -> stage == START ) {
359+ } else if (s_ctx -> stage == WAIT_NEXT ) {
347360
348361 if (len == sizeof ("params" ) - 1
349362 && key [0 ] == 'p'
@@ -377,15 +390,9 @@ yajl_map_key(void *ctx, const unsigned char * key, size_t len)
377390 s_ctx -> stage = METHOD ;
378391 }
379392 else
380- {
381- const int l = len > 32 ? 32 : len ;
382- say_error (s_ctx ,
383- "unknown key '%.*s', allowed: 'method', 'params', 'id'" ,
384- l , key );
385- return 0 ;
386- }
393+ dd ("SKIPING: %.*s\n" , (int )len , key );
387394 } else
388- s_ctx -> stage = START ;
395+ s_ctx -> stage = WAIT_NEXT ;
389396
390397 return 1 ;
391398}
@@ -438,10 +445,10 @@ yajl_end_map(void *ctx)
438445
439446 if (mp_unlikely (item -> type & PARAMS )) {
440447 dd ("PARAMS END\n" );
441- s_ctx -> stage = START ;
448+ s_ctx -> stage = WAIT_NEXT ;
442449 }
443450 } else
444- s_ctx -> stage = START ;
451+ s_ctx -> stage = WAIT_NEXT ;
445452
446453 return 1 ;
447454}
@@ -451,6 +458,11 @@ yajl_start_array(void *ctx)
451458{
452459 yajl_ctx_t * s_ctx = (yajl_ctx_t * )ctx ;
453460
461+ if (mp_unlikely (s_ctx -> stage == INIT )) {
462+ say_error (s_ctx , "Batch not suported yet" );
463+ return 0 ;
464+ }
465+
454466 if (mp_unlikely (s_ctx -> stage != PARAMS ))
455467 return 1 ;
456468
@@ -493,10 +505,10 @@ yajl_end_array(void *ctx)
493505
494506 if (mp_unlikely (item -> type & PARAMS )) {
495507 dd ("PARAMS END\n" );
496- s_ctx -> stage = START ;
508+ s_ctx -> stage = WAIT_NEXT ;
497509 }
498510 } else
499- s_ctx -> stage = START ;
511+ s_ctx -> stage = WAIT_NEXT ;
500512
501513 return 1 ;
502514}
@@ -515,7 +527,7 @@ yajl_json2tp_create(tp_transcode_t *tc, char *output, size_t output_size)
515527
516528 memset (ctx , 0 , sizeof (yajl_ctx_t ));
517529
518- ctx -> stage = START ;
530+ ctx -> stage = INIT ;
519531
520532 ctx -> output_size = output_size ;
521533 tp_init (& ctx -> tp , (char * )output , output_size , NULL , NULL );
@@ -604,6 +616,7 @@ yajl_json2tp_transcode(void *ctx, const char *input, size_t input_size)
604616 if (mp_unlikely (stat != yajl_status_ok )) {
605617
606618 if (s_ctx -> tc -> errmsg [0 ] == 0 ) {
619+ s_ctx -> tc -> errcode = -32700 ;
607620 stat = yajl_complete_parse (s_ctx -> hand );
608621 unsigned char * err = yajl_get_error (s_ctx -> hand , 0 ,
609622 input_ , input_size );
@@ -624,38 +637,36 @@ yajl_json2tp_transcode(void *ctx, const char *input, size_t input_size)
624637static enum tt_result
625638yajl_json2tp_complete (void * ctx , size_t * complete_msg_size )
626639{
627- static const char * unknown_error =
628- "json _must_ contain 'method':'tnt_call',"
629- "'params':object " ;
630-
631640 yajl_ctx_t * s_ctx = (yajl_ctx_t * )ctx ;
632641
633642 char * p = & s_ctx -> tc -> errmsg [0 ];
634643 char * e = & s_ctx -> tc -> errmsg [0 ] + sizeof (s_ctx -> tc -> errmsg ) - 1 ;
635644
636645 const yajl_status stat = yajl_complete_parse (s_ctx -> hand );
637- if (mp_unlikely (stat != yajl_status_ok )) {
638-
639- if (s_ctx -> tc -> errmsg [0 ] == 0 )
640- p += snprintf (p , e - p , "%s" , unknown_error );
641-
646+ if (mp_likely (stat == yajl_status_ok )) {
647+ tp_reqid (& s_ctx -> tp , s_ctx -> id );
648+ * complete_msg_size = tp_used (& s_ctx -> tp );
649+ return TP_TRANSCODE_OK ;
650+ } else if (s_ctx -> tc -> errmsg [0 ] != 0 ) {
651+ p += snprintf (p , e - p , "%s" , s_ctx -> tc -> errmsg );
652+ s_ctx -> tc -> errcode = -32000 ;
642653 return TP_TRANSCODE_ERROR ;
643654 }
644655
645- if (mp_unlikely (
646- !(s_ctx -> been_stages & METHOD
647- && s_ctx -> been_stages & PARAMS )
648- || !s_ctx -> been_stages ))
649- {
650- p += snprintf (p , e - p , "%s" , unknown_error );
651- return TP_TRANSCODE_ERROR ;
656+ if (mp_unlikely (!(s_ctx -> been_stages & METHOD ))) {
657+ p += snprintf (p , e - p , "Method not found" );
658+ } else if (mp_unlikely (!(s_ctx -> been_stages & PARAMS ))) {
659+ p += snprintf (p , e - p , "Params not found" );
660+ } else if (mp_unlikely (!(s_ctx -> been_stages & ID ))) {
661+ p += snprintf (p , e - p , "Id not found" );
662+ } else {
663+ p += snprintf (p , e - p ,
664+ "call _must_ contains 'method':'tnt_call',"
665+ "'params':object " );
652666 }
653667
654- tp_reqid (& s_ctx -> tp , s_ctx -> id );
655-
656- * complete_msg_size = tp_used (& s_ctx -> tp );
657-
658- return TP_TRANSCODE_OK ;
668+ s_ctx -> tc -> errcode = -32600 ;
669+ return TP_TRANSCODE_ERROR ;
659670}
660671
661672/**
@@ -935,6 +946,7 @@ tp2json_transcode(void *ctx_, const char *in, size_t in_size)
935946 return TP_TRANSCODE_OK ;
936947
937948error_exit :
949+ ctx -> tc -> errcode = -32700 ;
938950 ctx -> pos = ctx -> output ;
939951 return TP_TRANSCODE_ERROR ;
940952}
@@ -1027,6 +1039,8 @@ tp_transcode_init(tp_transcode_t *t, char *output, size_t output_size,
10271039 if (mp_unlikely (!t -> codec .ctx ))
10281040 return TP_TRANSCODE_ERROR ;
10291041
1042+ t -> errcode = -32700 ;
1043+
10301044 return TP_TRANSCODE_OK ;
10311045}
10321046
0 commit comments