The Maven coordinates are different for the 3, 4 and 5 lines. Gary
On Wed, May 11, 2022, 08:01 Skylos <sky...@gmail.com> wrote: > 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. >