On Sat, Feb 24, 2018 at 8:46 AM,  <[email protected]> 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 <[email protected]>
> Authored: Sat Feb 24 08:46:06 2018 -0700
> Committer: Gary Gregory <[email protected]>
> 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: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to