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 "net/http/http_cache_transaction.h" | 5 #include "net/http/http_cache_transaction.h" |
6 | 6 |
7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
8 | 8 |
9 #if defined(OS_POSIX) | 9 #if defined(OS_POSIX) |
10 #include <unistd.h> | 10 #include <unistd.h> |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
164 } | 164 } |
165 | 165 |
166 // From http://tools.ietf.org/html/draft-ietf-httpbis-p6-cache-21#section-6 | 166 // From http://tools.ietf.org/html/draft-ietf-httpbis-p6-cache-21#section-6 |
167 // a "non-error response" is one with a 2xx (Successful) or 3xx | 167 // a "non-error response" is one with a 2xx (Successful) or 3xx |
168 // (Redirection) status code. | 168 // (Redirection) status code. |
169 bool NonErrorResponse(int status_code) { | 169 bool NonErrorResponse(int status_code) { |
170 int status_code_range = status_code / 100; | 170 int status_code_range = status_code / 100; |
171 return status_code_range == 2 || status_code_range == 3; | 171 return status_code_range == 2 || status_code_range == 3; |
172 } | 172 } |
173 | 173 |
174 // Return true if |method| is considered safe, or false if |method| is unsafe or | |
Adam Rice
2015/04/24 13:19:21
A reference to RFC7231 section 4.2.1 would be help
haavardm
2015/04/27 10:48:35
Done.
| |
175 // the safety is not known. | |
176 bool SafeHTTPMethod(const std::string& method) { | |
Adam Rice
2015/04/24 13:19:21
Nitpick: capitalisation should be SafeHttpMethod.
haavardm
2015/04/27 10:48:35
Done.
| |
177 if (method == "GET" || method == "HEAD" || method == "OPTIONS" || | |
178 method == "TRACE") { | |
179 return true; | |
180 } | |
181 return false; | |
182 } | |
183 | |
174 // Error codes that will be considered indicative of a page being offline/ | 184 // Error codes that will be considered indicative of a page being offline/ |
175 // unreachable for LOAD_FROM_CACHE_IF_OFFLINE. | 185 // unreachable for LOAD_FROM_CACHE_IF_OFFLINE. |
176 bool IsOfflineError(int error) { | 186 bool IsOfflineError(int error) { |
177 return (error == net::ERR_NAME_NOT_RESOLVED || | 187 return (error == net::ERR_NAME_NOT_RESOLVED || |
178 error == net::ERR_INTERNET_DISCONNECTED || | 188 error == net::ERR_INTERNET_DISCONNECTED || |
179 error == net::ERR_ADDRESS_UNREACHABLE || | 189 error == net::ERR_ADDRESS_UNREACHABLE || |
180 error == net::ERR_CONNECTION_TIMED_OUT); | 190 error == net::ERR_CONNECTION_TIMED_OUT); |
181 } | 191 } |
182 | 192 |
183 // Enum for UMA, indicating the status (with regard to offline mode) of | 193 // Enum for UMA, indicating the status (with regard to offline mode) of |
(...skipping 1047 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1231 (request_->method == "PUT" || request_->method == "DELETE")) { | 1241 (request_->method == "PUT" || request_->method == "DELETE")) { |
1232 if (NonErrorResponse(new_response->headers->response_code())) { | 1242 if (NonErrorResponse(new_response->headers->response_code())) { |
1233 int ret = cache_->DoomEntry(cache_key_, NULL); | 1243 int ret = cache_->DoomEntry(cache_key_, NULL); |
1234 DCHECK_EQ(OK, ret); | 1244 DCHECK_EQ(OK, ret); |
1235 } | 1245 } |
1236 cache_->DoneWritingToEntry(entry_, true); | 1246 cache_->DoneWritingToEntry(entry_, true); |
1237 entry_ = NULL; | 1247 entry_ = NULL; |
1238 mode_ = NONE; | 1248 mode_ = NONE; |
1239 } | 1249 } |
1240 | 1250 |
1251 // If this is a successful request having a unsafe method, invalidate | |
1252 // the URL given in the Content-Location header if it has the same origin as | |
1253 // |request_->url|. | |
1254 if (!SafeHTTPMethod(request_->method) && | |
1255 NonErrorResponse(new_response->headers->response_code())) { | |
1256 std::string content_location; | |
1257 if (new_response_->headers->EnumerateHeader(NULL, "Content-Location", | |
1258 &content_location)) { | |
1259 GURL absolute_location_url = request_->url.Resolve(content_location); | |
1260 if (absolute_location_url.is_valid() && | |
1261 absolute_location_url.host() == request_->url.host()) { | |
1262 cache_->DoomMainEntryForUrl(absolute_location_url); | |
1263 } | |
1264 } | |
1265 } | |
1266 | |
1241 // Invalidate any cached GET with a successful POST. | 1267 // Invalidate any cached GET with a successful POST. |
1242 if (!(effective_load_flags_ & LOAD_DISABLE_CACHE) && | 1268 if (!(effective_load_flags_ & LOAD_DISABLE_CACHE) && |
1243 request_->method == "POST" && | 1269 request_->method == "POST" && |
1244 NonErrorResponse(new_response->headers->response_code())) { | 1270 NonErrorResponse(new_response->headers->response_code())) { |
1245 cache_->DoomMainEntryForUrl(request_->url); | 1271 cache_->DoomMainEntryForUrl(request_->url); |
1246 } | 1272 } |
1247 | 1273 |
1248 RecordNoStoreHeaderHistogram(request_->load_flags, new_response); | 1274 RecordNoStoreHeaderHistogram(request_->load_flags, new_response); |
1249 | 1275 |
1250 if (new_response_->headers->response_code() == 416 && | 1276 if (new_response_->headers->response_code() == 416 && |
(...skipping 1781 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3032 default: | 3058 default: |
3033 NOTREACHED(); | 3059 NOTREACHED(); |
3034 } | 3060 } |
3035 } | 3061 } |
3036 | 3062 |
3037 void HttpCache::Transaction::OnIOComplete(int result) { | 3063 void HttpCache::Transaction::OnIOComplete(int result) { |
3038 DoLoop(result); | 3064 DoLoop(result); |
3039 } | 3065 } |
3040 | 3066 |
3041 } // namespace net | 3067 } // namespace net |
OLD | NEW |