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]