17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file. 47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/nacl_http_response_headers.h" 67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <string> 87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Test that we are able to discover the cache validator headers. 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST(NaClHttpResponseHeadersTest, TestGetValidators) { 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Test a single (weak) ETag. 147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string one_val_headers("Date: Wed, 15 Nov 1995 06:25:24 GMT\n" 157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Server: Apache/2.0.52 (CentOS)\n" 167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Content-Type: text/plain; charset=UTF-8\n" 177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Connection: close\n" 187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Accept-Ranges: bytes\n" 197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "ETag: w\"abcdefg\"\n" 207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Content-Length: 2912652\n"); 217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string one_val_expected("etag:w\"abcdefg\""); 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) plugin::NaClHttpResponseHeaders parser_1; 237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) parser_1.Parse(one_val_headers); 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(one_val_expected, parser_1.GetCacheValidators()); 257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(std::string("w\"abcdefg\""), parser_1.GetHeader("etag")); 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(std::string(), parser_1.GetHeader("last-modified")); 277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Test a Last-Modified Header. 297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string mod_val_headers("Date: Wed, 15 Nov 1995 06:25:24 GMT\n" 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Server: Apache/2.0.52 (CentOS)\n" 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Content-Type: text/plain; charset=UTF-8\n" 327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Connection: close\n" 337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Accept-Ranges: bytes\n" 347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT\n" 357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Content-Length: 2912652\n"); 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string mod_val_expected("last-modified:Wed, 15 Nov 1995 04:58:08 GMT"); 377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) plugin::NaClHttpResponseHeaders parser_1b; 387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) parser_1b.Parse(mod_val_headers); 397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(mod_val_expected, parser_1b.GetCacheValidators()); 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(std::string("Wed, 15 Nov 1995 04:58:08 GMT"), 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parser_1b.GetHeader("last-modified")); 427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Test both (strong) ETag and Last-Modified, with some whitespace. 447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string two_val_headers("Date: Wed, 15 Nov 1995 06:25:24 GMT\n" 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Last-modified: Wed, 15 Nov 1995 04:58:08 GMT\n" 467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Server: Apache/2.0.52 (CentOS)\n" 477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "etag \t :\t \"/abcdefg:A-Z0-9+/==\"\n" 487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Content-Type: text/plain; charset=UTF-8\n" 497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "cache-control: no-cache\n" 507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Connection: close\n" 517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Accept-Ranges: bytes\n" 527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Content-Length: 2912652\n"); 537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Note that the value can still have white-space. 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string two_val_expected("etag:\"/abcdefg:A-Z0-9+/==\"&" 557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "last-modified:Wed, 15 Nov 1995 04:58:08 GMT"); 567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) plugin::NaClHttpResponseHeaders parser_2; 577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) parser_2.Parse(two_val_headers); 587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(two_val_expected, parser_2.GetCacheValidators()); 597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(std::string("\"/abcdefg:A-Z0-9+/==\""), 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parser_2.GetHeader("etag")); 617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Some etag generators like python HTTP server use ' instead of " 637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string single_q_headers("Date: Wed, 15 Nov 1995 06:25:24 GMT\n" 647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Server: BaseHTTP/0.3 Python/2.7.3\n" 657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "ETag: '/usr/local/some_file.nmf'\n"); 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string single_q_expected("etag:'/usr/local/some_file.nmf'"); 677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) plugin::NaClHttpResponseHeaders parser_3; 687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) parser_3.Parse(single_q_headers); 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(single_q_expected, parser_3.GetCacheValidators()); 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(std::string("'/usr/local/some_file.nmf'"), 717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parser_3.GetHeader("etag")); 727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Keys w/ leading whitespace are invalid. 747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // See: HttpResponseHeadersTest.NormalizeHeadersLeadingWhitespace. 757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string bad_headers("Date: Wed, 15 Nov 1995 06:25:24 GMT\n" 767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Server: BaseHTTP/0.3 Python/2.7.3\n" 777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) " ETag: '/usr/local/some_file.nmf'\n"); 787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string bad_expected(""); 797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) plugin::NaClHttpResponseHeaders parser_4; 807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) parser_4.Parse(bad_headers); 817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(bad_expected, parser_4.GetCacheValidators()); 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(bad_expected, parser_4.GetHeader("etag")); 837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Test that we are able to determine when there is a no-store 867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Cache-Control header, among all the Cache-Control headers. 877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST(NaClHttpResponseHeadersTest, TestFindNoStore) { 887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Say that there isn't one, when there isn't one. 897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string headers_0("Date: Wed, 15 Nov 1995 06:25:24 GMT\n" 907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT\n" 917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "ETag: '/tmp/blah.nmf'\n" 927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Cache-Control: max-age=3600\n"); 937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) plugin::NaClHttpResponseHeaders parser_0; 947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) parser_0.Parse(headers_0); 957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(parser_0.CacheControlNoStore()); 967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Say that there is one, when there is one. 987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string headers_1("Date: Wed, 15 Nov 1995 06:25:24 GMT\n" 997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT\n" 1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "ETag: \"/abcdefgA-Z0-9+/\"\n" 1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Cache-Control: no-store\n"); 1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) plugin::NaClHttpResponseHeaders parser_1; 1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) parser_1.Parse(headers_1); 1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_TRUE(parser_1.CacheControlNoStore()); 1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Say that there is one, when comma separated. 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string headers_2("Date: Wed, 15 Nov 1995 06:25:24 GMT\n" 1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT\n" 1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "ETag: \"/abcdefgA-Z0-9+/\"\n" 1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Cache-Control: no-store, no-cache\n"); 1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) plugin::NaClHttpResponseHeaders parser_2; 1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) parser_2.Parse(headers_2); 1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_TRUE(parser_2.CacheControlNoStore()); 1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Comma separated, in a different position. 1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string headers_3("Date: Wed, 15 Nov 1995 06:25:24 GMT\n" 1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT\n" 1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "ETag: \"/abcdefgA-Z0-9+/\"\n" 1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Cache-control: no-cache, max-age=60, no-store\n"); 1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) plugin::NaClHttpResponseHeaders parser_3; 1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) parser_3.Parse(headers_3); 1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_TRUE(parser_3.CacheControlNoStore()); 1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Test multiple cache-control lines, plus extra space before colon. 1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string headers_4("Date: Wed, 15 Nov 1995 06:25:24 GMT\n" 1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT\n" 1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "ETag: \"/abcdefgA-Z0-9+/\"\n" 1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "cache-control: no-cache\n" 1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "cache-control \t : max-age=60, no-store, max-stale\n"); 1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) plugin::NaClHttpResponseHeaders parser_4; 1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) parser_4.Parse(headers_4); 1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_TRUE(parser_4.CacheControlNoStore()); 1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Test with extra whitespace, in the values. 1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string headers_5("Date: Wed, 15 Nov 1995 06:25:24 GMT \n" 1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT \n" 1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "ETag: \"/abcdefgA-Z0-9+/\" \n" 1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ": empty key \n" 1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ": empty key2 \n" 1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Blank-Header : \n" 1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "Connection: close\n" 1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "cache-control:max-age=60, no-store \n" 1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "cache-control: no-cache\n"); 1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) plugin::NaClHttpResponseHeaders parser_5; 1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) parser_5.Parse(headers_5); 1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_TRUE(parser_5.CacheControlNoStore()); 1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 148