OSDN Git Service

change http_contentdecoder_t I/F.
authorornse01 <ornse01@users.sourceforge.jp>
Sun, 5 Feb 2012 03:19:15 +0000 (03:19 +0000)
committerornse01 <ornse01@users.sourceforge.jp>
Sun, 5 Feb 2012 03:19:15 +0000 (03:19 +0000)
- requesting next data to result array.

git-svn-id: http://svn.sourceforge.jp/svnroot/bchan/bchanf/trunk@378 20a0b8eb-f62a-4a12-8fe1-b598822500fb

src/http/http_connector.c
src/http/http_contentdecoder.c
src/http/http_contentdecoder.h
src/http/test_http_contentdecoder.c

index 74d4507..a460092 100644 (file)
@@ -581,19 +581,14 @@ LOCAL W http_connector_rcv_header_end(http_connector_t *connector, http_reqentry
 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++;
@@ -604,8 +599,12 @@ LOCAL W http_connector_rcv_message_body_contentdecode(http_connector_t *connecto
                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;
index 39c2de5..8e8f281 100644 (file)
@@ -60,24 +60,25 @@ LOCAL W http_contentdecoderidentity_inputendofdata(http_contentdecoderidentity_t
        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;
        }
 
@@ -251,24 +252,27 @@ LOCAL W http_contentdecodergzip_inputendofdata(http_contentdecodergzip_t *decode
        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;
 
@@ -303,7 +307,6 @@ LOCAL W http_contentdecodergzip_outputdata(http_contentdecodergzip_t *decoder, h
                decoder->result[0].data = NULL;
                decoder->result[0].len = 0;
                *result_len = 1;
-               *need_input = False;
                break;
        }
 
@@ -367,13 +370,13 @@ EXPORT W http_contentdecoder_inputendofdata(http_contentdecoder_t *decoder)
        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 */
        }
index 87f1adf..96550e8 100644 (file)
@@ -44,6 +44,7 @@
 struct http_contentdecoder_result_ {
        enum {
                HTTP_CONTENTDECODER_RESULTTYPE_DATA,
+               HTTP_CONTENTDECODER_RESULTTYPE_NEED_INPUT,
                HTTP_CONTENTDECODER_RESULTTYPE_END,
        } type;
        UB *data;
@@ -54,7 +55,7 @@ typedef struct http_contentdecoder_result_ http_contentdecoder_result;
 /* 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,
@@ -118,6 +119,6 @@ IMPORT W http_contentdecoder_initialize(http_contentdecoder_t *decoder, HTTP_CON
 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
index c16279b..5e3f52c 100644 (file)
@@ -1146,7 +1146,7 @@ LOCAL UNITTEST_RESULT test_http_contentdecoder_common_perone(HTTP_CONTENTCODING_
        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) {
@@ -1177,13 +1177,14 @@ LOCAL UNITTEST_RESULT test_http_contentdecoder_common_perone(HTTP_CONTENTCODING_
                        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);
@@ -1194,6 +1195,9 @@ LOCAL UNITTEST_RESULT test_http_contentdecoder_common_perone(HTTP_CONTENTCODING_
                                        }
                                        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;