added the new option MIO_JSON_PERMITWORDKEY
This commit is contained in:
parent
d6b196fbf1
commit
72422be8b8
@ -114,6 +114,13 @@ static int write_json_element (mio_jsonwr_t* jsonwr, const mio_bch_t* dptr, mio_
|
|||||||
int main (int argc, char* argv[])
|
int main (int argc, char* argv[])
|
||||||
{
|
{
|
||||||
mio_t* mio = MIO_NULL;
|
mio_t* mio = MIO_NULL;
|
||||||
|
mio_bitmask_t o = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 1; i < argc; i++)
|
||||||
|
{
|
||||||
|
if (strcmp(argv[i], "--permit-word-key") == 0) o |= MIO_JSON_PERMITWORDKEY;
|
||||||
|
}
|
||||||
|
|
||||||
mio = mio_open(MIO_NULL, 0, MIO_NULL, 512, MIO_NULL);
|
mio = mio_open(MIO_NULL, 0, MIO_NULL, 512, MIO_NULL);
|
||||||
if (!mio)
|
if (!mio)
|
||||||
@ -131,6 +138,7 @@ int main (int argc, char* argv[])
|
|||||||
|
|
||||||
json = mio_json_open(mio, 0);
|
json = mio_json_open(mio, 0);
|
||||||
|
|
||||||
|
mio_json_setoption (json, o);
|
||||||
mio_json_setinstcb (json, on_json_inst, &pending);
|
mio_json_setinstcb (json, on_json_inst, &pending);
|
||||||
|
|
||||||
rem = 0;
|
rem = 0;
|
||||||
@ -152,7 +160,7 @@ int main (int argc, char* argv[])
|
|||||||
if ((x = mio_json_feed(json, buf, size + rem, &rem, 1)) <= -1)
|
if ((x = mio_json_feed(json, buf, size + rem, &rem, 1)) <= -1)
|
||||||
{
|
{
|
||||||
mio_logbfmt (mio, MIO_LOG_STDOUT, "**** ERROR - %js ****\n", mio_geterrmsg(mio));
|
mio_logbfmt (mio, MIO_LOG_STDOUT, "**** ERROR - %js ****\n", mio_geterrmsg(mio));
|
||||||
break;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (x > 0)
|
if (x > 0)
|
||||||
@ -167,7 +175,10 @@ int main (int argc, char* argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
mio_logbfmt (mio, MIO_LOG_STDOUT, "\n");
|
mio_logbfmt (mio, MIO_LOG_STDOUT, "\n");
|
||||||
if (pending) mio_logbfmt (mio, MIO_LOG_STDOUT, "**** ERROR - incomplete ****\n");
|
//if (pending) mio_logbfmt (mio, MIO_LOG_STDOUT, "**** ERROR - incomplete ****\n");
|
||||||
|
if (json->state_stack != &json->state_top) mio_logbfmt (mio, MIO_LOG_STDOUT, "**** ERROR - incomplete ****\n");
|
||||||
|
|
||||||
|
done:
|
||||||
mio_json_close (json);
|
mio_json_close (json);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -434,14 +434,14 @@ mio_htrd_errnum_t mio_htrd_geterrnum (mio_htrd_t* htrd)
|
|||||||
return htrd->errnum;
|
return htrd->errnum;
|
||||||
}
|
}
|
||||||
|
|
||||||
int mio_htrd_getopt (mio_htrd_t* htrd)
|
mio_bitmask_t mio_htrd_getoption (mio_htrd_t* htrd)
|
||||||
{
|
{
|
||||||
return htrd->option;
|
return htrd->option;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mio_htrd_setopt (mio_htrd_t* htrd, int opts)
|
void mio_htrd_setoption (mio_htrd_t* htrd, mio_bitmask_t mask)
|
||||||
{
|
{
|
||||||
htrd->option = opts;
|
htrd->option = mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
const mio_htrd_recbs_t* mio_htrd_getrecbs (mio_htrd_t* htrd)
|
const mio_htrd_recbs_t* mio_htrd_getrecbs (mio_htrd_t* htrd)
|
||||||
|
@ -963,7 +963,7 @@ int mio_svc_htts_docgi (mio_svc_htts_t* htts, mio_dev_sck_t* csck, mio_htre_t* r
|
|||||||
|
|
||||||
cgi->peer_htrd = mio_htrd_open(mio, MIO_SIZEOF(*cgi_peer));
|
cgi->peer_htrd = mio_htrd_open(mio, MIO_SIZEOF(*cgi_peer));
|
||||||
if (MIO_UNLIKELY(!cgi->peer_htrd)) goto oops;
|
if (MIO_UNLIKELY(!cgi->peer_htrd)) goto oops;
|
||||||
mio_htrd_setopt (cgi->peer_htrd, MIO_HTRD_SKIPINITIALLINE | MIO_HTRD_RESPONSE);
|
mio_htrd_setoption (cgi->peer_htrd, MIO_HTRD_SKIPINITIALLINE | MIO_HTRD_RESPONSE);
|
||||||
mio_htrd_setrecbs (cgi->peer_htrd, &cgi_peer_htrd_recbs);
|
mio_htrd_setrecbs (cgi->peer_htrd, &cgi_peer_htrd_recbs);
|
||||||
|
|
||||||
cgi_peer = mio_htrd_getxtn(cgi->peer_htrd);
|
cgi_peer = mio_htrd_getxtn(cgi->peer_htrd);
|
||||||
|
@ -64,7 +64,7 @@ static int init_client (mio_svc_htts_cli_t* cli, mio_dev_sck_t* sck)
|
|||||||
|
|
||||||
/* With MIO_HTRD_TRAILERS, htrd stores trailers in a separate place.
|
/* With MIO_HTRD_TRAILERS, htrd stores trailers in a separate place.
|
||||||
* Otherwise, it is merged to the headers. */
|
* Otherwise, it is merged to the headers. */
|
||||||
/*mio_htrd_setopt (cli->htrd, MIO_HTRD_REQUEST | MIO_HTRD_TRAILERS);*/
|
/*mio_htrd_setoption (cli->htrd, MIO_HTRD_REQUEST | MIO_HTRD_TRAILERS);*/
|
||||||
|
|
||||||
cli->sbuf = mio_becs_open(sck->mio, 0, 2048);
|
cli->sbuf = mio_becs_open(sck->mio, 0, 2048);
|
||||||
if (MIO_UNLIKELY(!cli->sbuf)) goto oops;
|
if (MIO_UNLIKELY(!cli->sbuf)) goto oops;
|
||||||
|
@ -889,7 +889,7 @@ int mio_svc_htts_dothr (mio_svc_htts_t* htts, mio_dev_sck_t* csck, mio_htre_t* r
|
|||||||
|
|
||||||
thr_state->peer_htrd = mio_htrd_open(mio, MIO_SIZEOF(*thr_peer));
|
thr_state->peer_htrd = mio_htrd_open(mio, MIO_SIZEOF(*thr_peer));
|
||||||
if (MIO_UNLIKELY(!thr_state->peer_htrd)) goto oops;
|
if (MIO_UNLIKELY(!thr_state->peer_htrd)) goto oops;
|
||||||
mio_htrd_setopt (thr_state->peer_htrd, MIO_HTRD_SKIPINITIALLINE | MIO_HTRD_RESPONSE);
|
mio_htrd_setoption (thr_state->peer_htrd, MIO_HTRD_SKIPINITIALLINE | MIO_HTRD_RESPONSE);
|
||||||
mio_htrd_setrecbs (thr_state->peer_htrd, &thr_peer_htrd_recbs);
|
mio_htrd_setrecbs (thr_state->peer_htrd, &thr_peer_htrd_recbs);
|
||||||
|
|
||||||
thr_peer = mio_htrd_getxtn(thr_state->peer_htrd);
|
thr_peer = mio_htrd_getxtn(thr_state->peer_htrd);
|
||||||
|
@ -31,6 +31,9 @@
|
|||||||
|
|
||||||
#define MIO_JSON_TOKEN_NAME_ALIGN 64
|
#define MIO_JSON_TOKEN_NAME_ALIGN 64
|
||||||
|
|
||||||
|
/* this must not overlap with MIO_JSON_INST_XXXX enumerators in mio-json.h */
|
||||||
|
#define __INST_WORD_STRING 9999
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
|
|
||||||
static void clear_token (mio_json_t* json)
|
static void clear_token (mio_json_t* json)
|
||||||
@ -178,7 +181,7 @@ static int invoke_data_inst (mio_json_t* json, mio_json_inst_t inst)
|
|||||||
/* this is called after the reader has seen a colon.
|
/* this is called after the reader has seen a colon.
|
||||||
* the data item must be used as a key */
|
* the data item must be used as a key */
|
||||||
|
|
||||||
if (inst != MIO_JSON_INST_STRING)
|
if (inst != MIO_JSON_INST_STRING && inst != __INST_WORD_STRING)
|
||||||
{
|
{
|
||||||
mio_seterrbfmt (json->mio, MIO_EINVAL, "object key not a string - %.*js", json->tok.len, json->tok.ptr);
|
mio_seterrbfmt (json->mio, MIO_EINVAL, "object key not a string - %.*js", json->tok.len, json->tok.ptr);
|
||||||
return -1;
|
return -1;
|
||||||
@ -193,6 +196,12 @@ static int invoke_data_inst (mio_json_t* json, mio_json_inst_t inst)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (inst == __INST_WORD_STRING)
|
||||||
|
{
|
||||||
|
mio_seterrbfmt (json->mio, MIO_EINVAL, "invalid word value - %.*js", json->tok.len, json->tok.ptr);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
switch (inst)
|
switch (inst)
|
||||||
{
|
{
|
||||||
case MIO_JSON_INST_START_ARRAY:
|
case MIO_JSON_INST_START_ARRAY:
|
||||||
@ -392,8 +401,12 @@ static int handle_numeric_value_char (mio_json_t* json, mio_ooci_t c)
|
|||||||
static int handle_word_value_char (mio_json_t* json, mio_ooci_t c)
|
static int handle_word_value_char (mio_json_t* json, mio_ooci_t c)
|
||||||
{
|
{
|
||||||
mio_json_inst_t inst;
|
mio_json_inst_t inst;
|
||||||
|
int ok;
|
||||||
|
|
||||||
if (mio_is_ooch_alpha(c))
|
ok = (json->option & MIO_JSON_PERMITWORDKEY)?
|
||||||
|
(mio_is_ooch_alpha(c) || mio_is_ooch_digit(c) || c == '_'):
|
||||||
|
mio_is_ooch_alpha(c);
|
||||||
|
if (ok)
|
||||||
{
|
{
|
||||||
if (add_char_to_token(json, c, 0) <= -1) return -1;
|
if (add_char_to_token(json, c, 0) <= -1) return -1;
|
||||||
return 1;
|
return 1;
|
||||||
@ -404,6 +417,7 @@ static int handle_word_value_char (mio_json_t* json, mio_ooci_t c)
|
|||||||
if (mio_comp_oochars_bcstr(json->tok.ptr, json->tok.len, "null", 0) == 0) inst = MIO_JSON_INST_NIL;
|
if (mio_comp_oochars_bcstr(json->tok.ptr, json->tok.len, "null", 0) == 0) inst = MIO_JSON_INST_NIL;
|
||||||
else if (mio_comp_oochars_bcstr(json->tok.ptr, json->tok.len, "true", 0) == 0) inst = MIO_JSON_INST_TRUE;
|
else if (mio_comp_oochars_bcstr(json->tok.ptr, json->tok.len, "true", 0) == 0) inst = MIO_JSON_INST_TRUE;
|
||||||
else if (mio_comp_oochars_bcstr(json->tok.ptr, json->tok.len, "false", 0) == 0) inst = MIO_JSON_INST_FALSE;
|
else if (mio_comp_oochars_bcstr(json->tok.ptr, json->tok.len, "false", 0) == 0) inst = MIO_JSON_INST_FALSE;
|
||||||
|
else if (json->option & MIO_JSON_PERMITWORDKEY) inst = __INST_WORD_STRING; /* internal only */
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mio_seterrbfmt (json->mio, MIO_EINVAL, "invalid word value - %.*js", json->tok.len, json->tok.ptr);
|
mio_seterrbfmt (json->mio, MIO_EINVAL, "invalid word value - %.*js", json->tok.len, json->tok.ptr);
|
||||||
@ -801,6 +815,16 @@ void mio_json_fini (mio_json_t* json)
|
|||||||
}
|
}
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
|
|
||||||
|
mio_bitmask_t mio_json_getoption (mio_json_t* json)
|
||||||
|
{
|
||||||
|
return json->option;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mio_json_setoption (mio_json_t* json, mio_bitmask_t mask)
|
||||||
|
{
|
||||||
|
json->option = mask;
|
||||||
|
}
|
||||||
|
|
||||||
void mio_json_setinstcb (mio_json_t* json, mio_json_instcb_t instcb, void* ctx)
|
void mio_json_setinstcb (mio_json_t* json, mio_json_instcb_t instcb, void* ctx)
|
||||||
{
|
{
|
||||||
json->instcb = instcb;
|
json->instcb = instcb;
|
||||||
|
@ -52,13 +52,13 @@ typedef enum mio_htrd_errnum_t mio_htrd_errnum_t;
|
|||||||
*/
|
*/
|
||||||
enum mio_htrd_option_t
|
enum mio_htrd_option_t
|
||||||
{
|
{
|
||||||
MIO_HTRD_SKIPEMPTYLINES = (1 << 0), /**< skip leading empty lines before the initial line */
|
MIO_HTRD_SKIPEMPTYLINES = ((mio_bitmask_t)1 << 0), /**< skip leading empty lines before the initial line */
|
||||||
MIO_HTRD_SKIPINITIALLINE = (1 << 1), /**< skip processing an initial line */
|
MIO_HTRD_SKIPINITIALLINE = ((mio_bitmask_t)1 << 1), /**< skip processing an initial line */
|
||||||
MIO_HTRD_CANONQPATH = (1 << 2), /**< canonicalize the query path */
|
MIO_HTRD_CANONQPATH = ((mio_bitmask_t)1 << 2), /**< canonicalize the query path */
|
||||||
MIO_HTRD_REQUEST = (1 << 3), /**< parse input as a request */
|
MIO_HTRD_REQUEST = ((mio_bitmask_t)1 << 3), /**< parse input as a request */
|
||||||
MIO_HTRD_RESPONSE = (1 << 4), /**< parse input as a response */
|
MIO_HTRD_RESPONSE = ((mio_bitmask_t)1 << 4), /**< parse input as a response */
|
||||||
MIO_HTRD_TRAILERS = (1 << 5), /**< store trailers in a separate table */
|
MIO_HTRD_TRAILERS = ((mio_bitmask_t)1 << 5), /**< store trailers in a separate table */
|
||||||
MIO_HTRD_STRICT = (1 << 6) /**< be more picky */
|
MIO_HTRD_STRICT = ((mio_bitmask_t)1 << 6) /**< be more picky */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum mio_htrd_option_t mio_htrd_option_t;
|
typedef enum mio_htrd_option_t mio_htrd_option_t;
|
||||||
@ -76,7 +76,7 @@ struct mio_htrd_t
|
|||||||
{
|
{
|
||||||
mio_t* mio;
|
mio_t* mio;
|
||||||
mio_htrd_errnum_t errnum;
|
mio_htrd_errnum_t errnum;
|
||||||
int option;
|
mio_bitmask_t option;
|
||||||
int flags;
|
int flags;
|
||||||
|
|
||||||
mio_htrd_recbs_t recbs;
|
mio_htrd_recbs_t recbs;
|
||||||
@ -153,13 +153,13 @@ MIO_EXPORT void mio_htrd_clear (
|
|||||||
mio_htrd_t* htrd
|
mio_htrd_t* htrd
|
||||||
);
|
);
|
||||||
|
|
||||||
MIO_EXPORT int mio_htrd_getopt (
|
MIO_EXPORT mio_bitmask_t mio_htrd_getoption (
|
||||||
mio_htrd_t* htrd
|
mio_htrd_t* htrd
|
||||||
);
|
);
|
||||||
|
|
||||||
MIO_EXPORT void mio_htrd_setopt (
|
MIO_EXPORT void mio_htrd_setoption (
|
||||||
mio_htrd_t* htrd,
|
mio_htrd_t* htrd,
|
||||||
int opts
|
mio_bitmask_t mask
|
||||||
);
|
);
|
||||||
|
|
||||||
MIO_EXPORT const mio_htrd_recbs_t* mio_htrd_getrecbs (
|
MIO_EXPORT const mio_htrd_recbs_t* mio_htrd_getrecbs (
|
||||||
|
@ -120,16 +120,27 @@ struct mio_json_state_node_t
|
|||||||
mio_json_state_node_t* next;
|
mio_json_state_node_t* next;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum mio_json_option_t
|
||||||
|
{
|
||||||
|
/* allow an unquoted word as an object key */
|
||||||
|
MIO_JSON_PERMITWORDKEY = ((mio_bitmask_t)1 << 0),
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef enum mio_json_option_t mio_json_option_t;
|
||||||
|
|
||||||
|
|
||||||
struct mio_json_t
|
struct mio_json_t
|
||||||
{
|
{
|
||||||
mio_t* mio;
|
mio_t* mio;
|
||||||
mio_json_instcb_t instcb;
|
mio_json_instcb_t instcb;
|
||||||
void* rctx;
|
void* rctx;
|
||||||
|
mio_bitmask_t option;
|
||||||
|
|
||||||
mio_json_state_node_t state_top;
|
mio_json_state_node_t state_top;
|
||||||
mio_json_state_node_t* state_stack;
|
mio_json_state_node_t* state_stack;
|
||||||
mio_oocs_t tok;
|
mio_oocs_t tok;
|
||||||
mio_oow_t tok_capa;
|
mio_oow_t tok_capa;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
@ -208,6 +219,15 @@ static MIO_INLINE void* mio_json_getxtn (mio_json_t* json) { return (void*)(json
|
|||||||
#define mio_json_getxtn(json) ((void*)((mio_json_t*)(json) + 1))
|
#define mio_json_getxtn(json) ((void*)((mio_json_t*)(json) + 1))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
MIO_EXPORT mio_bitmask_t mio_json_getoption (
|
||||||
|
mio_json_t* json
|
||||||
|
);
|
||||||
|
|
||||||
|
MIO_EXPORT void mio_json_setoption (
|
||||||
|
mio_json_t* json,
|
||||||
|
mio_bitmask_t mask
|
||||||
|
);
|
||||||
|
|
||||||
MIO_EXPORT void mio_json_setinstcb (
|
MIO_EXPORT void mio_json_setinstcb (
|
||||||
mio_json_t* json,
|
mio_json_t* json,
|
||||||
mio_json_instcb_t instcb,
|
mio_json_instcb_t instcb,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user