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