OSDN Git Service

add implied LWS token handling after chunk-size token.
authorornse01 <ornse01@users.sourceforge.jp>
Sun, 24 Jun 2012 08:06:38 +0000 (08:06 +0000)
committerornse01 <ornse01@users.sourceforge.jp>
Sun, 24 Jun 2012 08:06:38 +0000 (08:06 +0000)
git-svn-id: http://svn.sourceforge.jp/svnroot/bchan/bchanf/trunk@508 20a0b8eb-f62a-4a12-8fe1-b598822500fb

src/http/http_transferdecoder.c
src/http/http_transferdecoder.h
src/http/test_http_transferdecoder.c

index d632c8d..2c8e1ed 100644 (file)
@@ -116,6 +116,27 @@ LOCAL HTTP_CHUNKEDBODYPARSER_RESULT http_chunkedbodyparser_inputchar(http_chunke
                        parser->state = HTTP_CHUNKEDBODYPARSER_STATE_CHUNK_SIZE_CR;
                        break;
                }
+               if ((ch == ' ')||(ch == '\t')) {
+                       parser->state = HTTP_CHUNKEDBODYPARSER_STATE_CHUNK_SIZE_IMPLIED_LWS;
+                       break;
+               }
+               return HTTP_CHUNKEDBODYPARSER_RESULT_ERROR;
+       case HTTP_CHUNKEDBODYPARSER_STATE_CHUNK_SIZE_IMPLIED_LWS:
+               if (ch == ';') {
+                       if (parser->chunk_size == 0) {
+                               parser->state = HTTP_CHUNKEDBODYPARSER_STATE_LAST_CHUNK_EXTENTION;
+                       } else {
+                               parser->state = HTTP_CHUNKEDBODYPARSER_STATE_CHUNK_EXTENTION;
+                       }
+                       break;
+               }
+               if (ch == '\r') {
+                       parser->state = HTTP_CHUNKEDBODYPARSER_STATE_CHUNK_SIZE_CR;
+                       break;
+               }
+               if ((ch == ' ')||(ch == '\t')) {
+                       break;
+               }
                return HTTP_CHUNKEDBODYPARSER_RESULT_ERROR;
        case HTTP_CHUNKEDBODYPARSER_STATE_CHUNK_SIZE_CR:
                DP_STATE("CHUNK_SIZE_CR");
index c65b12e..cfae6c5 100644 (file)
@@ -64,6 +64,7 @@ typedef struct http_transferdecoderidentity_t_ http_transferdecoderidentity_t;
 struct http_chunkedbodyparser_t_ {
        enum {
                HTTP_CHUNKEDBODYPARSER_STATE_CHUNK_SIZE,
+               HTTP_CHUNKEDBODYPARSER_STATE_CHUNK_SIZE_IMPLIED_LWS,
                HTTP_CHUNKEDBODYPARSER_STATE_CHUNK_SIZE_CR,
                HTTP_CHUNKEDBODYPARSER_STATE_CHUNK_DATA,
                HTTP_CHUNKEDBODYPARSER_STATE_CHUNK_DATA_END,
index 0cc4a16..486dfd7 100644 (file)
@@ -114,6 +114,42 @@ LOCAL UB testdata_chunked_08[] = {
        "\r\n"
 };
 
+LOCAL UB testdata_chunked_09[] = {
+       "1A \r\n"
+       "abcfefghijklmnopqrstuvwxyz\r\n"
+       "1a   \r\n"
+       "ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n"
+       "000 \r\n"
+       "\r\n"
+};
+
+LOCAL UB testdata_chunked_10[] = {
+       "1a ;name=value\r\n"
+       "abcfefghijklmnopqrstuvwxyz\r\n"
+       "1A  ;name\r\n"
+       "ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n"
+       "0 ;name=value\r\n"
+       "\r\n"
+};
+
+LOCAL UB testdata_chunked_11[] = {
+       "1A\t\r\n"
+       "abcfefghijklmnopqrstuvwxyz\r\n"
+       "1a\t\t\r\n"
+       "ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n"
+       "000\t\r\n"
+       "\r\n"
+};
+
+LOCAL UB testdata_chunked_12[] = {
+       "1a\t;name=value\r\n"
+       "abcfefghijklmnopqrstuvwxyz\r\n"
+       "1A\t\t;name\r\n"
+       "ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n"
+       "0\t;name=value\r\n"
+       "\r\n"
+};
+
 LOCAL UNITTEST_RESULT test_http_transferdecoder_common_perone(HTTP_TRANSFERCODING_TYPE type, UB *testdata, W testdata_len, W devide_len, UB *expected, W expected_len)
 {
        http_transferdecoder_t decoder;
@@ -302,6 +338,42 @@ LOCAL UNITTEST_RESULT test_http_transferdecoder_chunked_8()
        return test_http_transferdecoder_common(HTTP_TRANSFERCODING_TYPE_CHUNKED, testdata, testdata_len, expected, expected_len);
 }
 
+LOCAL UNITTEST_RESULT test_http_transferdecoder_chunked_9()
+{
+       UB *testdata = testdata_chunked_09;
+       W testdata_len = strlen(testdata_chunked_09);
+       UB *expected = testdata_identity_01;
+       W expected_len = strlen(testdata_identity_01);
+       return test_http_transferdecoder_common(HTTP_TRANSFERCODING_TYPE_CHUNKED, testdata, testdata_len, expected, expected_len);
+}
+
+LOCAL UNITTEST_RESULT test_http_transferdecoder_chunked_10()
+{
+       UB *testdata = testdata_chunked_10;
+       W testdata_len = strlen(testdata_chunked_10);
+       UB *expected = testdata_identity_01;
+       W expected_len = strlen(testdata_identity_01);
+       return test_http_transferdecoder_common(HTTP_TRANSFERCODING_TYPE_CHUNKED, testdata, testdata_len, expected, expected_len);
+}
+
+LOCAL UNITTEST_RESULT test_http_transferdecoder_chunked_11()
+{
+       UB *testdata = testdata_chunked_11;
+       W testdata_len = strlen(testdata_chunked_11);
+       UB *expected = testdata_identity_01;
+       W expected_len = strlen(testdata_identity_01);
+       return test_http_transferdecoder_common(HTTP_TRANSFERCODING_TYPE_CHUNKED, testdata, testdata_len, expected, expected_len);
+}
+
+LOCAL UNITTEST_RESULT test_http_transferdecoder_chunked_12()
+{
+       UB *testdata = testdata_chunked_12;
+       W testdata_len = strlen(testdata_chunked_12);
+       UB *expected = testdata_identity_01;
+       W expected_len = strlen(testdata_identity_01);
+       return test_http_transferdecoder_common(HTTP_TRANSFERCODING_TYPE_CHUNKED, testdata, testdata_len, expected, expected_len);
+}
+
 EXPORT VOID test_http_transferdecoder_main(unittest_driver_t *driver)
 {
        UNITTEST_DRIVER_REGIST(driver, test_http_transferdecoder_identity_1);
@@ -313,4 +385,8 @@ EXPORT VOID test_http_transferdecoder_main(unittest_driver_t *driver)
        UNITTEST_DRIVER_REGIST(driver, test_http_transferdecoder_chunked_6);
        UNITTEST_DRIVER_REGIST(driver, test_http_transferdecoder_chunked_7);
        UNITTEST_DRIVER_REGIST(driver, test_http_transferdecoder_chunked_8);
+       UNITTEST_DRIVER_REGIST(driver, test_http_transferdecoder_chunked_9);
+       UNITTEST_DRIVER_REGIST(driver, test_http_transferdecoder_chunked_10);
+       UNITTEST_DRIVER_REGIST(driver, test_http_transferdecoder_chunked_11);
+       UNITTEST_DRIVER_REGIST(driver, test_http_transferdecoder_chunked_12);
 }