From 2c0fb83abbb833e468573a52588a04b736adee2a Mon Sep 17 00:00:00 2001 From: Jeremiah Megel Date: Wed, 8 Aug 2018 12:34:05 -0500 Subject: [PATCH] Allow for nested params --- .../github/kevinsawicki/http/HttpRequest.java | 54 ++++++++++++++++--- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/lib/src/main/java/com/github/kevinsawicki/http/HttpRequest.java b/lib/src/main/java/com/github/kevinsawicki/http/HttpRequest.java index d8876ba2..04f1897f 100644 --- a/lib/src/main/java/com/github/kevinsawicki/http/HttpRequest.java +++ b/lib/src/main/java/com/github/kevinsawicki/http/HttpRequest.java @@ -3141,6 +3141,25 @@ public HttpRequest form(final Object name, final Object value) */ public HttpRequest form(final Object name, final Object value, String charset) throws HttpRequestException { + List names = new ArrayList(); + names.add(name); + return form(names, value, charset); + } + + /** + * Write the name/value pair as form data to the request body + *

+ * The values specified will be URL-encoded and sent with the + * 'application/x-www-form-urlencoded' content-type + * + * @param names Name of param, as a list of ancestors + * @param value + * @param charset + * @return this request + * @throws HttpRequestException + */ + public HttpRequest form(final List names, final Object value, String charset) + throws HttpRequestException { final boolean first = !form; if (first) { contentType(CONTENT_TYPE_FORM, charset); @@ -3149,12 +3168,35 @@ public HttpRequest form(final Object name, final Object value, String charset) charset = getValidCharset(charset); try { openOutput(); - if (!first) - output.write('&'); - output.write(URLEncoder.encode(name.toString(), charset)); - output.write('='); - if (value != null) - output.write(URLEncoder.encode(value.toString(), charset)); + if (value instanceof List) { + names.add(""); + for (Object item : (List)value) + form(names, item, charset); + names.remove(names.size() - 1); + } else if (value instanceof Map) { + for (Entry entry : ((Map)value).entrySet()) { + names.add(entry.getKey()); + form(names, entry.getValue(), charset); + names.remove(names.size() - 1); + } + } else { + if (!first) + output.write('&'); + + boolean firstName = true; + for (Object name : names) { + if (!firstName) + output.write('['); + output.write(URLEncoder.encode(name.toString(), charset)); + if (!firstName) + output.write(']'); + firstName = false; + } + + output.write('='); + if (value != null) + output.write(URLEncoder.encode(value.toString(), charset)); + } } catch (IOException e) { throw new HttpRequestException(e); }