Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(320)

Side by Side Diff: net/base/mime_util.cc

Issue 1897033002: Reland 'Convert //net and //chromecast to std::unordered_*' (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix TestDownloadRequestHandler Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/base/address_tracker_linux_unittest.cc ('k') | net/base/network_change_notifier.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <algorithm> 5 #include <algorithm>
6 #include <iterator> 6 #include <iterator>
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 #include <unordered_set>
9 10
10 #include "base/base64.h" 11 #include "base/base64.h"
11 #include "base/containers/hash_tables.h"
12 #include "base/lazy_instance.h" 12 #include "base/lazy_instance.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/rand_util.h" 14 #include "base/rand_util.h"
15 #include "base/stl_util.h" 15 #include "base/stl_util.h"
16 #include "base/strings/string_number_conversions.h" 16 #include "base/strings/string_number_conversions.h"
17 #include "base/strings/string_split.h" 17 #include "base/strings/string_split.h"
18 #include "base/strings/string_util.h" 18 #include "base/strings/string_util.h"
19 #include "base/strings/utf_string_conversions.h" 19 #include "base/strings/utf_string_conversions.h"
20 #include "build/build_config.h" 20 #include "build/build_config.h"
21 #include "net/base/mime_util.h" 21 #include "net/base/mime_util.h"
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 { "image/", kStandardImageTypes, arraysize(kStandardImageTypes) }, 456 { "image/", kStandardImageTypes, arraysize(kStandardImageTypes) },
457 { "audio/", kStandardAudioTypes, arraysize(kStandardAudioTypes) }, 457 { "audio/", kStandardAudioTypes, arraysize(kStandardAudioTypes) },
458 { "video/", kStandardVideoTypes, arraysize(kStandardVideoTypes) }, 458 { "video/", kStandardVideoTypes, arraysize(kStandardVideoTypes) },
459 { NULL, NULL, 0 } 459 { NULL, NULL, 0 }
460 }; 460 };
461 461
462 void GetExtensionsFromHardCodedMappings( 462 void GetExtensionsFromHardCodedMappings(
463 const MimeInfo* mappings, 463 const MimeInfo* mappings,
464 size_t mappings_len, 464 size_t mappings_len,
465 const std::string& leading_mime_type, 465 const std::string& leading_mime_type,
466 base::hash_set<base::FilePath::StringType>* extensions) { 466 std::unordered_set<base::FilePath::StringType>* extensions) {
467 for (size_t i = 0; i < mappings_len; ++i) { 467 for (size_t i = 0; i < mappings_len; ++i) {
468 if (base::StartsWith(mappings[i].mime_type, leading_mime_type, 468 if (base::StartsWith(mappings[i].mime_type, leading_mime_type,
469 base::CompareCase::INSENSITIVE_ASCII)) { 469 base::CompareCase::INSENSITIVE_ASCII)) {
470 for (const base::StringPiece& this_extension : base::SplitStringPiece( 470 for (const base::StringPiece& this_extension : base::SplitStringPiece(
471 mappings[i].extensions, ",", base::TRIM_WHITESPACE, 471 mappings[i].extensions, ",", base::TRIM_WHITESPACE,
472 base::SPLIT_WANT_ALL)) { 472 base::SPLIT_WANT_ALL)) {
473 #if defined(OS_WIN) 473 #if defined(OS_WIN)
474 extensions->insert(base::UTF8ToUTF16(this_extension)); 474 extensions->insert(base::UTF8ToUTF16(this_extension));
475 #else 475 #else
476 extensions->insert(this_extension.as_string()); 476 extensions->insert(this_extension.as_string());
477 #endif 477 #endif
478 } 478 }
479 } 479 }
480 } 480 }
481 } 481 }
482 482
483 void GetExtensionsHelper( 483 void GetExtensionsHelper(
484 const char* const* standard_types, 484 const char* const* standard_types,
485 size_t standard_types_len, 485 size_t standard_types_len,
486 const std::string& leading_mime_type, 486 const std::string& leading_mime_type,
487 base::hash_set<base::FilePath::StringType>* extensions) { 487 std::unordered_set<base::FilePath::StringType>* extensions) {
488 for (size_t i = 0; i < standard_types_len; ++i) { 488 for (size_t i = 0; i < standard_types_len; ++i) {
489 g_mime_util.Get().GetPlatformExtensionsForMimeType(standard_types[i], 489 g_mime_util.Get().GetPlatformExtensionsForMimeType(standard_types[i],
490 extensions); 490 extensions);
491 } 491 }
492 492
493 // Also look up the extensions from hard-coded mappings in case that some 493 // Also look up the extensions from hard-coded mappings in case that some
494 // supported extensions are not registered in the system registry, like ogg. 494 // supported extensions are not registered in the system registry, like ogg.
495 GetExtensionsFromHardCodedMappings(kPrimaryMappings, 495 GetExtensionsFromHardCodedMappings(kPrimaryMappings,
496 arraysize(kPrimaryMappings), 496 arraysize(kPrimaryMappings),
497 leading_mime_type, extensions); 497 leading_mime_type, extensions);
498 498
499 GetExtensionsFromHardCodedMappings(kSecondaryMappings, 499 GetExtensionsFromHardCodedMappings(kSecondaryMappings,
500 arraysize(kSecondaryMappings), 500 arraysize(kSecondaryMappings),
501 leading_mime_type, extensions); 501 leading_mime_type, extensions);
502 } 502 }
503 503
504 // Note that the elements in the source set will be appended to the target 504 // Note that the elements in the source set will be appended to the target
505 // vector. 505 // vector.
506 template<class T> 506 template <class T>
507 void HashSetToVector(base::hash_set<T>* source, std::vector<T>* target) { 507 void UnorderedSetToVector(std::unordered_set<T>* source,
508 std::vector<T>* target) {
508 size_t old_target_size = target->size(); 509 size_t old_target_size = target->size();
509 target->resize(old_target_size + source->size()); 510 target->resize(old_target_size + source->size());
510 size_t i = 0; 511 size_t i = 0;
511 for (typename base::hash_set<T>::iterator iter = source->begin(); 512 for (typename std::unordered_set<T>::iterator iter = source->begin();
512 iter != source->end(); ++iter, ++i) 513 iter != source->end(); ++iter, ++i)
513 (*target)[old_target_size + i] = *iter; 514 (*target)[old_target_size + i] = *iter;
514 } 515 }
515 516
516 // Characters to be used for mime multipart boundary. 517 // Characters to be used for mime multipart boundary.
517 // 518 //
518 // TODO(rsleevi): crbug.com/575779: Follow the spec or fix the spec. 519 // TODO(rsleevi): crbug.com/575779: Follow the spec or fix the spec.
519 // The RFC 2046 spec says the alphanumeric characters plus the 520 // The RFC 2046 spec says the alphanumeric characters plus the
520 // following characters are legal for boundaries: '()+_,-./:=? 521 // following characters are legal for boundaries: '()+_,-./:=?
521 // However the following characters, though legal, cause some sites 522 // However the following characters, though legal, cause some sites
522 // to fail: (),./:=+ 523 // to fail: (),./:=+
523 const char kMimeBoundaryCharacters[] = 524 const char kMimeBoundaryCharacters[] =
524 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 525 "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
525 526
526 // Size of mime multipart boundary. 527 // Size of mime multipart boundary.
527 const size_t kMimeBoundarySize = 69; 528 const size_t kMimeBoundarySize = 69;
528 529
529 } // namespace 530 } // namespace
530 531
531 void GetExtensionsForMimeType( 532 void GetExtensionsForMimeType(
532 const std::string& unsafe_mime_type, 533 const std::string& unsafe_mime_type,
533 std::vector<base::FilePath::StringType>* extensions) { 534 std::vector<base::FilePath::StringType>* extensions) {
534 if (unsafe_mime_type == "*/*" || unsafe_mime_type == "*") 535 if (unsafe_mime_type == "*/*" || unsafe_mime_type == "*")
535 return; 536 return;
536 537
537 const std::string mime_type = base::ToLowerASCII(unsafe_mime_type); 538 const std::string mime_type = base::ToLowerASCII(unsafe_mime_type);
538 base::hash_set<base::FilePath::StringType> unique_extensions; 539 std::unordered_set<base::FilePath::StringType> unique_extensions;
539 540
540 if (base::EndsWith(mime_type, "/*", base::CompareCase::INSENSITIVE_ASCII)) { 541 if (base::EndsWith(mime_type, "/*", base::CompareCase::INSENSITIVE_ASCII)) {
541 std::string leading_mime_type = mime_type.substr(0, mime_type.length() - 1); 542 std::string leading_mime_type = mime_type.substr(0, mime_type.length() - 1);
542 543
543 // Find the matching StandardType from within kStandardTypes, or fall 544 // Find the matching StandardType from within kStandardTypes, or fall
544 // through to the last (default) StandardType. 545 // through to the last (default) StandardType.
545 const StandardType* type = NULL; 546 const StandardType* type = NULL;
546 for (size_t i = 0; i < arraysize(kStandardTypes); ++i) { 547 for (size_t i = 0; i < arraysize(kStandardTypes); ++i) {
547 type = &(kStandardTypes[i]); 548 type = &(kStandardTypes[i]);
548 if (type->leading_mime_type && 549 if (type->leading_mime_type &&
(...skipping 13 matching lines...) Expand all
562 // supported extensions are not registered in the system registry, like ogg. 563 // supported extensions are not registered in the system registry, like ogg.
563 GetExtensionsFromHardCodedMappings(kPrimaryMappings, 564 GetExtensionsFromHardCodedMappings(kPrimaryMappings,
564 arraysize(kPrimaryMappings), mime_type, 565 arraysize(kPrimaryMappings), mime_type,
565 &unique_extensions); 566 &unique_extensions);
566 567
567 GetExtensionsFromHardCodedMappings(kSecondaryMappings, 568 GetExtensionsFromHardCodedMappings(kSecondaryMappings,
568 arraysize(kSecondaryMappings), mime_type, 569 arraysize(kSecondaryMappings), mime_type,
569 &unique_extensions); 570 &unique_extensions);
570 } 571 }
571 572
572 HashSetToVector(&unique_extensions, extensions); 573 UnorderedSetToVector(&unique_extensions, extensions);
573 } 574 }
574 575
575 NET_EXPORT std::string GenerateMimeMultipartBoundary() { 576 NET_EXPORT std::string GenerateMimeMultipartBoundary() {
576 // Based on RFC 1341, section "7.2.1 Multipart: The common syntax": 577 // Based on RFC 1341, section "7.2.1 Multipart: The common syntax":
577 // Because encapsulation boundaries must not appear in the body parts being 578 // Because encapsulation boundaries must not appear in the body parts being
578 // encapsulated, a user agent must exercise care to choose a unique 579 // encapsulated, a user agent must exercise care to choose a unique
579 // boundary. The boundary in the example above could have been the result of 580 // boundary. The boundary in the example above could have been the result of
580 // an algorithm designed to produce boundaries with a very low probability 581 // an algorithm designed to produce boundaries with a very low probability
581 // of already existing in the data to be encapsulated without having to 582 // of already existing in the data to be encapsulated without having to
582 // prescan the data. 583 // prescan the data.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
627 post_data->append("\r\n" + value + "\r\n"); 628 post_data->append("\r\n" + value + "\r\n");
628 } 629 }
629 630
630 void AddMultipartFinalDelimiterForUpload(const std::string& mime_boundary, 631 void AddMultipartFinalDelimiterForUpload(const std::string& mime_boundary,
631 std::string* post_data) { 632 std::string* post_data) {
632 DCHECK(post_data); 633 DCHECK(post_data);
633 post_data->append("--" + mime_boundary + "--\r\n"); 634 post_data->append("--" + mime_boundary + "--\r\n");
634 } 635 }
635 636
636 } // namespace net 637 } // namespace net
OLDNEW
« no previous file with comments | « net/base/address_tracker_linux_unittest.cc ('k') | net/base/network_change_notifier.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698