Chromium Code Reviews| 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 <algorithm> | 5 #include <algorithm> |
| 6 #include <iterator> | 6 #include <iterator> |
| 7 #include <map> | 7 #include <map> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/base64.h" | |
| 10 #include "base/containers/hash_tables.h" | 11 #include "base/containers/hash_tables.h" |
| 11 #include "base/lazy_instance.h" | 12 #include "base/lazy_instance.h" |
| 12 #include "base/logging.h" | 13 #include "base/logging.h" |
| 14 #include "base/rand_util.h" | |
| 13 #include "base/stl_util.h" | 15 #include "base/stl_util.h" |
| 14 #include "base/strings/string_number_conversions.h" | 16 #include "base/strings/string_number_conversions.h" |
| 15 #include "base/strings/string_split.h" | 17 #include "base/strings/string_split.h" |
| 16 #include "base/strings/string_util.h" | 18 #include "base/strings/string_util.h" |
| 17 #include "base/strings/utf_string_conversions.h" | 19 #include "base/strings/utf_string_conversions.h" |
| 18 #include "build/build_config.h" | 20 #include "build/build_config.h" |
| 19 #include "net/base/mime_util.h" | 21 #include "net/base/mime_util.h" |
| 20 #include "net/base/platform_mime_util.h" | 22 #include "net/base/platform_mime_util.h" |
| 21 #include "net/http/http_util.h" | 23 #include "net/http/http_util.h" |
| 22 | 24 |
| (...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 554 | 556 |
| 555 GetExtensionsFromHardCodedMappings(secondary_mappings, | 557 GetExtensionsFromHardCodedMappings(secondary_mappings, |
| 556 arraysize(secondary_mappings), | 558 arraysize(secondary_mappings), |
| 557 mime_type, | 559 mime_type, |
| 558 &unique_extensions); | 560 &unique_extensions); |
| 559 } | 561 } |
| 560 | 562 |
| 561 HashSetToVector(&unique_extensions, extensions); | 563 HashSetToVector(&unique_extensions, extensions); |
| 562 } | 564 } |
| 563 | 565 |
| 566 NET_EXPORT std::string GenerateMimeMultipartBoundary() { | |
| 567 // Based on RFC 1341, section "7.2.1 Multipart: The common syntax": | |
| 568 // Because encapsulation boundaries must not appear in the body parts being | |
| 569 // encapsulated, a user agent must exercise care to choose a unique | |
| 570 // boundary. The boundary in the example above could have been the result of | |
| 571 // an algorithm designed to produce boundaries with a very low probability | |
| 572 // of already existing in the data to be encapsulated without having to | |
| 573 // prescan the data. | |
| 574 // [...] | |
| 575 // the boundary parameter [...] consists of 1 to 70 characters from a set of | |
| 576 // characters known to be very robust through email gateways, and NOT ending | |
| 577 // with white space. | |
| 578 // [...] | |
| 579 // boundary := 0*69<bchars> bcharsnospace | |
| 580 // bchars := bcharsnospace / " " | |
| 581 // bcharsnospace := DIGIT / ALPHA / "'" / "(" / ")" / "+" / | |
| 582 // "_" / "," / "-" / "." / "/" / ":" / "=" / "?" | |
| 583 | |
| 584 char random_values[30]; | |
| 585 base::RandBytes(random_values, sizeof(random_values)); | |
| 586 | |
| 587 // Allowed base64 characters are a subset of bcharnospace above: | |
| 588 // base64char := DIGIT / ALPHA / "+" / "/" / "=" | |
| 589 // ("=" is used for padding which won't apply here). | |
| 590 std::string random_base64; | |
| 591 base::Base64Encode(base::StringPiece(random_values, sizeof(random_values)), | |
| 592 &random_base64); | |
| 593 DCHECK_EQ(40u, random_base64.size()); | |
| 594 | |
| 595 std::string result("----MultipartBoundary--"); | |
| 596 result += random_base64; | |
| 597 result += "----"; | |
|
Ryan Sleevi
2015/12/28 23:30:00
pedantry:
result.append(random_base64);
result.app
Łukasz Anforowicz
2015/12/29 18:53:19
Done.
1. I think "append" is slightly better for
Ryan Sleevi
2015/12/29 21:18:03
StringBuilder ALL the things ;)
Łukasz Anforowicz
2015/12/29 22:19:01
Acknowledged.
| |
| 598 return result; | |
| 599 } | |
| 600 | |
| 564 void AddMultipartValueForUpload(const std::string& value_name, | 601 void AddMultipartValueForUpload(const std::string& value_name, |
| 565 const std::string& value, | 602 const std::string& value, |
| 566 const std::string& mime_boundary, | 603 const std::string& mime_boundary, |
| 567 const std::string& content_type, | 604 const std::string& content_type, |
| 568 std::string* post_data) { | 605 std::string* post_data) { |
| 569 DCHECK(post_data); | 606 DCHECK(post_data); |
| 570 // First line is the boundary. | 607 // First line is the boundary. |
| 571 post_data->append("--" + mime_boundary + "\r\n"); | 608 post_data->append("--" + mime_boundary + "\r\n"); |
| 572 // Next line is the Content-disposition. | 609 // Next line is the Content-disposition. |
| 573 post_data->append("Content-Disposition: form-data; name=\"" + | 610 post_data->append("Content-Disposition: form-data; name=\"" + |
| 574 value_name + "\"\r\n"); | 611 value_name + "\"\r\n"); |
| 575 if (!content_type.empty()) { | 612 if (!content_type.empty()) { |
| 576 // If Content-type is specified, the next line is that. | 613 // If Content-type is specified, the next line is that. |
| 577 post_data->append("Content-Type: " + content_type + "\r\n"); | 614 post_data->append("Content-Type: " + content_type + "\r\n"); |
| 578 } | 615 } |
| 579 // Leave an empty line and append the value. | 616 // Leave an empty line and append the value. |
| 580 post_data->append("\r\n" + value + "\r\n"); | 617 post_data->append("\r\n" + value + "\r\n"); |
| 581 } | 618 } |
| 582 | 619 |
| 583 void AddMultipartFinalDelimiterForUpload(const std::string& mime_boundary, | 620 void AddMultipartFinalDelimiterForUpload(const std::string& mime_boundary, |
| 584 std::string* post_data) { | 621 std::string* post_data) { |
| 585 DCHECK(post_data); | 622 DCHECK(post_data); |
| 586 post_data->append("--" + mime_boundary + "--\r\n"); | 623 post_data->append("--" + mime_boundary + "--\r\n"); |
| 587 } | 624 } |
| 588 | 625 |
| 589 } // namespace net | 626 } // namespace net |
| OLD | NEW |