| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "extensions/browser/api/web_request/web_request_api_helpers.h" | 5 #include "extensions/browser/api/web_request/web_request_api_helpers.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 EventResponseDelta* result = | 295 EventResponseDelta* result = |
| 296 new EventResponseDelta(extension_id, extension_install_time); | 296 new EventResponseDelta(extension_id, extension_install_time); |
| 297 result->cancel = cancel; | 297 result->cancel = cancel; |
| 298 result->new_url = new_url; | 298 result->new_url = new_url; |
| 299 | 299 |
| 300 if (!new_response_headers) | 300 if (!new_response_headers) |
| 301 return result; | 301 return result; |
| 302 | 302 |
| 303 // Find deleted headers (header keys are treated case insensitively). | 303 // Find deleted headers (header keys are treated case insensitively). |
| 304 { | 304 { |
| 305 void* iter = NULL; | 305 void* iter = nullptr; |
| 306 std::string name; | 306 std::string name; |
| 307 std::string value; | 307 std::string value; |
| 308 while (old_response_headers->EnumerateHeaderLines(&iter, &name, &value)) { | 308 while (old_response_headers->EnumerateHeaderLines(&iter, &name, &value)) { |
| 309 std::string name_lowercase(name); | 309 std::string name_lowercase(name); |
| 310 base::StringToLowerASCII(&name_lowercase); | 310 base::StringToLowerASCII(&name_lowercase); |
| 311 | 311 |
| 312 bool header_found = false; | 312 bool header_found = false; |
| 313 for (ResponseHeaders::const_iterator i = new_response_headers->begin(); | 313 for (ResponseHeaders::const_iterator i = new_response_headers->begin(); |
| 314 i != new_response_headers->end(); ++i) { | 314 i != new_response_headers->end(); ++i) { |
| 315 if (LowerCaseEqualsASCII(i->first, name_lowercase.c_str()) && | 315 if (LowerCaseEqualsASCII(i->first, name_lowercase.c_str()) && |
| 316 value == i->second) { | 316 value == i->second) { |
| 317 header_found = true; | 317 header_found = true; |
| 318 break; | 318 break; |
| 319 } | 319 } |
| 320 } | 320 } |
| 321 if (!header_found) | 321 if (!header_found) |
| 322 result->deleted_response_headers.push_back(ResponseHeader(name, value)); | 322 result->deleted_response_headers.push_back(ResponseHeader(name, value)); |
| 323 } | 323 } |
| 324 } | 324 } |
| 325 | 325 |
| 326 // Find added headers (header keys are treated case insensitively). | 326 // Find added headers (header keys are treated case insensitively). |
| 327 { | 327 { |
| 328 for (ResponseHeaders::const_iterator i = new_response_headers->begin(); | 328 for (ResponseHeaders::const_iterator i = new_response_headers->begin(); |
| 329 i != new_response_headers->end(); ++i) { | 329 i != new_response_headers->end(); ++i) { |
| 330 void* iter = NULL; | 330 void* iter = nullptr; |
| 331 std::string value; | 331 std::string value; |
| 332 bool header_found = false; | 332 bool header_found = false; |
| 333 while (old_response_headers->EnumerateHeader(&iter, i->first, &value) && | 333 while (old_response_headers->EnumerateHeader(&iter, i->first, &value) && |
| 334 !header_found) { | 334 !header_found) { |
| 335 header_found = (value == i->second); | 335 header_found = (value == i->second); |
| 336 } | 336 } |
| 337 if (!header_found) | 337 if (!header_found) |
| 338 result->added_response_headers.push_back(*i); | 338 result->added_response_headers.push_back(*i); |
| 339 } | 339 } |
| 340 } | 340 } |
| (...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 752 | 752 |
| 753 MergeCookiesInOnBeforeSendHeadersResponses(deltas, request_headers, | 753 MergeCookiesInOnBeforeSendHeadersResponses(deltas, request_headers, |
| 754 conflicting_extensions, net_log); | 754 conflicting_extensions, net_log); |
| 755 } | 755 } |
| 756 | 756 |
| 757 // Retrives all cookies from |override_response_headers|. | 757 // Retrives all cookies from |override_response_headers|. |
| 758 static ParsedResponseCookies GetResponseCookies( | 758 static ParsedResponseCookies GetResponseCookies( |
| 759 scoped_refptr<net::HttpResponseHeaders> override_response_headers) { | 759 scoped_refptr<net::HttpResponseHeaders> override_response_headers) { |
| 760 ParsedResponseCookies result; | 760 ParsedResponseCookies result; |
| 761 | 761 |
| 762 void* iter = NULL; | 762 void* iter = nullptr; |
| 763 std::string value; | 763 std::string value; |
| 764 while (override_response_headers->EnumerateHeader(&iter, "Set-Cookie", | 764 while (override_response_headers->EnumerateHeader(&iter, "Set-Cookie", |
| 765 &value)) { | 765 &value)) { |
| 766 result.push_back(make_linked_ptr(new net::ParsedCookie(value))); | 766 result.push_back(make_linked_ptr(new net::ParsedCookie(value))); |
| 767 } | 767 } |
| 768 return result; | 768 return result; |
| 769 } | 769 } |
| 770 | 770 |
| 771 // Stores all |cookies| in |override_response_headers| deleting previously | 771 // Stores all |cookies| in |override_response_headers| deleting previously |
| 772 // existing cookie definitions. | 772 // existing cookie definitions. |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 954 bool cookie_modifications_exist = false; | 954 bool cookie_modifications_exist = false; |
| 955 EventResponseDeltas::const_reverse_iterator delta; | 955 EventResponseDeltas::const_reverse_iterator delta; |
| 956 for (delta = deltas.rbegin(); delta != deltas.rend(); ++delta) { | 956 for (delta = deltas.rbegin(); delta != deltas.rend(); ++delta) { |
| 957 cookie_modifications_exist |= | 957 cookie_modifications_exist |= |
| 958 !(*delta)->response_cookie_modifications.empty(); | 958 !(*delta)->response_cookie_modifications.empty(); |
| 959 } | 959 } |
| 960 if (!cookie_modifications_exist) | 960 if (!cookie_modifications_exist) |
| 961 return; | 961 return; |
| 962 | 962 |
| 963 // Only create a copy if we really want to modify the response headers. | 963 // Only create a copy if we really want to modify the response headers. |
| 964 if (override_response_headers->get() == NULL) { | 964 if (override_response_headers->get() == nullptr) { |
| 965 *override_response_headers = new net::HttpResponseHeaders( | 965 *override_response_headers = new net::HttpResponseHeaders( |
| 966 original_response_headers->raw_headers()); | 966 original_response_headers->raw_headers()); |
| 967 } | 967 } |
| 968 | 968 |
| 969 ParsedResponseCookies cookies = | 969 ParsedResponseCookies cookies = |
| 970 GetResponseCookies(*override_response_headers); | 970 GetResponseCookies(*override_response_headers); |
| 971 | 971 |
| 972 bool modified = false; | 972 bool modified = false; |
| 973 modified |= MergeAddResponseCookieModifications(deltas, &cookies); | 973 modified |= MergeAddResponseCookieModifications(deltas, &cookies); |
| 974 modified |= MergeEditResponseCookieModifications(deltas, &cookies); | 974 modified |= MergeEditResponseCookieModifications(deltas, &cookies); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1021 | 1021 |
| 1022 // We assume here that the deltas are sorted in decreasing extension | 1022 // We assume here that the deltas are sorted in decreasing extension |
| 1023 // precedence (i.e. decreasing extension installation time). | 1023 // precedence (i.e. decreasing extension installation time). |
| 1024 for (delta = deltas.begin(); delta != deltas.end(); ++delta) { | 1024 for (delta = deltas.begin(); delta != deltas.end(); ++delta) { |
| 1025 if ((*delta)->added_response_headers.empty() && | 1025 if ((*delta)->added_response_headers.empty() && |
| 1026 (*delta)->deleted_response_headers.empty()) { | 1026 (*delta)->deleted_response_headers.empty()) { |
| 1027 continue; | 1027 continue; |
| 1028 } | 1028 } |
| 1029 | 1029 |
| 1030 // Only create a copy if we really want to modify the response headers. | 1030 // Only create a copy if we really want to modify the response headers. |
| 1031 if (override_response_headers->get() == NULL) { | 1031 if (override_response_headers->get() == nullptr) { |
| 1032 *override_response_headers = new net::HttpResponseHeaders( | 1032 *override_response_headers = new net::HttpResponseHeaders( |
| 1033 original_response_headers->raw_headers()); | 1033 original_response_headers->raw_headers()); |
| 1034 } | 1034 } |
| 1035 | 1035 |
| 1036 // We consider modifications as pairs of (delete, add) operations. | 1036 // We consider modifications as pairs of (delete, add) operations. |
| 1037 // If a header is deleted twice by different extensions we assume that the | 1037 // If a header is deleted twice by different extensions we assume that the |
| 1038 // intention was to modify it to different values and consider this a | 1038 // intention was to modify it to different values and consider this a |
| 1039 // conflict. As deltas is sorted by decreasing extension installation order, | 1039 // conflict. As deltas is sorted by decreasing extension installation order, |
| 1040 // this takes care of precedence. | 1040 // this takes care of precedence. |
| 1041 bool extension_conflicts = false; | 1041 bool extension_conflicts = false; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1089 } | 1089 } |
| 1090 | 1090 |
| 1091 MergeCookiesInOnHeadersReceivedResponses(deltas, original_response_headers, | 1091 MergeCookiesInOnHeadersReceivedResponses(deltas, original_response_headers, |
| 1092 override_response_headers, conflicting_extensions, net_log); | 1092 override_response_headers, conflicting_extensions, net_log); |
| 1093 | 1093 |
| 1094 GURL new_url; | 1094 GURL new_url; |
| 1095 MergeRedirectUrlOfResponses( | 1095 MergeRedirectUrlOfResponses( |
| 1096 deltas, &new_url, conflicting_extensions, net_log); | 1096 deltas, &new_url, conflicting_extensions, net_log); |
| 1097 if (new_url.is_valid()) { | 1097 if (new_url.is_valid()) { |
| 1098 // Only create a copy if we really want to modify the response headers. | 1098 // Only create a copy if we really want to modify the response headers. |
| 1099 if (override_response_headers->get() == NULL) { | 1099 if (override_response_headers->get() == nullptr) { |
| 1100 *override_response_headers = new net::HttpResponseHeaders( | 1100 *override_response_headers = new net::HttpResponseHeaders( |
| 1101 original_response_headers->raw_headers()); | 1101 original_response_headers->raw_headers()); |
| 1102 } | 1102 } |
| 1103 (*override_response_headers)->ReplaceStatusLine("HTTP/1.1 302 Found"); | 1103 (*override_response_headers)->ReplaceStatusLine("HTTP/1.1 302 Found"); |
| 1104 (*override_response_headers)->RemoveHeader("location"); | 1104 (*override_response_headers)->RemoveHeader("location"); |
| 1105 (*override_response_headers)->AddHeader("Location: " + new_url.spec()); | 1105 (*override_response_headers)->AddHeader("Location: " + new_url.spec()); |
| 1106 // Explicitly mark the URL as safe for redirection, to prevent the request | 1106 // Explicitly mark the URL as safe for redirection, to prevent the request |
| 1107 // from being blocked because of net::ERR_UNSAFE_REDIRECT. | 1107 // from being blocked because of net::ERR_UNSAFE_REDIRECT. |
| 1108 *allowed_unsafe_redirect_url = new_url; | 1108 *allowed_unsafe_redirect_url = new_url; |
| 1109 } | 1109 } |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1193 for (extensions::ExtensionSet::const_iterator it = extensions.begin(); | 1193 for (extensions::ExtensionSet::const_iterator it = extensions.begin(); |
| 1194 !webrequest_used && it != extensions.end(); | 1194 !webrequest_used && it != extensions.end(); |
| 1195 ++it) { | 1195 ++it) { |
| 1196 webrequest_used |= runtime_data->HasUsedWebRequest(it->get()); | 1196 webrequest_used |= runtime_data->HasUsedWebRequest(it->get()); |
| 1197 } | 1197 } |
| 1198 | 1198 |
| 1199 host->Send(new ExtensionMsg_UsingWebRequestAPI(webrequest_used)); | 1199 host->Send(new ExtensionMsg_UsingWebRequestAPI(webrequest_used)); |
| 1200 } | 1200 } |
| 1201 | 1201 |
| 1202 } // namespace extension_web_request_api_helpers | 1202 } // namespace extension_web_request_api_helpers |
| OLD | NEW |