Index: third_party/WebKit/Source/platform/network/FormDataEncoder.cpp |
diff --git a/third_party/WebKit/Source/platform/network/FormDataEncoder.cpp b/third_party/WebKit/Source/platform/network/FormDataEncoder.cpp |
index 3b7bd1a6ae9b68fea42a4d58e7395841e81ffe68..a64666be1287745205df7dd751ba85f5a0512272 100644 |
--- a/third_party/WebKit/Source/platform/network/FormDataEncoder.cpp |
+++ b/third_party/WebKit/Source/platform/network/FormDataEncoder.cpp |
@@ -48,6 +48,12 @@ static inline void append(Vector<char>& buffer, const CString& string) |
buffer.append(string.data(), string.length()); |
} |
+static inline void appendPercentEncoded(Vector<char>& buffer, unsigned char c) |
+{ |
+ append(buffer, '%'); |
+ appendByteAsHex(c, buffer); |
+} |
+ |
static void appendQuotedString(Vector<char>& buffer, const CString& string) |
{ |
// Append a string as a quoted value, escaping quotes and line breaks. |
@@ -177,7 +183,7 @@ void FormDataEncoder::finishMultiPartHeader(Vector<char>& buffer) |
append(buffer, "\r\n\r\n"); |
} |
-void FormDataEncoder::addKeyValuePairAsFormData(Vector<char>& buffer, const CString& key, const CString& value, EncodedFormData::EncodingType encodingType) |
+void FormDataEncoder::addKeyValuePairAsFormData(Vector<char>& buffer, const CString& key, const CString& value, EncodedFormData::EncodingType encodingType, Mode mode) |
{ |
if (encodingType == EncodedFormData::TextPlain) { |
if (!buffer.isEmpty()) |
@@ -188,13 +194,13 @@ void FormDataEncoder::addKeyValuePairAsFormData(Vector<char>& buffer, const CStr |
} else { |
if (!buffer.isEmpty()) |
append(buffer, '&'); |
- encodeStringAsFormData(buffer, key); |
+ encodeStringAsFormData(buffer, key, mode); |
append(buffer, '='); |
- encodeStringAsFormData(buffer, value); |
+ encodeStringAsFormData(buffer, value, mode); |
} |
} |
-void FormDataEncoder::encodeStringAsFormData(Vector<char>& buffer, const CString& string) |
+void FormDataEncoder::encodeStringAsFormData(Vector<char>& buffer, const CString& string, Mode mode) |
{ |
// Same safe characters as Netscape for compatibility. |
static const char safeCharacters[] = "-._*"; |
@@ -204,15 +210,20 @@ void FormDataEncoder::encodeStringAsFormData(Vector<char>& buffer, const CString |
for (unsigned i = 0; i < length; ++i) { |
unsigned char c = string.data()[i]; |
- if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || strchr(safeCharacters, c)) { |
+ if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || (c != '\0' && strchr(safeCharacters, c))) { |
append(buffer, c); |
} else if (c == ' ') { |
append(buffer, '+'); |
- } else if (c == '\n' || (c == '\r' && (i + 1 >= length || string.data()[i + 1] != '\n'))) { |
- append(buffer, "%0D%0A"); |
- } else if (c != '\r') { |
- append(buffer, '%'); |
- appendByteAsHex(c, buffer); |
+ } else { |
+ if (mode == NormalizeCRLF) { |
+ if (c == '\n' || (c == '\r' && (i + 1 >= length || string.data()[i + 1] != '\n'))) { |
+ append(buffer, "%0D%0A"); |
+ } else if (c != '\r') { |
+ appendPercentEncoded(buffer, c); |
+ } |
+ } else { |
+ appendPercentEncoded(buffer, c); |
+ } |
} |
} |
} |