OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "content/browser/cache_storage/cache_storage_cache.h" | 5 #include "content/browser/cache_storage/cache_storage_cache.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <algorithm> | 8 #include <algorithm> |
9 #include <limits> | 9 #include <limits> |
10 #include <memory> | 10 #include <memory> |
(...skipping 935 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
946 operation.request.url, operation.request.method, | 946 operation.request.url, operation.request.method, |
947 operation.request.headers, operation.request.referrer, | 947 operation.request.headers, operation.request.referrer, |
948 operation.request.is_reload)); | 948 operation.request.is_reload)); |
949 | 949 |
950 // We don't support streaming for cache. | 950 // We don't support streaming for cache. |
951 DCHECK(operation.response.stream_url.is_empty()); | 951 DCHECK(operation.response.stream_url.is_empty()); |
952 // We don't support the body of redirect response. | 952 // We don't support the body of redirect response. |
953 DCHECK(!(operation.response.response_type == | 953 DCHECK(!(operation.response.response_type == |
954 blink::WebServiceWorkerResponseTypeOpaqueRedirect && | 954 blink::WebServiceWorkerResponseTypeOpaqueRedirect && |
955 operation.response.blob_size)); | 955 operation.response.blob_size)); |
956 std::unique_ptr<ServiceWorkerResponse> response(new ServiceWorkerResponse( | |
957 operation.response.url, operation.response.status_code, | |
958 operation.response.status_text, operation.response.response_type, | |
959 operation.response.headers, operation.response.blob_uuid, | |
960 operation.response.blob_size, operation.response.stream_url, | |
961 operation.response.error, operation.response.response_time, | |
962 false /* is_in_cache_storage */, | |
963 std::string() /* cache_storage_cache_name */, | |
964 operation.response.cors_exposed_header_names)); | |
965 | 956 |
957 std::unique_ptr<ServiceWorkerResponse> response( | |
958 new ServiceWorkerResponse(operation.response)); | |
966 std::unique_ptr<storage::BlobDataHandle> blob_data_handle; | 959 std::unique_ptr<storage::BlobDataHandle> blob_data_handle; |
967 | 960 |
968 if (!response->blob_uuid.empty()) { | 961 if (!response->blob_uuid.empty()) { |
969 if (!blob_storage_context_) { | 962 if (!blob_storage_context_) { |
970 callback.Run(CACHE_STORAGE_ERROR_STORAGE); | 963 callback.Run(CACHE_STORAGE_ERROR_STORAGE); |
971 return; | 964 return; |
972 } | 965 } |
973 blob_data_handle = | 966 blob_data_handle = |
974 blob_storage_context_->GetBlobDataFromUUID(response->blob_uuid); | 967 blob_storage_context_->GetBlobDataFromUUID(response->blob_uuid); |
975 if (!blob_data_handle) { | 968 if (!blob_data_handle) { |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1061 proto::CacheHeaderMap* header_map = request_metadata->add_headers(); | 1054 proto::CacheHeaderMap* header_map = request_metadata->add_headers(); |
1062 header_map->set_name(it->first); | 1055 header_map->set_name(it->first); |
1063 header_map->set_value(it->second); | 1056 header_map->set_value(it->second); |
1064 } | 1057 } |
1065 | 1058 |
1066 proto::CacheResponse* response_metadata = metadata.mutable_response(); | 1059 proto::CacheResponse* response_metadata = metadata.mutable_response(); |
1067 response_metadata->set_status_code(put_context->response->status_code); | 1060 response_metadata->set_status_code(put_context->response->status_code); |
1068 response_metadata->set_status_text(put_context->response->status_text); | 1061 response_metadata->set_status_text(put_context->response->status_text); |
1069 response_metadata->set_response_type( | 1062 response_metadata->set_response_type( |
1070 WebResponseTypeToProtoResponseType(put_context->response->response_type)); | 1063 WebResponseTypeToProtoResponseType(put_context->response->response_type)); |
1071 response_metadata->set_url(put_context->response->url.spec()); | 1064 for (const auto& url : put_context->response->url_list) |
1065 response_metadata->add_url_list(url.spec()); | |
1072 response_metadata->set_response_time( | 1066 response_metadata->set_response_time( |
1073 put_context->response->response_time.ToInternalValue()); | 1067 put_context->response->response_time.ToInternalValue()); |
1074 for (ServiceWorkerHeaderMap::const_iterator it = | 1068 for (ServiceWorkerHeaderMap::const_iterator it = |
1075 put_context->response->headers.begin(); | 1069 put_context->response->headers.begin(); |
1076 it != put_context->response->headers.end(); ++it) { | 1070 it != put_context->response->headers.end(); ++it) { |
1077 DCHECK_EQ(std::string::npos, it->first.find('\0')); | 1071 DCHECK_EQ(std::string::npos, it->first.find('\0')); |
1078 DCHECK_EQ(std::string::npos, it->second.find('\0')); | 1072 DCHECK_EQ(std::string::npos, it->second.find('\0')); |
1079 proto::CacheHeaderMap* header_map = response_metadata->add_headers(); | 1073 proto::CacheHeaderMap* header_map = response_metadata->add_headers(); |
1080 header_map->set_name(it->first); | 1074 header_map->set_name(it->first); |
1081 header_map->set_value(it->second); | 1075 header_map->set_value(it->second); |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1400 const proto::CacheHeaderMap header = metadata.request().headers(i); | 1394 const proto::CacheHeaderMap header = metadata.request().headers(i); |
1401 DCHECK_EQ(std::string::npos, header.name().find('\0')); | 1395 DCHECK_EQ(std::string::npos, header.name().find('\0')); |
1402 DCHECK_EQ(std::string::npos, header.value().find('\0')); | 1396 DCHECK_EQ(std::string::npos, header.value().find('\0')); |
1403 request->headers.insert(std::make_pair(header.name(), header.value())); | 1397 request->headers.insert(std::make_pair(header.name(), header.value())); |
1404 } | 1398 } |
1405 } | 1399 } |
1406 | 1400 |
1407 void CacheStorageCache::PopulateResponseMetadata( | 1401 void CacheStorageCache::PopulateResponseMetadata( |
1408 const proto::CacheMetadata& metadata, | 1402 const proto::CacheMetadata& metadata, |
1409 ServiceWorkerResponse* response) { | 1403 ServiceWorkerResponse* response) { |
1410 *response = ServiceWorkerResponse( | 1404 std::unique_ptr<std::vector<GURL>> url_list( |
1411 GURL(metadata.response().url()), metadata.response().status_code(), | 1405 base::MakeUnique<std::vector<GURL>>()); |
1412 metadata.response().status_text(), | 1406 // From Chrome 57, proto::CacheMetadata's url field was deprecated. |
1413 ProtoResponseTypeToWebResponseType(metadata.response().response_type()), | 1407 UMA_HISTOGRAM_BOOLEAN("ServiceWorkerCache.Response.HasDepricatedURL", |
falken
2016/11/30 14:57:37
s/Depricated/Deprecated
Given the size of this CL
horo
2016/12/01 07:42:13
Done.
Added TODO.
| |
1414 ServiceWorkerHeaderMap(), "", 0, GURL(), | 1408 metadata.response().has_url()); |
1415 blink::WebServiceWorkerResponseErrorUnknown, | 1409 if (metadata.response().has_url()) { |
1416 base::Time::FromInternalValue(metadata.response().response_time()), | 1410 url_list->push_back(GURL(metadata.response().url())); |
1417 true /* is_in_cache_storage */, cache_name_, | 1411 } else { |
1418 ServiceWorkerHeaderList( | 1412 url_list->reserve(metadata.response().url_list_size()); |
1419 metadata.response().cors_exposed_header_names().begin(), | 1413 for (int i = 0; i < metadata.response().url_list_size(); ++i) |
1420 metadata.response().cors_exposed_header_names().end())); | 1414 url_list->push_back(GURL(metadata.response().url_list(i))); |
1415 } | |
1421 | 1416 |
1417 std::unique_ptr<ServiceWorkerHeaderMap> headers( | |
1418 base::MakeUnique<ServiceWorkerHeaderMap>()); | |
1422 for (int i = 0; i < metadata.response().headers_size(); ++i) { | 1419 for (int i = 0; i < metadata.response().headers_size(); ++i) { |
1423 const proto::CacheHeaderMap header = metadata.response().headers(i); | 1420 const proto::CacheHeaderMap header = metadata.response().headers(i); |
1424 DCHECK_EQ(std::string::npos, header.name().find('\0')); | 1421 DCHECK_EQ(std::string::npos, header.name().find('\0')); |
1425 DCHECK_EQ(std::string::npos, header.value().find('\0')); | 1422 DCHECK_EQ(std::string::npos, header.value().find('\0')); |
1426 response->headers.insert(std::make_pair(header.name(), header.value())); | 1423 headers->insert(std::make_pair(header.name(), header.value())); |
1427 } | 1424 } |
1425 | |
1426 *response = ServiceWorkerResponse( | |
1427 std::move(url_list), metadata.response().status_code(), | |
1428 metadata.response().status_text(), | |
1429 ProtoResponseTypeToWebResponseType(metadata.response().response_type()), | |
1430 std::move(headers), "", 0, GURL(), | |
1431 blink::WebServiceWorkerResponseErrorUnknown, | |
1432 base::Time::FromInternalValue(metadata.response().response_time()), | |
1433 true /* is_in_cache_storage */, cache_name_, | |
1434 base::MakeUnique<ServiceWorkerHeaderList>( | |
1435 metadata.response().cors_exposed_header_names().begin(), | |
1436 metadata.response().cors_exposed_header_names().end())); | |
1428 } | 1437 } |
1429 | 1438 |
1430 std::unique_ptr<storage::BlobDataHandle> | 1439 std::unique_ptr<storage::BlobDataHandle> |
1431 CacheStorageCache::PopulateResponseBody(disk_cache::ScopedEntryPtr entry, | 1440 CacheStorageCache::PopulateResponseBody(disk_cache::ScopedEntryPtr entry, |
1432 ServiceWorkerResponse* response) { | 1441 ServiceWorkerResponse* response) { |
1433 DCHECK(blob_storage_context_); | 1442 DCHECK(blob_storage_context_); |
1434 | 1443 |
1435 // Create a blob with the response body data. | 1444 // Create a blob with the response body data. |
1436 response->blob_size = entry->GetDataSize(INDEX_RESPONSE_BODY); | 1445 response->blob_size = entry->GetDataSize(INDEX_RESPONSE_BODY); |
1437 response->blob_uuid = base::GenerateGUID(); | 1446 response->blob_uuid = base::GenerateGUID(); |
1438 storage::BlobDataBuilder blob_data(response->blob_uuid); | 1447 storage::BlobDataBuilder blob_data(response->blob_uuid); |
1439 | 1448 |
1440 disk_cache::Entry* temp_entry = entry.get(); | 1449 disk_cache::Entry* temp_entry = entry.get(); |
1441 blob_data.AppendDiskCacheEntryWithSideData( | 1450 blob_data.AppendDiskCacheEntryWithSideData( |
1442 new CacheStorageCacheDataHandle(CreateCacheHandle(), std::move(entry)), | 1451 new CacheStorageCacheDataHandle(CreateCacheHandle(), std::move(entry)), |
1443 temp_entry, INDEX_RESPONSE_BODY, INDEX_SIDE_DATA); | 1452 temp_entry, INDEX_RESPONSE_BODY, INDEX_SIDE_DATA); |
1444 return blob_storage_context_->AddFinishedBlob(&blob_data); | 1453 return blob_storage_context_->AddFinishedBlob(&blob_data); |
1445 } | 1454 } |
1446 | 1455 |
1447 std::unique_ptr<CacheStorageCacheHandle> | 1456 std::unique_ptr<CacheStorageCacheHandle> |
1448 CacheStorageCache::CreateCacheHandle() { | 1457 CacheStorageCache::CreateCacheHandle() { |
1449 return cache_storage_->CreateCacheHandle(this); | 1458 return cache_storage_->CreateCacheHandle(this); |
1450 } | 1459 } |
1451 | 1460 |
1452 } // namespace content | 1461 } // namespace content |
OLD | NEW |