From 56fef9b6225ffc1ba87f784660eebe842866c57d Mon Sep 17 00:00:00 2001 From: Jesse Ruder Date: Wed, 21 Oct 2015 15:11:47 -0700 Subject: [PATCH] Allow duplicate keys in FormData Summary: Right now `FormData` doesn't allow duplicate keys and uses the last value set for a duplicate key. I tested this in Chrome: ``` var formData = new FormData(); formData.append('key', 'value1'); formData.append('key', 'value2'); var request = new XMLHttpRequest(); request.open("POST", serverUrl); request.send(formData); ``` and the request has both 'value1' and 'value2'. I removed the duplicate key check in `FormData`. If people want to build appending or disallow duplicate keys, they can build either on top of this. Closes https://github.com/facebook/react-native/pull/3556 Reviewed By: svcscm Differential Revision: D2566999 Pulled By: nicklockwood fb-gh-sync-id: 580e52e69376ebe9693e39a386cc540802b6d94f --- Libraries/Network/FormData.js | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/Libraries/Network/FormData.js b/Libraries/Network/FormData.js index ea5d8cc29..b2c4eda5a 100644 --- a/Libraries/Network/FormData.js +++ b/Libraries/Network/FormData.js @@ -47,26 +47,18 @@ type FormDataPart = { */ class FormData { _parts: Array; - _partsByKey: {[key: string]: FormDataNameValuePair}; constructor() { this._parts = []; - this._partsByKey = {}; } append(key: string, value: FormDataValue) { - var parts = this._partsByKey[key]; - if (parts) { - // It's a bit unclear what the behaviour should be in this case. - // The XMLHttpRequest spec doesn't specify it, while MDN says that - // the any new values should appended to existing values. We're not - // doing that for now -- it's tedious and doesn't seem worth the effort. - parts[1] = value; - return; - } - parts = [key, value]; - this._parts.push(parts); - this._partsByKey[key] = parts; + // The XMLHttpRequest spec doesn't specify if duplicate keys are allowed. + // MDN says that any new values should be appended to existing values. + // In any case, major browsers allow duplicate keys, so that's what we'll do + // too. They'll simply get appended as additional form data parts in the + // request body, leaving the server to deal with them. + this._parts.push([key, value]); } getParts(): Array {