Hm. Why might it be that version 4.5.13 is the latest version of httpcomponents:httpclient that exists on maven central? Is there some alternative repository I should be looking at to get this version five artifact?
David On Wed, May 11, 2022 at 1:35 AM Oleg Kalnichevski <ol...@apache.org> wrote: > On Tue, 2022-05-10 at 18:13 -0400, Skylos wrote: > > I'm communicating with an out of spec server which does not recognize > > "+" > > as a blank space in query strings - this was quite a problem as I am > > passing actual filenames which I don't control and which may have > > spaces in > > them! > > > > The workaround I built was to copy format (and everything it calls) > > from > > URLEncodedUtils and augment to pass down the blankAsPlus value, which > > I > > then call explicitly by bypassing the built in encoder by sending in > > a raw > > encoded querystring as part of the original url string I use for my > > client > > retrieve/execution. > > > > It turns out that this function: > > > > private static String encodeFormFields (final String content, final > > Charset > > charset); > > > > needs to have a 'false' as the ultimate argument in the call to this > > function: > > > > private static String urlEncode( > > final String content, > > final Charset charset, > > final BitSet safechars, > > final boolean blankAsPlus); > > > > There was apparently no consideration that this might be necessary > > outside > > this private context. It's okay. I totally understand. I also > > understand > > that you may not like the idea of being compatible with obviously out > > of > > spec servers. But - it is my philosophical assertion that as a > > library > > which may be used by many divers purposes, it is better to allow the > > user > > to do whatever he wants, rather than to be quite so opinionated about > > it as > > to make it impossible to bypass the blankAsPlus while encoding > > > > My humble suggestion as thus - allow injection of blankAsPlus boolean > > external to the class. (I didn't chase *all* the format > > dependencies, but > > would be easy enough to do with a refactor calc or simply add a > > compatibility signature) > > > > (this one is in UrlEncodedFormEntity.java - conform with api change > > and > > compatibility constructor? defer to you.) > > > > - public UrlEncodedFormEntity ( > > - final Iterable <? extends NameValuePair> parameters, > > - final Charset charset) { > > - super(URLEncodedUtils.format(parameters, > > - charset != null ? charset : > > HTTP.DEF_CONTENT_CHARSET), > > - ContentType.create(URLEncodedUtils.CONTENT_TYPE, > > charset)); > > - } > > + public UrlEncodedFormEntity ( > > + final Iterable <? extends NameValuePair> parameters, > > + final Charset charset) { > > + super(URLEncodedUtils.format(parameters, > > + charset != null ? charset : > > HTTP.DEF_CONTENT_CHARSET), > > + ContentType.create(URLEncodedUtils.CONTENT_TYPE, > > charset), > > + false); > > + } > > + public UrlEncodedFormEntity ( > > + final Iterable <? extends NameValuePair> parameters, > > + final Charset charset, > > + boolean blankAsPlus) { > > + super(URLEncodedUtils.format(parameters, > > + charset != null ? charset : > > HTTP.DEF_CONTENT_CHARSET), > > + ContentType.create(URLEncodedUtils.CONTENT_TYPE, > > charset), > > + blankAsPlus); > > + } > > > > > > (this one is in URIBuilder.java - conform to api change - consider > > also > > adding mode/flag in builder to turn this on/off? (I really like this > > idea)) > > > > public static String encodeUrlForm(final List<NameValuePair> > > params) { > > - return format(params, Consts.UTF_8); > > + return format(params, Consts.UTF_8, false); > > } > > > > (These are all in URLEncodedUtils.java - pass the value down in and > > default > > on the public level with the old api.) > > > > - public static String format( > > - final Iterable<? extends NameValuePair> parameters, > > - final Charset charset) { > > - return format(parameters, '&', charset); > > + public static String format( > > + final Iterable<? extends NameValuePair> parameters, > > + final Charset charset) { > > + return format(parameters, '&', charset, false); > > + } > > + public static String format( > > + final Iterable<? extends NameValuePair> parameters, > > + final Charset charset, > > + boolean blankAsPlus) { > > + return format(parameters, '&', charset, blankAsPlus); > > } > > > > - public static String format( > > - final Iterable<? extends NameValuePair> parameters, > > - final char parameterSeparator, > > - final Charset charset) { > > + public static String format( > > + final Iterable<? extends NameValuePair> parameters, > > + final char parameterSeparator, > > + final Charset charset, > > + boolean blankAsPlus) { > > Args.notNull(parameters, "Parameters"); > > final StringBuilder result = new StringBuilder(); > > for (final NameValuePair parameter : parameters) { > > - final String encodedName = > > encodeFormFields(parameter.getName(), charset); > > - final String encodedValue = > > encodeFormFields(parameter.getValue(), charset); > > + final String encodedName = > > encodeFormFields(parameter.getName(), charset, blankAsPlus); > > + final String encodedValue = > > encodeFormFields(parameter.getValue(), charset, blankAsPlus); > > if (result.length() > 0) { > > result.append(parameterSeparator); > > } > > > > (And finally encodeFormFields itself.) > > > > - private static String encodeFormFields (final String content, > > final > > Charset charset) { > > + private static String encodeFormFields(final String content, > > final > > Charset charset, boolean blankAsPlus) { > > if (content == null) { > > return null; > > } > > - return urlEncode(content, charset != null ? charset : > > Consts.UTF_8, wwwFormUrlSafe(), false); > > + return urlEncode(content, charset != null ? charset : > > Consts.UTF_8, wwwFormUrlSafe(), blankAsPlus); > > } > > > > If you'd like me to submit a pull request on this, point me to the > > code > > repo you're using and I'll be happy to generate one. > > > > > > As of version 5.0 HttpClient no longer uses the old `plus as blank` > encoding scheme. > > Project code repositories can be found at the GitHub > > https://github.com/apache/httpcomponents-core > https://github.com/apache/httpcomponents-client > > Oleg > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.org > For additional commands, e-mail: httpclient-users-h...@hc.apache.org > > -- Dog approved this message.