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.
>

Reply via email to