Index: net/base/mime_util.cc |
diff --git a/net/base/mime_util.cc b/net/base/mime_util.cc |
index d1e202b5251ec0d3ea3bc44dc641b5a99161a4fc..3e8d6152a6e16e141fabf540422ae865baa08f0f 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" |
@@ -511,6 +513,17 @@ void HashSetToVector(base::hash_set<T>* source, std::vector<T>* target) { |
(*target)[old_target_size + i] = *iter; |
} |
+// Characters to be used for mime multipart boundary. |
+// The RFC 2046 spec says the alphanumeric characters plus the |
+// following characters are legal for boundaries: '()+_,-./:=? |
+// However the following characters, though legal, cause some sites |
+// to fail: (),./:=+ |
Ryan Sleevi
2016/01/08 19:55:04
Sorry, I've been at a conference this week and hav
|
+const char kMimeBoundaryCharacters[] = |
+ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; |
+ |
+// Size of mime multipart boundary. |
+const size_t kMimeBoundarySize = 69; |
+ |
} // namespace |
void GetExtensionsForMimeType( |
@@ -557,6 +570,42 @@ 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 / "'" / "(" / ")" / "+" / |
+ // "_" / "," / "-" / "." / "/" / ":" / "=" / "?" |
+ |
+ std::string result; |
+ result.reserve(kMimeBoundarySize); |
+ result.append("----MultipartBoundary--"); |
+ while (result.size() < (kMimeBoundarySize - 4)) { |
+ // Subtract 2 from the array size to 1) exclude '\0', and 2) turn the size |
+ // into the last index. |
+ const int last_char_index = sizeof(kMimeBoundaryCharacters) - 2; |
+ char c = kMimeBoundaryCharacters[base::RandInt(0, last_char_index)]; |
+ result.push_back(c); |
+ } |
+ result.append("----"); |
+ |
+ // Not a strict requirement - documentation only. |
+ DCHECK_EQ(kMimeBoundarySize, result.size()); |
+ |
+ return result; |
+} |
+ |
void AddMultipartValueForUpload(const std::string& value_name, |
const std::string& value, |
const std::string& mime_boundary, |