Chromium Code Reviews| Index: net/base/mime_util.cc |
| diff --git a/net/base/mime_util.cc b/net/base/mime_util.cc |
| index 0d511201fd0cdfdda126ad480bc0157e5385e33f..e35a75e80805ec936646f0b5f63b24797e24759b 100644 |
| --- a/net/base/mime_util.cc |
| +++ b/net/base/mime_util.cc |
| @@ -7,9 +7,11 @@ |
| #include <map> |
| #include <string> |
| +#include "base/base64.h" |
| #include "base/containers/hash_tables.h" |
| #include "base/lazy_instance.h" |
| #include "base/logging.h" |
| +#include "base/rand_util.h" |
| #include "base/stl_util.h" |
| #include "base/strings/string_number_conversions.h" |
| #include "base/strings/string_split.h" |
| @@ -561,6 +563,41 @@ void GetExtensionsForMimeType( |
| HashSetToVector(&unique_extensions, extensions); |
| } |
| +NET_EXPORT std::string GenerateMimeMultipartBoundary() { |
| + // Based on RFC 1341, section "7.2.1 Multipart: The common syntax": |
| + // Because encapsulation boundaries must not appear in the body parts being |
| + // encapsulated, a user agent must exercise care to choose a unique |
| + // boundary. The boundary in the example above could have been the result of |
| + // an algorithm designed to produce boundaries with a very low probability |
| + // of already existing in the data to be encapsulated without having to |
| + // prescan the data. |
| + // [...] |
| + // the boundary parameter [...] consists of 1 to 70 characters from a set of |
| + // characters known to be very robust through email gateways, and NOT ending |
| + // with white space. |
| + // [...] |
| + // boundary := 0*69<bchars> bcharsnospace |
| + // bchars := bcharsnospace / " " |
| + // bcharsnospace := DIGIT / ALPHA / "'" / "(" / ")" / "+" / |
| + // "_" / "," / "-" / "." / "/" / ":" / "=" / "?" |
| + |
| + char random_values[30]; |
| + base::RandBytes(random_values, sizeof(random_values)); |
| + |
| + // Allowed base64 characters are a subset of bcharnospace above: |
| + // base64char := DIGIT / ALPHA / "+" / "/" / "=" |
| + // ("=" is used for padding which won't apply here). |
| + std::string random_base64; |
| + base::Base64Encode(base::StringPiece(random_values, sizeof(random_values)), |
| + &random_base64); |
| + DCHECK_EQ(40u, random_base64.size()); |
| + |
| + std::string result("----MultipartBoundary--"); |
| + result += random_base64; |
| + 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.
|
| + return result; |
| +} |
| + |
| void AddMultipartValueForUpload(const std::string& value_name, |
| const std::string& value, |
| const std::string& mime_boundary, |