LOCAL W http_connector_rcv_message_body_contentdecode(http_connector_t *connector, http_reqentry_t *entry, http_connector_event *event)
{
W err;
- Bool need_input;
http_contentdecoder_result *result;
if (entry->rcv_reader.body.content_result_consumed == entry->rcv_reader.body.content_result_len) {
- err = http_contentdecoder_outputdata(&entry->rcv_reader.cc, &entry->rcv_reader.body.content_result, &entry->rcv_reader.body.content_result_len, &need_input);
+ err = http_contentdecoder_outputdata(&entry->rcv_reader.cc, &entry->rcv_reader.body.content_result, &entry->rcv_reader.body.content_result_len);
if (err < 0) {
DP_ER("http_contentdecoder_outputdata", err);
return err;
}
- if (need_input != False) {
- entry->rcv_state = RECEIVE_MESSAGE_BODY_TRANSFERDECODE;
- return 0;
- }
}
result = entry->rcv_reader.body.content_result + entry->rcv_reader.body.content_result_consumed;
entry->rcv_reader.body.content_result_consumed++;
event->data.receive_messagebody.bin = result->data;
event->data.receive_messagebody.len = result->len;
return 1;
+ case HTTP_CONTENTDECODER_RESULTTYPE_NEED_INPUT:
+ entry->rcv_state = RECEIVE_MESSAGE_BODY_TRANSFERDECODE;
+ break;
case HTTP_CONTENTDECODER_RESULTTYPE_END:
entry->rcv_state = RECEIVE_MESSAGE_END;
+ break;
}
return 0;
return 0;
}
-LOCAL W http_contentdecoderidentity_outputdata(http_contentdecoderidentity_t *decoder, http_contentdecoder_result **result, W *result_len, Bool *need_next)
+LOCAL W http_contentdecoderidentity_outputdata(http_contentdecoderidentity_t *decoder, http_contentdecoder_result **result, W *result_len)
{
switch (decoder->state) {
case HTTP_CONTENTDECODERIDENTITY_STATE_DATA:
- decoder->result.type = HTTP_CONTENTDECODER_RESULTTYPE_DATA;
- decoder->result.data = decoder->data;
- decoder->result.len = decoder->data_len;
- *result = &decoder->result;
- *result_len = 1;
- *need_next = True;
+ decoder->result[0].type = HTTP_CONTENTDECODER_RESULTTYPE_DATA;
+ decoder->result[0].data = decoder->data;
+ decoder->result[0].len = decoder->data_len;
+ decoder->result[1].type = HTTP_CONTENTDECODER_RESULTTYPE_NEED_INPUT;
+ decoder->result[1].data = NULL;
+ decoder->result[1].len = 0;
+ *result = decoder->result;
+ *result_len = 2;
break;
case HTTP_CONTENTDECODERIDENTITY_STATE_END:
- decoder->result.type = HTTP_CONTENTDECODER_RESULTTYPE_END;
- decoder->result.data = NULL;
- decoder->result.len = 0;
- *result = &decoder->result;
+ decoder->result[0].type = HTTP_CONTENTDECODER_RESULTTYPE_END;
+ decoder->result[0].data = NULL;
+ decoder->result[0].len = 0;
+ *result = decoder->result;
*result_len = 1;
- *need_next = False;
break;
}
return 0;
}
-LOCAL W http_contentdecodergzip_outputdata(http_contentdecodergzip_t *decoder, http_contentdecoder_result **result, W *result_len, Bool *need_input)
+LOCAL W http_contentdecodergzip_outputdata(http_contentdecodergzip_t *decoder, http_contentdecoder_result **result, W *result_len)
{
W err;
switch (decoder->state) {
case HTTP_CONTENTDECODERGZIP_STATE_SKIP_HEADER:
- *need_input = True;
- *result = NULL;
- *result_len = 0;
+ decoder->result[0].type = HTTP_CONTENTDECODER_RESULTTYPE_NEED_INPUT;
+ decoder->result[0].data = NULL;
+ decoder->result[0].len = 0;
+ *result = decoder->result;
+ *result_len = 1;
break;
case HTTP_CONTENTDECODERGZIP_STATE_DECODE:
if (decoder->z.avail_in == 0) {
- *need_input = True;
- *result = NULL;
- *result_len = 0;
+ decoder->result[0].type = HTTP_CONTENTDECODER_RESULTTYPE_NEED_INPUT;
+ decoder->result[0].data = NULL;
+ decoder->result[0].len = 0;
+ *result = decoder->result;
+ *result_len = 1;
break;
}
- *need_input = False;
*result = decoder->result;
decoder->result[0].data = NULL;
decoder->result[0].len = 0;
*result_len = 1;
- *need_input = False;
break;
}
return -1;
}
-EXPORT W http_contentdecoder_outputdata(http_contentdecoder_t *decoder, http_contentdecoder_result **result, W *result_len, Bool *need_input)
+EXPORT W http_contentdecoder_outputdata(http_contentdecoder_t *decoder, http_contentdecoder_result **result, W *result_len)
{
switch (decoder->type) {
case HTTP_CONTENTCODING_VALUE_IDENTITY:
- return http_contentdecoderidentity_outputdata(&decoder->d.identity, result, result_len, need_input);
+ return http_contentdecoderidentity_outputdata(&decoder->d.identity, result, result_len);
case HTTP_CONTENTCODING_VALUE_GZIP:
- return http_contentdecodergzip_outputdata(&decoder->d.gzip, result, result_len, need_input);
+ return http_contentdecodergzip_outputdata(&decoder->d.gzip, result, result_len);
case HTTP_CONTENTCODING_VALUE_COMPRESS: /* unsupported yet */
case HTTP_CONTENTCODING_VALUE_DEFLATE: /* unsupported yet */
}
struct http_contentdecoder_result_ {
enum {
HTTP_CONTENTDECODER_RESULTTYPE_DATA,
+ HTTP_CONTENTDECODER_RESULTTYPE_NEED_INPUT,
HTTP_CONTENTDECODER_RESULTTYPE_END,
} type;
UB *data;
/* Functionality name: http */
/* Detail name: contentdecoderidentity */
struct http_contentdecoderidentity_t_ {
- http_contentdecoder_result result;
+ http_contentdecoder_result result[2];
enum {
HTTP_CONTENTDECODERIDENTITY_STATE_DATA,
HTTP_CONTENTDECODERIDENTITY_STATE_END,
IMPORT VOID http_contentdecoder_finalize(http_contentdecoder_t *decoder);
IMPORT W http_contentdecoder_inputentitybody(http_contentdecoder_t *decoder, UB *data, W data_len);
IMPORT W http_contentdecoder_inputendofdata(http_contentdecoder_t *decoder);
-IMPORT W http_contentdecoder_outputdata(http_contentdecoder_t *decoder, http_contentdecoder_result **result, W *result_len, Bool *need_input);
+IMPORT W http_contentdecoder_outputdata(http_contentdecoder_t *decoder, http_contentdecoder_result **result, W *result_len);
#endif
UNITTEST_RESULT result = UNITTEST_RESULT_PASS;
W i, j, len, ret_len, str_len = 0, cmp, err;
UB *str = NULL;
- Bool end = False, need_input = False, eod = False;
+ Bool end = False, need_input, eod = False;
err = http_contentdecoder_initialize(&decoder, type);
if (err < 0) {
eod = True;
}
for (;;) {
- err = http_contentdecoder_outputdata(&decoder, &ret, &ret_len, &need_input);
+ err = http_contentdecoder_outputdata(&decoder, &ret, &ret_len);
if (err < 0) {
printf("http_contentdecoder_outputdata return value\n");
result = UNITTEST_RESULT_FAIL;
end = True;
break;
}
+ need_input = False;
for (j = 0; j < ret_len; j++) {
if (ret[j].type == HTTP_CONTENTDECODER_RESULTTYPE_DATA) {
str = realloc(str, str_len+ret[j].len);
}
memcpy(str + str_len, ret[j].data, ret[j].len);
str_len += ret[j].len;
+ } else if (ret[j].type == HTTP_CONTENTDECODER_RESULTTYPE_NEED_INPUT) {
+ need_input = True;
+ break;
} else if (ret[j].type == HTTP_CONTENTDECODER_RESULTTYPE_END) {
end = True;
break;