| OLD | NEW | 
|    1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |    1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 
|    2 // Use of this source code is governed by a BSD-style license that can be |    2 // Use of this source code is governed by a BSD-style license that can be | 
|    3 // found in the LICENSE file. |    3 // found in the LICENSE file. | 
|    4  |    4  | 
|    5 #include <algorithm> |    5 #include <algorithm> | 
|    6  |    6  | 
|    7 #include "base/basictypes.h" |    7 #include "base/basictypes.h" | 
|    8 #include "net/http/http_util.h" |    8 #include "net/http/http_util.h" | 
|    9 #include "testing/gtest/include/gtest/gtest.h" |    9 #include "testing/gtest/include/gtest/gtest.h" | 
|   10  |   10  | 
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  117 TEST(HttpUtilTest, AssembleRawHeaders) { |  117 TEST(HttpUtilTest, AssembleRawHeaders) { | 
|  118   struct { |  118   struct { | 
|  119     const char* input; |  119     const char* input; | 
|  120     const char* expected_result;  // with '\0' changed to '|' |  120     const char* expected_result;  // with '\0' changed to '|' | 
|  121   } tests[] = { |  121   } tests[] = { | 
|  122     { "HTTP/1.0 200 OK\r\nFoo: 1\r\nBar: 2\r\n\r\n", |  122     { "HTTP/1.0 200 OK\r\nFoo: 1\r\nBar: 2\r\n\r\n", | 
|  123       "HTTP/1.0 200 OK|Foo: 1|Bar: 2||" }, |  123       "HTTP/1.0 200 OK|Foo: 1|Bar: 2||" }, | 
|  124  |  124  | 
|  125     { "HTTP/1.0 200 OK\nFoo: 1\nBar: 2\n\n", |  125     { "HTTP/1.0 200 OK\nFoo: 1\nBar: 2\n\n", | 
|  126       "HTTP/1.0 200 OK|Foo: 1|Bar: 2||" }, |  126       "HTTP/1.0 200 OK|Foo: 1|Bar: 2||" }, | 
 |  127  | 
 |  128     // Valid line continuation (single SP). | 
 |  129     { | 
 |  130       "HTTP/1.0 200 OK\n" | 
 |  131       "Foo: 1\n" | 
 |  132       " continuation\n" | 
 |  133       "Bar: 2\n\n", | 
 |  134  | 
 |  135       "HTTP/1.0 200 OK|" | 
 |  136       "Foo: 1 continuation|" | 
 |  137       "Bar: 2||" | 
 |  138     }, | 
 |  139  | 
 |  140     // Valid line continuation (single HT). | 
 |  141     { | 
 |  142       "HTTP/1.0 200 OK\n" | 
 |  143       "Foo: 1\n" | 
 |  144       "\tcontinuation\n" | 
 |  145       "Bar: 2\n\n", | 
 |  146  | 
 |  147       "HTTP/1.0 200 OK|" | 
 |  148       "Foo: 1\tcontinuation|" | 
 |  149       "Bar: 2||" | 
 |  150     }, | 
 |  151  | 
 |  152     // Valid line continuation (multiple SP). | 
 |  153     { | 
 |  154       "HTTP/1.0 200 OK\n" | 
 |  155       "Foo: 1\n" | 
 |  156       "   continuation\n" | 
 |  157       "Bar: 2\n\n", | 
 |  158  | 
 |  159       "HTTP/1.0 200 OK|" | 
 |  160       "Foo: 1   continuation|" | 
 |  161       "Bar: 2||" | 
 |  162     }, | 
 |  163  | 
 |  164     // Valid line continuation (multiple HT). | 
 |  165     { | 
 |  166       "HTTP/1.0 200 OK\n" | 
 |  167       "Foo: 1\n" | 
 |  168       "\t\t\tcontinuation\n" | 
 |  169       "Bar: 2\n\n", | 
 |  170  | 
 |  171       "HTTP/1.0 200 OK|" | 
 |  172       "Foo: 1\t\t\tcontinuation|" | 
 |  173       "Bar: 2||" | 
 |  174     }, | 
 |  175  | 
 |  176     // Valid line continuation (mixed HT, SP). | 
 |  177     { | 
 |  178       "HTTP/1.0 200 OK\n" | 
 |  179       "Foo: 1\n" | 
 |  180       " \t \t continuation\n" | 
 |  181       "Bar: 2\n\n", | 
 |  182  | 
 |  183       "HTTP/1.0 200 OK|" | 
 |  184       "Foo: 1 \t \t continuation|" | 
 |  185       "Bar: 2||" | 
 |  186     }, | 
 |  187  | 
 |  188     // Valid multi-line continuation | 
 |  189     { | 
 |  190       "HTTP/1.0 200 OK\n" | 
 |  191       "Foo: 1\n" | 
 |  192       " continuation1\n" | 
 |  193       "\tcontinuation2\n" | 
 |  194       "  continuation3\n" | 
 |  195       "Bar: 2\n\n", | 
 |  196  | 
 |  197       "HTTP/1.0 200 OK|" | 
 |  198       "Foo: 1 continuation1\tcontinuation2  continuation3|" | 
 |  199       "Bar: 2||" | 
 |  200     }, | 
 |  201  | 
 |  202     // Valid line continuation (No value bytes in first line). | 
 |  203     { | 
 |  204       "HTTP/1.0 200 OK\n" | 
 |  205       "Foo:\n" | 
 |  206       " value\n" | 
 |  207       "Bar: 2\n\n", | 
 |  208  | 
 |  209       "HTTP/1.0 200 OK|" | 
 |  210       "Foo: value|" | 
 |  211       "Bar: 2||" | 
 |  212     }, | 
 |  213  | 
 |  214     // Not a line continuation (can't continue status line). | 
 |  215     { | 
 |  216       "HTTP/1.0 200 OK\n" | 
 |  217       " Foo: 1\n" | 
 |  218       "Bar: 2\n\n", | 
 |  219  | 
 |  220       "HTTP/1.0 200 OK|" | 
 |  221       " Foo: 1|" | 
 |  222       "Bar: 2||" | 
 |  223     }, | 
 |  224  | 
 |  225     // Not a line continuation (can't continue status line). | 
 |  226     { | 
 |  227       "HTTP/1.0\n" | 
 |  228       " 200 OK\n" | 
 |  229       "Foo: 1\n" | 
 |  230       "Bar: 2\n\n", | 
 |  231  | 
 |  232       "HTTP/1.0|" | 
 |  233       " 200 OK|" | 
 |  234       "Foo: 1|" | 
 |  235       "Bar: 2||" | 
 |  236     }, | 
 |  237  | 
 |  238     // Not a line continuation (can't continue status line). | 
 |  239     { | 
 |  240       "HTTP/1.0 404\n" | 
 |  241       " Not Found\n" | 
 |  242       "Foo: 1\n" | 
 |  243       "Bar: 2\n\n", | 
 |  244  | 
 |  245       "HTTP/1.0 404|" | 
 |  246       " Not Found|" | 
 |  247       "Foo: 1|" | 
 |  248       "Bar: 2||" | 
 |  249     }, | 
 |  250  | 
 |  251     // Unterminated status line. | 
 |  252     { | 
 |  253       "HTTP/1.0 200 OK", | 
 |  254        | 
 |  255       "HTTP/1.0 200 OK||" | 
 |  256     }, | 
 |  257  | 
 |  258     // Single terminated, with headers | 
 |  259     { | 
 |  260       "HTTP/1.0 200 OK\n" | 
 |  261       "Foo: 1\n" | 
 |  262       "Bar: 2\n", | 
 |  263  | 
 |  264       "HTTP/1.0 200 OK|" | 
 |  265       "Foo: 1|" | 
 |  266       "Bar: 2||" | 
 |  267     }, | 
 |  268  | 
 |  269     // Not terminated, with headers | 
 |  270     { | 
 |  271       "HTTP/1.0 200 OK\n" | 
 |  272       "Foo: 1\n" | 
 |  273       "Bar: 2", | 
 |  274  | 
 |  275       "HTTP/1.0 200 OK|" | 
 |  276       "Foo: 1|" | 
 |  277       "Bar: 2||" | 
 |  278     }, | 
 |  279  | 
 |  280     // Not a line continuation (VT) | 
 |  281     { | 
 |  282       "HTTP/1.0 200 OK\n" | 
 |  283       "Foo: 1\n" | 
 |  284       "\vInvalidContinuation\n" | 
 |  285       "Bar: 2\n\n", | 
 |  286  | 
 |  287       "HTTP/1.0 200 OK|" | 
 |  288       "Foo: 1|" | 
 |  289       "\vInvalidContinuation|" | 
 |  290       "Bar: 2||" | 
 |  291     }, | 
 |  292  | 
 |  293     // Not a line continuation (formfeed) | 
 |  294     { | 
 |  295       "HTTP/1.0 200 OK\n" | 
 |  296       "Foo: 1\n" | 
 |  297       "\fInvalidContinuation\n" | 
 |  298       "Bar: 2\n\n", | 
 |  299  | 
 |  300       "HTTP/1.0 200 OK|" | 
 |  301       "Foo: 1|" | 
 |  302       "\fInvalidContinuation|" | 
 |  303       "Bar: 2||" | 
 |  304     }, | 
 |  305  | 
 |  306     // Not a line continuation -- can't continue header names. | 
 |  307     { | 
 |  308       "HTTP/1.0 200 OK\n" | 
 |  309       "Serv\n" | 
 |  310       " er: Apache\n" | 
 |  311       "\tInvalidContinuation\n" | 
 |  312       "Bar: 2\n\n", | 
 |  313  | 
 |  314       "HTTP/1.0 200 OK|" | 
 |  315       "Serv|" | 
 |  316       " er: Apache|" | 
 |  317       "\tInvalidContinuation|" | 
 |  318       "Bar: 2||" | 
 |  319     }, | 
 |  320  | 
 |  321     // Not a line continuation -- no value to continue. | 
 |  322     { | 
 |  323       "HTTP/1.0 200 OK\n" | 
 |  324       "Foo: 1\n" | 
 |  325       "garbage\n" | 
 |  326       "  not-a-continuation\n" | 
 |  327       "Bar: 2\n\n", | 
 |  328  | 
 |  329       "HTTP/1.0 200 OK|" | 
 |  330       "Foo: 1|" | 
 |  331       "garbage|" | 
 |  332       "  not-a-continuation|" | 
 |  333       "Bar: 2||", | 
 |  334     }, | 
 |  335  | 
 |  336     // Not a line continuation -- no valid name. | 
 |  337     { | 
 |  338       "HTTP/1.0 200 OK\n" | 
 |  339       ": 1\n" | 
 |  340       "  garbage\n" | 
 |  341       "Bar: 2\n\n", | 
 |  342  | 
 |  343       "HTTP/1.0 200 OK|" | 
 |  344       ": 1|" | 
 |  345       "  garbage|" | 
 |  346       "Bar: 2||", | 
 |  347     }, | 
 |  348  | 
 |  349     // Not a line continuation -- no valid name (whitespace) | 
 |  350     { | 
 |  351       "HTTP/1.0 200 OK\n" | 
 |  352       "   : 1\n" | 
 |  353       "  garbage\n" | 
 |  354       "Bar: 2\n\n", | 
 |  355  | 
 |  356       "HTTP/1.0 200 OK|" | 
 |  357       "   : 1|" | 
 |  358       "  garbage|" | 
 |  359       "Bar: 2||", | 
 |  360     }, | 
 |  361  | 
|  127   }; |  362   }; | 
|  128   for (size_t i = 0; i < arraysize(tests); ++i) { |  363   for (size_t i = 0; i < arraysize(tests); ++i) { | 
|  129     int input_len = static_cast<int>(strlen(tests[i].input)); |  364     int input_len = static_cast<int>(strlen(tests[i].input)); | 
|  130     std::string raw = HttpUtil::AssembleRawHeaders(tests[i].input, input_len); |  365     std::string raw = HttpUtil::AssembleRawHeaders(tests[i].input, input_len); | 
|  131     std::replace(raw.begin(), raw.end(), '\0', '|'); |  366     std::replace(raw.begin(), raw.end(), '\0', '|'); | 
|  132     EXPECT_TRUE(raw == tests[i].expected_result); |  367     EXPECT_TRUE(raw == tests[i].expected_result); | 
|  133   } |  368   } | 
|  134 } |  369 } | 
|  135  |  370  | 
| OLD | NEW |