You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hc.apache.org by Bindul Bhowmik <bi...@gmail.com> on 2018/02/25 01:48:33 UTC

Re: httpcomponents-core git commit: [HTTPCORE-514] Exceptions defined by HttpCore should clean message strings when built to replace non-printable characters with hex values.

On Sat, Feb 24, 2018 at 8:46 AM,  <gg...@apache.org> wrote:
> Repository: httpcomponents-core
> Updated Branches:
>   refs/heads/master 286ec375d -> 458d7c628
>
>
> [HTTPCORE-514] Exceptions defined by HttpCore should clean message
> strings when built to replace non-printable characters with hex values.
>
> Project: http://git-wip-us.apache.org/repos/asf/httpcomponents-core/repo
> Commit: http://git-wip-us.apache.org/repos/asf/httpcomponents-core/commit/458d7c62
> Tree: http://git-wip-us.apache.org/repos/asf/httpcomponents-core/tree/458d7c62
> Diff: http://git-wip-us.apache.org/repos/asf/httpcomponents-core/diff/458d7c62
>
> Branch: refs/heads/master
> Commit: 458d7c628eaf8371c53ba906316ac3077235e40c
> Parents: 286ec37
> Author: Gary Gregory <ga...@gmail.com>
> Authored: Sat Feb 24 08:46:06 2018 -0700
> Committer: Gary Gregory <ga...@gmail.com>
> Committed: Sat Feb 24 08:46:06 2018 -0700
>
> ----------------------------------------------------------------------
>  .../core5/http/ConnectionClosedException.java   |  2 +-
>  .../org/apache/hc/core5/http/HttpException.java | 42 ++++++++-
>  .../hc/core5/http/NoHttpResponseException.java  |  2 +-
>  .../hc/core5/http/TestHttpExceptions.java       | 89 ++++++++++++++++++++
>  4 files changed, 131 insertions(+), 4 deletions(-)
> ----------------------------------------------------------------------
>
>
> http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/458d7c62/httpcore5/src/main/java/org/apache/hc/core5/http/ConnectionClosedException.java
> ----------------------------------------------------------------------
> diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/ConnectionClosedException.java b/httpcore5/src/main/java/org/apache/hc/core5/http/ConnectionClosedException.java
> index 257fc21..c0fdefa 100644
> --- a/httpcore5/src/main/java/org/apache/hc/core5/http/ConnectionClosedException.java
> +++ b/httpcore5/src/main/java/org/apache/hc/core5/http/ConnectionClosedException.java
> @@ -44,7 +44,7 @@ public class ConnectionClosedException extends IOException {
>       * @param message The exception detail message
>       */
>      public ConnectionClosedException(final String message) {
> -        super(message);
> +        super(HttpException.clean(message));
>      }
>
>  }
>
> http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/458d7c62/httpcore5/src/main/java/org/apache/hc/core5/http/HttpException.java
> ----------------------------------------------------------------------
> diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/HttpException.java b/httpcore5/src/main/java/org/apache/hc/core5/http/HttpException.java
> index bd1e4ab..207f72e 100644
> --- a/httpcore5/src/main/java/org/apache/hc/core5/http/HttpException.java
> +++ b/httpcore5/src/main/java/org/apache/hc/core5/http/HttpException.java
> @@ -34,9 +34,47 @@ package org.apache.hc.core5.http;
>   */
>  public class HttpException extends Exception {
>
> +    private static final int FIRST_VALID_CHAR = 32;
>      private static final long serialVersionUID = -5437299376222011036L;
>
>      /**
> +     * Converts characters < 32 to hex.
> +     *
> +     * @param message
> +     *            the source string.
> +     * @return a converted string.
> +     */
> +    static String clean(final String message) {
> +        final char[] chars = message.toCharArray();
> +        int i;
> +        // First check to see if need to allocate a new StringBuilder
> +        for (i = 0; i < chars.length; i++) {
> +            if (chars[i] < FIRST_VALID_CHAR) {
> +                break;
> +            }
> +        }
> +        if (i == chars.length) {
> +            return message;
> +        }
> +        final StringBuilder builder = new StringBuilder(chars.length * 2);
> +        for (i = 0; i < chars.length; i++) {
> +            final char ch = chars[i];
> +            if (ch < FIRST_VALID_CHAR) {
> +                builder.append("[0x");
> +                final String hexString = Integer.toHexString(i);
> +                if (hexString.length() == 1) {
> +                    builder.append("0");
> +                }
> +                builder.append(hexString);
> +                builder.append("]");
> +            } else {
> +                builder.append(ch);
> +            }
> +        }
> +        return builder.toString();
> +    }

Gary,

Wouldn't it be safer to use the java.lang.Character#isISOControl(int)
method in this case? 0x7F - 0x9F are also not printable.

Bindul

> +
> +    /**
>       * Creates a new HttpException with a {@code null} detail message.
>       */
>      public HttpException() {
> @@ -49,7 +87,7 @@ public class HttpException extends Exception {
>       * @param message the exception detail message
>       */
>      public HttpException(final String message) {
> -        super(message);
> +        super(clean(message));
>      }
>
>      /**
> @@ -60,7 +98,7 @@ public class HttpException extends Exception {
>       * if the cause is unavailable, unknown, or not a {@code Throwable}
>       */
>      public HttpException(final String message, final Throwable cause) {
> -        super(message);
> +        super(clean(message));
>          initCause(cause);
>      }
>
>
> http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/458d7c62/httpcore5/src/main/java/org/apache/hc/core5/http/NoHttpResponseException.java
> ----------------------------------------------------------------------
> diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/NoHttpResponseException.java b/httpcore5/src/main/java/org/apache/hc/core5/http/NoHttpResponseException.java
> index f2f3cdf..5fc880e 100644
> --- a/httpcore5/src/main/java/org/apache/hc/core5/http/NoHttpResponseException.java
> +++ b/httpcore5/src/main/java/org/apache/hc/core5/http/NoHttpResponseException.java
> @@ -44,7 +44,7 @@ public class NoHttpResponseException extends IOException {
>       * @param message exception message
>       */
>      public NoHttpResponseException(final String message) {
> -        super(message);
> +        super(HttpException.clean(message));
>      }
>
>  }
>
> http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/458d7c62/httpcore5/src/test/java/org/apache/hc/core5/http/TestHttpExceptions.java
> ----------------------------------------------------------------------
> diff --git a/httpcore5/src/test/java/org/apache/hc/core5/http/TestHttpExceptions.java b/httpcore5/src/test/java/org/apache/hc/core5/http/TestHttpExceptions.java
> new file mode 100644
> index 0000000..5de7b1c
> --- /dev/null
> +++ b/httpcore5/src/test/java/org/apache/hc/core5/http/TestHttpExceptions.java
> @@ -0,0 +1,89 @@
> +/*
> + * ====================================================================
> + * Licensed to the Apache Software Foundation (ASF) under one
> + * or more contributor license agreements.  See the NOTICE file
> + * distributed with this work for additional information
> + * regarding copyright ownership.  The ASF licenses this file
> + * to you under the Apache License, Version 2.0 (the
> + * "License"); you may not use this file except in compliance
> + * with the License.  You may obtain a copy of the License at
> + *
> + *   http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing,
> + * software distributed under the License is distributed on an
> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> + * KIND, either express or implied.  See the License for the
> + * specific language governing permissions and limitations
> + * under the License.
> + * ====================================================================
> + *
> + * This software consists of voluntary contributions made by many
> + * individuals on behalf of the Apache Software Foundation.  For more
> + * information on the Apache Software Foundation, please see
> + * <http://www.apache.org/>.
> + *
> + */
> +
> +package org.apache.hc.core5.http;
> +
> +import org.junit.Assert;
> +import org.junit.Test;
> +
> +/**
> + * Simple tests for various HTTP exception classes.
> + */
> +public class TestHttpExceptions {
> +
> +    private static final String CLEAN_MESSAGE = "[0x00]Hello[0x06][0x07][0x08][0x09][0x0a][0x0b][0x0c][0x0d][0x0e][0x0f]World";
> +    private static String nonPrintableMessage = String.valueOf(
> +            new char[] { 1, 'H', 'e', 'l', 'l', 'o', 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 'W', 'o', 'r', 'l', 'd' });
> +
> +    @Test
> +    public void testConstructor() {
> +        final Throwable cause = new Exception();
> +        new HttpException();
> +        new HttpException("Oppsie");
> +        new HttpException("Oppsie", cause);
> +        new ProtocolException();
> +        new ProtocolException("Oppsie");
> +        new ProtocolException("Oppsie", cause);
> +        new NoHttpResponseException("Oppsie");
> +        new ConnectionClosedException("Oppsie");
> +        new MethodNotSupportedException("Oppsie");
> +        new MethodNotSupportedException("Oppsie", cause);
> +        new UnsupportedHttpVersionException();
> +        new UnsupportedHttpVersionException("Oppsie");
> +    }
> +
> +    @Test
> +    public void testNonPrintableCharactersInConnectionClosedException() {
> +        Assert.assertEquals(CLEAN_MESSAGE, new ConnectionClosedException(nonPrintableMessage).getMessage());
> +    }
> +
> +    @Test
> +    public void testNonPrintableCharactersInHttpException() {
> +        Assert.assertEquals(CLEAN_MESSAGE, new HttpException(nonPrintableMessage).getMessage());
> +    }
> +
> +    @Test
> +    public void testNonPrintableCharactersInMethodNotSupportedException() {
> +        Assert.assertEquals(CLEAN_MESSAGE, new MethodNotSupportedException(nonPrintableMessage).getMessage());
> +    }
> +
> +    @Test
> +    public void testNonPrintableCharactersInNoHttpResponseException() {
> +        Assert.assertEquals(CLEAN_MESSAGE, new NoHttpResponseException(nonPrintableMessage).getMessage());
> +    }
> +
> +    @Test
> +    public void testNonPrintableCharactersInProtocolException() {
> +        Assert.assertEquals(CLEAN_MESSAGE, new ProtocolException(nonPrintableMessage).getMessage());
> +    }
> +
> +    @Test
> +    public void testNonPrintableCharactersInUnsupportedHttpVersionException() {
> +        Assert.assertEquals(CLEAN_MESSAGE, new UnsupportedHttpVersionException(nonPrintableMessage).getMessage());
> +    }
> +
> +}
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@hc.apache.org
For additional commands, e-mail: dev-help@hc.apache.org


Re: httpcomponents-core git commit: [HTTPCORE-514] Exceptions defined by HttpCore should clean message strings when built to replace non-printable characters with hex values.

Posted by Gary Gregory <ga...@gmail.com>.
On Sat, Feb 24, 2018 at 6:48 PM, Bindul Bhowmik <bi...@gmail.com>
wrote:

> On Sat, Feb 24, 2018 at 8:46 AM,  <gg...@apache.org> wrote:
> > Repository: httpcomponents-core
> > Updated Branches:
> >   refs/heads/master 286ec375d -> 458d7c628
> >
> >
> > [HTTPCORE-514] Exceptions defined by HttpCore should clean message
> > strings when built to replace non-printable characters with hex values.
> >
> > Project: http://git-wip-us.apache.org/repos/asf/httpcomponents-core/repo
> > Commit: http://git-wip-us.apache.org/repos/asf/httpcomponents-core/
> commit/458d7c62
> > Tree: http://git-wip-us.apache.org/repos/asf/httpcomponents-core/
> tree/458d7c62
> > Diff: http://git-wip-us.apache.org/repos/asf/httpcomponents-core/
> diff/458d7c62
> >
> > Branch: refs/heads/master
> > Commit: 458d7c628eaf8371c53ba906316ac3077235e40c
> > Parents: 286ec37
> > Author: Gary Gregory <ga...@gmail.com>
> > Authored: Sat Feb 24 08:46:06 2018 -0700
> > Committer: Gary Gregory <ga...@gmail.com>
> > Committed: Sat Feb 24 08:46:06 2018 -0700
> >
> > ----------------------------------------------------------------------
> >  .../core5/http/ConnectionClosedException.java   |  2 +-
> >  .../org/apache/hc/core5/http/HttpException.java | 42 ++++++++-
> >  .../hc/core5/http/NoHttpResponseException.java  |  2 +-
> >  .../hc/core5/http/TestHttpExceptions.java       | 89
> ++++++++++++++++++++
> >  4 files changed, 131 insertions(+), 4 deletions(-)
> > ----------------------------------------------------------------------
> >
> >
> > http://git-wip-us.apache.org/repos/asf/httpcomponents-core/
> blob/458d7c62/httpcore5/src/main/java/org/apache/hc/core5/http/
> ConnectionClosedException.java
> > ----------------------------------------------------------------------
> > diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/ConnectionClosedException.java
> b/httpcore5/src/main/java/org/apache/hc/core5/http/
> ConnectionClosedException.java
> > index 257fc21..c0fdefa 100644
> > --- a/httpcore5/src/main/java/org/apache/hc/core5/http/
> ConnectionClosedException.java
> > +++ b/httpcore5/src/main/java/org/apache/hc/core5/http/
> ConnectionClosedException.java
> > @@ -44,7 +44,7 @@ public class ConnectionClosedException extends
> IOException {
> >       * @param message The exception detail message
> >       */
> >      public ConnectionClosedException(final String message) {
> > -        super(message);
> > +        super(HttpException.clean(message));
> >      }
> >
> >  }
> >
> > http://git-wip-us.apache.org/repos/asf/httpcomponents-core/
> blob/458d7c62/httpcore5/src/main/java/org/apache/hc/core5/
> http/HttpException.java
> > ----------------------------------------------------------------------
> > diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/HttpException.java
> b/httpcore5/src/main/java/org/apache/hc/core5/http/HttpException.java
> > index bd1e4ab..207f72e 100644
> > --- a/httpcore5/src/main/java/org/apache/hc/core5/http/
> HttpException.java
> > +++ b/httpcore5/src/main/java/org/apache/hc/core5/http/
> HttpException.java
> > @@ -34,9 +34,47 @@ package org.apache.hc.core5.http;
> >   */
> >  public class HttpException extends Exception {
> >
> > +    private static final int FIRST_VALID_CHAR = 32;
> >      private static final long serialVersionUID = -5437299376222011036L;
> >
> >      /**
> > +     * Converts characters < 32 to hex.
> > +     *
> > +     * @param message
> > +     *            the source string.
> > +     * @return a converted string.
> > +     */
> > +    static String clean(final String message) {
> > +        final char[] chars = message.toCharArray();
> > +        int i;
> > +        // First check to see if need to allocate a new StringBuilder
> > +        for (i = 0; i < chars.length; i++) {
> > +            if (chars[i] < FIRST_VALID_CHAR) {
> > +                break;
> > +            }
> > +        }
> > +        if (i == chars.length) {
> > +            return message;
> > +        }
> > +        final StringBuilder builder = new StringBuilder(chars.length *
> 2);
> > +        for (i = 0; i < chars.length; i++) {
> > +            final char ch = chars[i];
> > +            if (ch < FIRST_VALID_CHAR) {
> > +                builder.append("[0x");
> > +                final String hexString = Integer.toHexString(i);
> > +                if (hexString.length() == 1) {
> > +                    builder.append("0");
> > +                }
> > +                builder.append(hexString);
> > +                builder.append("]");
> > +            } else {
> > +                builder.append(ch);
> > +            }
> > +        }
> > +        return builder.toString();
> > +    }
>
> Gary,
>
> Wouldn't it be safer to use the java.lang.Character#isISOControl(int)
> method in this case? 0x7F - 0x9F are also not printable.
>

These are part of "Extended ASCII" which can be printable. See
https://www.ascii-code.com/

Gary


>
> Bindul
>
> > +
> > +    /**
> >       * Creates a new HttpException with a {@code null} detail message.
> >       */
> >      public HttpException() {
> > @@ -49,7 +87,7 @@ public class HttpException extends Exception {
> >       * @param message the exception detail message
> >       */
> >      public HttpException(final String message) {
> > -        super(message);
> > +        super(clean(message));
> >      }
> >
> >      /**
> > @@ -60,7 +98,7 @@ public class HttpException extends Exception {
> >       * if the cause is unavailable, unknown, or not a {@code Throwable}
> >       */
> >      public HttpException(final String message, final Throwable cause) {
> > -        super(message);
> > +        super(clean(message));
> >          initCause(cause);
> >      }
> >
> >
> > http://git-wip-us.apache.org/repos/asf/httpcomponents-core/
> blob/458d7c62/httpcore5/src/main/java/org/apache/hc/core5/
> http/NoHttpResponseException.java
> > ----------------------------------------------------------------------
> > diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/NoHttpResponseException.java
> b/httpcore5/src/main/java/org/apache/hc/core5/http/
> NoHttpResponseException.java
> > index f2f3cdf..5fc880e 100644
> > --- a/httpcore5/src/main/java/org/apache/hc/core5/http/
> NoHttpResponseException.java
> > +++ b/httpcore5/src/main/java/org/apache/hc/core5/http/
> NoHttpResponseException.java
> > @@ -44,7 +44,7 @@ public class NoHttpResponseException extends
> IOException {
> >       * @param message exception message
> >       */
> >      public NoHttpResponseException(final String message) {
> > -        super(message);
> > +        super(HttpException.clean(message));
> >      }
> >
> >  }
> >
> > http://git-wip-us.apache.org/repos/asf/httpcomponents-core/
> blob/458d7c62/httpcore5/src/test/java/org/apache/hc/core5/
> http/TestHttpExceptions.java
> > ----------------------------------------------------------------------
> > diff --git a/httpcore5/src/test/java/org/apache/hc/core5/http/TestHttpExceptions.java
> b/httpcore5/src/test/java/org/apache/hc/core5/http/TestHttpExceptions.java
> > new file mode 100644
> > index 0000000..5de7b1c
> > --- /dev/null
> > +++ b/httpcore5/src/test/java/org/apache/hc/core5/http/
> TestHttpExceptions.java
> > @@ -0,0 +1,89 @@
> > +/*
> > + * ====================================================================
> > + * Licensed to the Apache Software Foundation (ASF) under one
> > + * or more contributor license agreements.  See the NOTICE file
> > + * distributed with this work for additional information
> > + * regarding copyright ownership.  The ASF licenses this file
> > + * to you under the Apache License, Version 2.0 (the
> > + * "License"); you may not use this file except in compliance
> > + * with the License.  You may obtain a copy of the License at
> > + *
> > + *   http://www.apache.org/licenses/LICENSE-2.0
> > + *
> > + * Unless required by applicable law or agreed to in writing,
> > + * software distributed under the License is distributed on an
> > + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> > + * KIND, either express or implied.  See the License for the
> > + * specific language governing permissions and limitations
> > + * under the License.
> > + * ====================================================================
> > + *
> > + * This software consists of voluntary contributions made by many
> > + * individuals on behalf of the Apache Software Foundation.  For more
> > + * information on the Apache Software Foundation, please see
> > + * <http://www.apache.org/>.
> > + *
> > + */
> > +
> > +package org.apache.hc.core5.http;
> > +
> > +import org.junit.Assert;
> > +import org.junit.Test;
> > +
> > +/**
> > + * Simple tests for various HTTP exception classes.
> > + */
> > +public class TestHttpExceptions {
> > +
> > +    private static final String CLEAN_MESSAGE =
> "[0x00]Hello[0x06][0x07][0x08][0x09][0x0a][0x0b][0x0c][0x0d]
> [0x0e][0x0f]World";
> > +    private static String nonPrintableMessage = String.valueOf(
> > +            new char[] { 1, 'H', 'e', 'l', 'l', 'o', 1, 2, 3, 4, 5, 6,
> 7, 8, 9, 0, 'W', 'o', 'r', 'l', 'd' });
> > +
> > +    @Test
> > +    public void testConstructor() {
> > +        final Throwable cause = new Exception();
> > +        new HttpException();
> > +        new HttpException("Oppsie");
> > +        new HttpException("Oppsie", cause);
> > +        new ProtocolException();
> > +        new ProtocolException("Oppsie");
> > +        new ProtocolException("Oppsie", cause);
> > +        new NoHttpResponseException("Oppsie");
> > +        new ConnectionClosedException("Oppsie");
> > +        new MethodNotSupportedException("Oppsie");
> > +        new MethodNotSupportedException("Oppsie", cause);
> > +        new UnsupportedHttpVersionException();
> > +        new UnsupportedHttpVersionException("Oppsie");
> > +    }
> > +
> > +    @Test
> > +    public void testNonPrintableCharactersInConnectionClosedException()
> {
> > +        Assert.assertEquals(CLEAN_MESSAGE, new
> ConnectionClosedException(nonPrintableMessage).getMessage());
> > +    }
> > +
> > +    @Test
> > +    public void testNonPrintableCharactersInHttpException() {
> > +        Assert.assertEquals(CLEAN_MESSAGE, new HttpException(
> nonPrintableMessage).getMessage());
> > +    }
> > +
> > +    @Test
> > +    public void testNonPrintableCharactersInMethodNotSupportedException()
> {
> > +        Assert.assertEquals(CLEAN_MESSAGE, new
> MethodNotSupportedException(nonPrintableMessage).getMessage());
> > +    }
> > +
> > +    @Test
> > +    public void testNonPrintableCharactersInNoHttpResponseException() {
> > +        Assert.assertEquals(CLEAN_MESSAGE, new NoHttpResponseException(
> nonPrintableMessage).getMessage());
> > +    }
> > +
> > +    @Test
> > +    public void testNonPrintableCharactersInProtocolException() {
> > +        Assert.assertEquals(CLEAN_MESSAGE, new ProtocolException(
> nonPrintableMessage).getMessage());
> > +    }
> > +
> > +    @Test
> > +    public void testNonPrintableCharactersInUn
> supportedHttpVersionException() {
> > +        Assert.assertEquals(CLEAN_MESSAGE, new
> UnsupportedHttpVersionException(nonPrintableMessage).getMessage());
> > +    }
> > +
> > +}
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@hc.apache.org
> For additional commands, e-mail: dev-help@hc.apache.org
>
>