From 839a669b134c8dbe7f5216637d13fd02f13b72b3 Mon Sep 17 00:00:00 2001 From: Gary Gregory Date: Tue, 6 Oct 2026 10:56:04 -0400 Subject: [PATCH] Migrate to Apache HttpComponents HttpClient and HttpCore 5 --- RELEASE-NOTES.txt | 17 + juneau-integration-tests/pom.xml | 28 +- .../classic/header/AcceptEncoding_Test.java | 6 +- .../http/classic/header/Connection_Test.java | 6 +- .../classic/header/ContentLength_Test.java | 10 +- .../classic/header/TransferEncoding_Test.java | 10 +- .../classic/response/BadRequest_Test.java | 3 +- .../classic/response/HttpException_Test.java | 5 +- .../remote/Remote_CommonInterfaces_Test.java | 2 +- .../remote/Remote_ContentAnnotation_Test.java | 12 +- .../Remote_FormDataAnnotation_Test.java | 4 +- .../remote/Remote_HeaderAnnotation_Test.java | 10 +- .../remote/Remote_PathAnnotation_Test.java | 8 +- .../remote/Remote_QueryAnnotation_Test.java | 4 +- .../Remote_RemoteOpAnnotation_Test.java | 20 +- .../BasicHttpRequestRetryHandler_Test.java | 8 +- .../classic/RestCallException_Test.java | 2 +- .../classic/RestClient_BasicCalls_Test.java | 7 +- .../client/classic/RestClient_Body_Test.java | 2 +- .../RestClient_Config_RestClient_Test.java | 29 +- .../classic/RestClient_FormData_Test.java | 2 +- .../classic/RestClient_Headers_Test.java | 4 +- .../RestClient_Logging_StreamClosed_Test.java | 12 +- .../classic/RestClient_Logging_Test.java | 18 +- .../client/classic/RestClient_Paths_Test.java | 4 +- .../RestClient_Response_Body_Test.java | 39 +-- .../classic/RestClient_Response_Test.java | 30 +- .../rest/client/classic/RestClient_Test.java | 69 ++-- .../apache/juneau/rest/server/Path_Test.java | 8 +- .../apache/juneau/rest/server/Paths_Test.java | 10 +- .../pom.xml | 9 +- .../ApacheHc45Transport.java | 72 +++-- .../ApacheHc45TransportBuilder.java | 3 +- .../ApacheHc45TransportProvider.java | 4 +- .../Hc45RedirectCredentialGuard.java | 9 +- .../PolicyAwareRedirectStrategy.java | 16 +- .../PolicyPinningDnsResolver.java | 8 +- .../apachehttpclient45/package-info.java | 2 +- .../ApacheHc45Transport_ErrorPaths_Test.java | 30 +- ...45Transport_StaleConnectionRetry_Test.java | 5 +- .../rest/client/ApacheHc45Transport_Test.java | 53 ++- ...c45Transport_TransportBodyEntity_Test.java | 2 +- .../Hc45RedirectCredentialGuard_Test.java | 16 +- .../pom.xml | 1 - .../ApacheHc5Transport.java | 11 +- .../juneau-rest-client-classic/pom.xml | 7 +- .../classic/BasicHttpEntityRequestBase.java | 7 +- .../client/classic/BasicHttpRequestBase.java | 7 +- .../classic/BasicHttpRequestRetryHandler.java | 27 +- .../client/classic/BasicRestCallHandler.java | 9 +- .../ClassicRedirectCredentialGuard.java | 10 +- .../classic/PolicyAwareRedirectStrategy.java | 17 +- .../classic/PolicyPinningDnsResolver.java | 8 +- .../rest/client/classic/ResponseContent.java | 66 ++-- .../rest/client/classic/ResponseHeader.java | 12 +- .../client/classic/ResponseStatusLine.java | 28 +- .../client/classic/RestCallException.java | 4 +- .../rest/client/classic/RestCallHandler.java | 18 +- .../rest/client/classic/RestClient.java | 301 +++++++++--------- .../rest/client/classic/RestOperation.java | 2 +- .../rest/client/classic/RestRequest.java | 185 ++++++----- .../client/classic/RestRequestCreated.java | 3 +- .../rest/client/classic/RestResponse.java | 121 ++++--- .../FluentResponseStatusLineAssertion.java | 3 +- .../BasicHttpRequestRetryHandler_Test.java | 12 +- .../ClassicRedirectCredentialGuard_Test.java | 16 +- .../ResponseContent_Coverage_Test.java | 22 +- .../classic/ResponseContent_Cursor_Test.java | 10 +- .../RestClient_Builder_Coverage_Test.java | 10 +- .../classic/RestClient_Coverage2_Test.java | 37 +-- .../RestClient_FormPost_Coverage_Test.java | 3 +- ...estRequest_ArgExpansion_Coverage_Test.java | 21 +- .../RestRequest_Rethrow_Coverage_Test.java | 4 +- .../FluentResponseBodyAssertion_Test.java | 2 +- ...luentResponseStatusLineAssertion_Test.java | 6 +- .../juneau/rest/client/JavaHttpTransport.java | 6 +- .../juneau-rest-common-classic/pom.xml | 7 +- .../juneau/http/classic/BasicStatusLine.java | 30 +- .../juneau/http/classic/HttpHeaders.java | 6 +- .../apache/juneau/http/classic/HttpParts.java | 7 +- .../juneau/http/classic/HttpResources.java | 3 +- .../http/classic/entity/BasicHttpEntity.java | 20 +- .../http/classic/entity/SerializedEntity.java | 9 +- .../http/classic/header/BasicHeader.java | 16 +- .../classic/header/BasicHeaderIterator.java | 15 +- .../classic/header/BasicStringHeader.java | 2 +- .../http/classic/header/HeaderList.java | 12 +- .../http/classic/header/Headerable.java | 2 +- .../juneau/http/classic/package-info.java | 2 +- .../http/classic/part/BasicBooleanPart.java | 2 +- .../http/classic/part/BasicCsvArrayPart.java | 2 +- .../http/classic/part/BasicDatePart.java | 2 +- .../http/classic/part/BasicIntegerPart.java | 2 +- .../http/classic/part/BasicLongPart.java | 2 +- .../juneau/http/classic/part/BasicPart.java | 3 +- .../http/classic/part/BasicPartIterator.java | 2 +- .../http/classic/part/BasicStringPart.java | 2 +- .../http/classic/part/BasicUriPart.java | 2 +- .../http/classic/part/NameValuePairable.java | 2 +- .../http/classic/part/PartIterator.java | 2 +- .../juneau/http/classic/part/PartList.java | 4 +- .../http/classic/part/SerializedPart.java | 3 +- .../http/classic/resource/BasicResource.java | 23 +- .../http/classic/resource/HttpResource.java | 3 +- .../http/classic/resource/StreamResource.java | 5 +- .../http/classic/response/Accepted.java | 4 +- .../classic/response/AlreadyReported.java | 4 +- .../http/classic/response/BadRequest.java | 7 +- .../classic/response/BasicHttpException.java | 93 +++--- .../classic/response/BasicHttpResponse.java | 95 +++--- .../http/classic/response/Conflict.java | 7 +- .../http/classic/response/Continue.java | 4 +- .../juneau/http/classic/response/Created.java | 4 +- .../http/classic/response/EarlyHints.java | 4 +- .../classic/response/ExpectationFailed.java | 7 +- .../classic/response/FailedDependency.java | 7 +- .../http/classic/response/Forbidden.java | 7 +- .../juneau/http/classic/response/Found.java | 4 +- .../juneau/http/classic/response/Gone.java | 7 +- .../response/HttpVersionNotSupported.java | 7 +- .../juneau/http/classic/response/IMUsed.java | 4 +- .../classic/response/InsufficientStorage.java | 7 +- .../classic/response/InternalServerError.java | 7 +- .../http/classic/response/LengthRequired.java | 7 +- .../juneau/http/classic/response/Locked.java | 7 +- .../http/classic/response/LoopDetected.java | 7 +- .../classic/response/MethodNotAllowed.java | 7 +- .../classic/response/MisdirectedRequest.java | 7 +- .../classic/response/MovedPermanently.java | 4 +- .../http/classic/response/MultiStatus.java | 4 +- .../classic/response/MultipleChoices.java | 4 +- .../NetworkAuthenticationRequired.java | 7 +- .../http/classic/response/NoContent.java | 4 +- .../response/NonAuthoritiveInformation.java | 4 +- .../http/classic/response/NotAcceptable.java | 7 +- .../http/classic/response/NotExtended.java | 7 +- .../http/classic/response/NotFound.java | 7 +- .../http/classic/response/NotImplemented.java | 7 +- .../http/classic/response/NotModified.java | 4 +- .../juneau/http/classic/response/Ok.java | 4 +- .../http/classic/response/PartialContent.java | 4 +- .../classic/response/PayloadTooLarge.java | 7 +- .../classic/response/PermanentRedirect.java | 4 +- .../classic/response/PreconditionFailed.java | 7 +- .../response/PreconditionRequired.java | 7 +- .../http/classic/response/Processing.java | 4 +- .../classic/response/RangeNotSatisfiable.java | 7 +- .../response/RequestHeaderFieldsTooLarge.java | 7 +- .../http/classic/response/ResetContent.java | 4 +- .../http/classic/response/SeeOther.java | 4 +- .../classic/response/ServiceUnavailable.java | 7 +- .../classic/response/SwitchingProtocols.java | 4 +- .../classic/response/TemporaryRedirect.java | 4 +- .../classic/response/TooManyRequests.java | 7 +- .../http/classic/response/Unauthorized.java | 7 +- .../response/UnavailableForLegalReasons.java | 7 +- .../classic/response/UnprocessableEntity.java | 7 +- .../response/UnsupportedMediaType.java | 7 +- .../classic/response/UpgradeRequired.java | 7 +- .../http/classic/response/UriTooLong.java | 7 +- .../http/classic/response/UseProxy.java | 4 +- .../response/VariantAlsoNegotiates.java | 7 +- .../juneau/http/classic/BasicHeader_Test.java | 14 +- .../http/classic/BasicHttpResource_Test.java | 8 +- .../juneau/http/classic/BasicPart_Test.java | 7 +- .../http/classic/BasicStatusLine_Test.java | 6 +- .../http/classic/HttpEntities_Test.java | 14 +- .../juneau/http/classic/HttpHeaders_Test.java | 5 +- .../juneau/http/classic/HttpParts_Test.java | 5 +- .../http/classic/HttpResources_Test.java | 14 +- .../classic/entity/BasicHttpEntity_Test.java | 2 +- .../classic/entity/ByteArrayEntity_Test.java | 2 +- .../http/classic/entity/FileEntity_Test.java | 12 +- .../classic/entity/ReaderEntity_Test.java | 12 +- .../classic/entity/SerializedEntity_Test.java | 12 +- .../classic/entity/StreamEntity_Test.java | 12 +- .../classic/entity/StringEntity_Test.java | 2 +- .../header/BasicHeaderIterator_Test.java | 14 +- .../http/classic/header/BasicHeader_Test.java | 66 ++-- .../http/classic/header/HeaderList_Test.java | 20 +- .../classic/part/BasicPartIterator_Test.java | 2 +- .../http/classic/part/PartList_Test.java | 2 +- .../classic/resource/BasicResource_Test.java | 41 +-- .../resource/ByteArrayResource_Test.java | 15 +- .../classic/resource/FileResource_Test.java | 15 +- .../classic/resource/ReaderResource_Test.java | 15 +- .../classic/resource/StreamResource_Test.java | 15 +- .../classic/resource/StringResource_Test.java | 15 +- .../response/ClassicResponse_Test.java | 18 +- .../juneau/http/HttpProtocolVersion.java | 2 +- .../apache/juneau/http/HttpRequestLine.java | 2 +- .../apache/juneau/http/HttpStatusLine.java | 2 +- .../http/response/HttpResponseMessage.java | 2 +- .../juneau/rest/mock/MockServletRequest.java | 2 +- .../MockHttpClientConnectionManager.java | 116 +++---- .../rest/mock/classic/MockRestClient.java | 103 +++--- .../rest/mock/classic/MockRestRequest.java | 8 +- .../rest/mock/classic/MockRestResponse.java | 4 +- .../classic/MockRestClient_Coverage_Test.java | 14 +- .../processor/LegacyHttpResponseAdapter.java | 33 +- pom.xml | 30 +- 201 files changed, 1640 insertions(+), 1356 deletions(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 8d1803f19d..e781fe13d1 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -11,6 +11,23 @@ * specific language governing permissions and limitations under the License. * *************************************************************************************************************************** +Release Notes - Juneau - Version 10.0.0 - YYYY-MM-DD + +** Changes - Apache HttpComponents 5 + + * Port the classic HTTP APIs and Apache transport to HttpClient 5.6.4 and HttpCore 5.4.4. + * Public Apache HTTP types now use the org.apache.hc.client5 and org.apache.hc.core5 packages. + * Entity content type and encoding getters return strings. ResponseContent provides + getContentTypeHeader() and getContentEncodingHeader() for fluent header assertions. + * Header iterators use Iterator
; classic responses expose getCode(), getVersion(), and getHeaders(). + getHeaderList() provides the mutable Juneau header builder on classic requests and responses. + * Remove the obsolete HttpParams APIs. Connection, socket, and TLS options configure HttpClient 5 connection managers. + * Adopt HttpClient 5 request framing validation, URI encoding, default reason phrases, and rejection of URI userinfo. + * Represent a missing classic HTTP response as status 500 (Missing HTTP response). + * Close Apache transport SSE responses immediately so cancellation does not wait for an unbounded stream to finish. + * Preserve classic retry behavior and credential stripping on cross-origin redirects. + * Retain the historical juneau-rest-client-apache-httpclient-45 artifact and Java class names; this module now uses HttpClient 5. + Release Notes - Juneau - Version 9.2.1 - YYYY-MM-DD ** New Features - CBOR (Concise Binary Object Representation) Support diff --git a/juneau-integration-tests/pom.xml b/juneau-integration-tests/pom.xml index 6c05c677f3..aaf2b46753 100644 --- a/juneau-integration-tests/pom.xml +++ b/juneau-integration-tests/pom.xml @@ -39,31 +39,6 @@ manual - - - - org.apache.httpcomponents.client5 - httpclient5 - 5.6.4 - - - org.apache.httpcomponents.client5 - httpclient5-cache - 5.6.4 - - - org.apache.httpcomponents.core5 - httpcore5 - 5.4.3 - - - org.apache.httpcomponents.core5 - httpcore5-h2 - 5.4.3 - - - - + commons-codec commons-codec diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/header/AcceptEncoding_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/header/AcceptEncoding_Test.java index 46c1d908d5..bba8c2630c 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/header/AcceptEncoding_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/header/AcceptEncoding_Test.java @@ -61,9 +61,9 @@ public StringReader get(@Header(name=HEADER) @Schema(cf="multi") String[] h) { c.get().header(acceptEncoding(()->PARSED)).run().assertContent(VALUE); // Invalid usage. - c.get().header(acceptEncoding((String)null)).run().assertContent("gzip,deflate"); - c.get().header(acceptEncoding((Supplier)null)).run().assertContent("gzip,deflate"); - c.get().header(acceptEncoding(()->null)).run().assertContent("gzip,deflate"); + c.get().header(acceptEncoding((String)null)).run().assertContent().isContains("gzip", "deflate"); + c.get().header(acceptEncoding((Supplier)null)).run().assertContent().isContains("gzip", "deflate"); + c.get().header(acceptEncoding(()->null)).run().assertContent().isContains("gzip", "deflate"); } //------------------------------------------------------------------------------------------------------------------ diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/header/Connection_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/header/Connection_Test.java index 5a8c3f25b6..81e925ddb8 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/header/Connection_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/header/Connection_Test.java @@ -60,9 +60,9 @@ public StringReader get(@Header(name=HEADER) @Schema(cf="multi") String[] h) { c.get().header(connection(()->PARSED)).run().assertContent(VALUE); // Invalid usage. - c.get().header(connection((String)null)).run().assertContent("Keep-Alive"); - c.get().header(connection((Supplier)null)).run().assertContent("Keep-Alive"); - c.get().header(connection(()->null)).run().assertContent("Keep-Alive"); + c.get().header(connection((String)null)).run().assertContent("keep-alive"); + c.get().header(connection((Supplier)null)).run().assertContent("keep-alive"); + c.get().header(connection(()->null)).run().assertContent("keep-alive"); } @Test void a02_other() { diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/header/ContentLength_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/header/ContentLength_Test.java index f594657de2..a8c08aa98f 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/header/ContentLength_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/header/ContentLength_Test.java @@ -53,11 +53,11 @@ public StringReader get(@Header(name=HEADER) @Schema(cf="multi") String[] h) { @Test void a01_basic() throws Exception { var c = client().build(); - // Normal usage. - c.get().header(contentLength(VALUE)).run().assertContent(VALUE); - c.get().header(contentLength(VALUE)).run().assertContent(VALUE); - c.get().header(contentLength(PARSED)).run().assertContent(VALUE); - c.get().header(contentLength(()->PARSED)).run().assertContent(VALUE); + // HttpClient 5 owns request framing and rejects caller-supplied framing headers. + assertThrowsWithMessage(RestCallException.class, "Call failed.", () -> c.get().header(contentLength(VALUE)).run()); + assertThrowsWithMessage(RestCallException.class, "Call failed.", () -> c.get().header(contentLength(VALUE)).run()); + assertThrowsWithMessage(RestCallException.class, "Call failed.", () -> c.get().header(contentLength(PARSED)).run()); + assertThrowsWithMessage(RestCallException.class, "Call failed.", () -> c.get().header(contentLength(()->PARSED)).run()); // Invalid usage. c.get().header(contentLength((String)null)).run().assertContent().isEmpty(); diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/header/TransferEncoding_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/header/TransferEncoding_Test.java index 4c994205f1..2799da0319 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/header/TransferEncoding_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/header/TransferEncoding_Test.java @@ -52,11 +52,11 @@ public StringReader get(@Header(name=HEADER) @Schema(cf="multi") String[] h) { @Test void a01_basic() throws Exception { var c = client().build(); - // Normal usage. - c.get().header(transferEncoding(VALUE)).run().assertContent(VALUE); - c.get().header(transferEncoding(VALUE)).run().assertContent(VALUE); - c.get().header(transferEncoding(PARSED)).run().assertContent(VALUE); - c.get().header(transferEncoding(()->PARSED)).run().assertContent(VALUE); + // HttpClient 5 owns request framing and rejects caller-supplied framing headers. + assertThrowsWithMessage(RestCallException.class, "Call failed.", () -> c.get().header(transferEncoding(VALUE)).run()); + assertThrowsWithMessage(RestCallException.class, "Call failed.", () -> c.get().header(transferEncoding(VALUE)).run()); + assertThrowsWithMessage(RestCallException.class, "Call failed.", () -> c.get().header(transferEncoding(PARSED)).run()); + assertThrowsWithMessage(RestCallException.class, "Call failed.", () -> c.get().header(transferEncoding(()->PARSED)).run()); // Invalid usage. c.get().header(transferEncoding((String)null)).run().assertContent().isEmpty(); diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/response/BadRequest_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/response/BadRequest_Test.java index edcaee6981..740b71331a 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/response/BadRequest_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/response/BadRequest_Test.java @@ -21,9 +21,10 @@ import static org.apache.juneau.http.classic.response.BadRequest.*; import static org.junit.jupiter.api.Assertions.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.apache.juneau.rest.mock.classic.*; import org.apache.juneau.rest.server.*; import org.junit.jupiter.api.*; diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/response/HttpException_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/response/HttpException_Test.java index d94dafd838..2e9063199c 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/response/HttpException_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/http/classic/response/HttpException_Test.java @@ -22,9 +22,10 @@ import java.lang.reflect.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.apache.juneau.rest.mock.classic.*; import org.apache.juneau.rest.server.*; import org.junit.jupiter.api.*; @@ -193,7 +194,7 @@ public void f7() throws BasicHttpException { @Test void a09_fluentStatusLine_setters() { var x = httpException().setStatusCode2(500); - var pv = new org.apache.http.ProtocolVersion("HTTP", 2, 0); + var pv = new org.apache.hc.core5.http.ProtocolVersion("HTTP", 2, 0); assertSame(x, x.setProtocolVersion(pv)); assertSame(x, x.setLocale2(java.util.Locale.FRENCH)); assertSame(x, x.setMessage("new message")); diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_CommonInterfaces_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_CommonInterfaces_Test.java index 64458943b0..f9902aa148 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_CommonInterfaces_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_CommonInterfaces_Test.java @@ -208,7 +208,7 @@ public BasicResource httpResource() throws IOException { assertEquals("foo",read(sr.getContent())); assertEquals("foo",sr.getHeaders().getLast("Foo").orElseThrow(RuntimeException::new).getValue()); assertEquals("\"bar\"",sr.getHeaders().getLast("ETag").orElseThrow(RuntimeException::new).getValue()); - assertEquals("text/foo",sr.getContentType().getValue()); + assertEquals("text/foo",sr.getContentType()); } //----------------------------------------------------------------------------------------------------------------- diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_ContentAnnotation_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_ContentAnnotation_Test.java index 152e40d739..5d93e831b0 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_ContentAnnotation_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_ContentAnnotation_Test.java @@ -25,8 +25,8 @@ import java.io.*; import java.util.*; -import org.apache.http.*; -import org.apache.http.entity.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.io.entity.*; import org.apache.juneau.*; import org.apache.juneau.http.*; import org.apache.juneau.http.Header; @@ -128,7 +128,7 @@ public String x9(@Content Reader b, @Header("Content-Type") String ct) throws Ex @RestPost public String x10(@Content Reader b, @Header("Content-Type") String ct) throws IOException { - assertEquals("application/x-www-form-urlencoded",ct); + assertEquals("application/x-www-form-urlencoded",ct.split(";", 2)[0]); return read(b); } } @@ -223,7 +223,7 @@ public Object x9(@Content Reader b, @Header("Content-Type") String ct) { @RestPost public Object x10(@Content Reader b, @Header("Content-Type") String ct) { - assertEquals("application/x-www-form-urlencoded",ct); + assertEquals("application/x-www-form-urlencoded",ct.split(";", 2)[0]); return b; } } @@ -251,7 +251,7 @@ public interface B1 { assertEquals("{k1:{f:1}}",x.postX6(map("k1",Bean.create()))); assertEquals("xxx",x.postX7(reader("xxx"))); assertEquals("xxx",x.postX8(inputStream("xxx"))); - assertEquals("xxx",x.postX9(new StringEntity("xxx",org.apache.http.entity.ContentType.create("text/plain")))); + assertEquals("xxx",x.postX9(new StringEntity("xxx",org.apache.hc.core5.http.ContentType.create("text/plain")))); assertEquals("foo=bar",x.postX10(partList("foo","bar"))); } @@ -330,7 +330,7 @@ public interface C1 { assertEquals("{k1={f:1}}",x.postX6(map("k1",Bean.create()))); assertEquals("xxx",x.postX7(reader("xxx"))); assertEquals("xxx",x.postX8(inputStream("xxx"))); - assertEquals("xxx",x.postX9(new StringEntity("xxx",org.apache.http.entity.ContentType.create("text/plain")))); + assertEquals("xxx",x.postX9(new StringEntity("xxx",org.apache.hc.core5.http.ContentType.create("text/plain")))); assertEquals("foo=bar",x.postX10(partList("foo","bar"))); } } \ No newline at end of file diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_FormDataAnnotation_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_FormDataAnnotation_Test.java index fdfb4003a5..fbd412ed88 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_FormDataAnnotation_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_FormDataAnnotation_Test.java @@ -26,7 +26,7 @@ import java.util.*; import java.util.concurrent.atomic.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.TestBase; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; @@ -76,7 +76,7 @@ public String toString() { public static class A { @RestPost public String a(@FormData("*") Json5Map m, @Header("Content-Type") String ct) { - assertEquals("application/x-www-form-urlencoded", ct); + assertEquals("application/x-www-form-urlencoded", ct.split(";", 2)[0]); return m.toString(); } } diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_HeaderAnnotation_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_HeaderAnnotation_Test.java index ade493ecb5..beee4c745a 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_HeaderAnnotation_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_HeaderAnnotation_Test.java @@ -83,10 +83,10 @@ public interface A1 { @RemoteOp(path="a") String getX14(@Header() @Schema(format="uon") Map b); @RemoteOp(path="a") String getX15(@Header("*") HeaderList b); @RemoteOp(path="a") String getX16(@Header HeaderList b); - @RemoteOp(path="a") String getX17(@Header org.apache.http.Header b); - @RemoteOp(path="a") String getX18(@Header org.apache.http.Header[] b); + @RemoteOp(path="a") String getX17(@Header org.apache.hc.core5.http.Header b); + @RemoteOp(path="a") String getX18(@Header org.apache.hc.core5.http.Header[] b); @RemoteOp(path="a") String getX19(@Header String b); - @RemoteOp(path="a") String getX20(@Header List b); + @RemoteOp(path="a") String getX20(@Header List b); } @Test void a01_objectTypes() { @@ -747,7 +747,7 @@ public static class K3a { @Header(value="*") @Schema(aev=true) public HeaderList getB() { return headers("b1","true","b2","123","b3","null"); } @Header("*") @Schema(aev=true) public HeaderList getC() { return headerList(stringHeader("c1","v1"),integerHeader("c2",123),basicHeader("c3",null),stringHeader("c4","")); } @Header(value="*") @Schema(aev=true) public HeaderList getD() { return null; } - @Header() @Schema(aev=true) public org.apache.http.Header[] getE() { return headerList(stringHeader("e1","v1"),integerHeader("e2",123),basicHeader("e3",null),stringHeader("e4","")).getAll(); } + @Header() @Schema(aev=true) public org.apache.hc.core5.http.Header[] getE() { return headerList(stringHeader("e1","v1"),integerHeader("e2",123),basicHeader("e3",null),stringHeader("e4","")).getAll(); } @Header() @Schema(aev=true) public BasicHeader[] getF() { return headerList(stringHeader("f1","v1"),integerHeader("f2",123),basicHeader("f3",null),stringHeader("f4","")).stream().toArray(BasicHeader[]::new); } } @@ -797,7 +797,7 @@ private static HeaderList headers(String...pairs) { return headerList(pairs); } - private static org.apache.http.Header header(String key,Object val) { + private static org.apache.hc.core5.http.Header header(String key,Object val) { return basicHeader(key,val); } diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_PathAnnotation_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_PathAnnotation_Test.java index 02d46eff4d..368739df01 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_PathAnnotation_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_PathAnnotation_Test.java @@ -25,8 +25,8 @@ import java.util.*; import java.util.concurrent.atomic.*; -import org.apache.http.*; -import org.apache.http.client.config.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.client5.http.config.*; import org.apache.juneau.TestBase; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; @@ -711,10 +711,10 @@ private static NameValuePair part(String key, Object val) { } private static RestClient.Builder client(Class c) { - return MockRestClient.create(c).defaultRequestConfig(RequestConfig.custom().setNormalizeUri(false).build()).allowPrivateUrls(true); + return MockRestClient.create(c).defaultRequestConfig(RequestConfig.custom().build()).allowPrivateUrls(true); } private static T remote(Class rest, Class t) { - return MockRestClient.create(rest).defaultRequestConfig(RequestConfig.custom().setNormalizeUri(false).build()).allowPrivateUrls(true).build().getRemote(t); + return MockRestClient.create(rest).defaultRequestConfig(RequestConfig.custom().build()).allowPrivateUrls(true).build().getRemote(t); } } \ No newline at end of file diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_QueryAnnotation_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_QueryAnnotation_Test.java index e64f946eae..692176a23b 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_QueryAnnotation_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_QueryAnnotation_Test.java @@ -26,7 +26,7 @@ import java.util.*; import java.util.concurrent.atomic.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.TestBase; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; @@ -196,7 +196,7 @@ public interface C1 { assertEquals("{x:'foo,bar'}",x.getX3("foo","bar")); assertEquals("x=foo%2Cbar",x.getX4("foo","bar")); assertEquals("{x:'foo bar'}",x.getX5("foo","bar")); - assertEquals("x=foo+bar",x.getX6("foo","bar")); + assertEquals("x=foo%20bar",x.getX6("foo","bar")); assertEquals("{x:'foo\\tbar'}",x.getX7("foo","bar")); assertEquals("x=foo%09bar",x.getX8("foo","bar")); assertEquals("{x:'foo|bar'}",x.getX9("foo","bar")); diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_RemoteOpAnnotation_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_RemoteOpAnnotation_Test.java index 3521cf51a6..945375d947 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_RemoteOpAnnotation_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/http/remote/Remote_RemoteOpAnnotation_Test.java @@ -22,7 +22,7 @@ import java.io.*; import java.util.concurrent.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.*; import org.apache.juneau.http.*; import org.apache.juneau.rest.mock.classic.*; @@ -126,17 +126,17 @@ public String get() { public interface B1 { void x1(); String x2(); - HttpResponse x3(); + ClassicHttpResponse x3(); Reader x4(); InputStream x5(); Future x6(); Future x7(); - Future x8(); + Future x8(); Future x9(); Future x10(); CompletableFuture x11(); CompletableFuture x12(); - CompletableFuture x13(); + CompletableFuture x13(); CompletableFuture x14(); CompletableFuture x15(); } @@ -175,15 +175,15 @@ public String post(@Content String body) { @Remote public interface C1 { String postX1(@Content String foo); - HttpResponse postX2(@Content String foo); + ClassicHttpResponse postX2(@Content String foo); Reader postX3(@Content String foo); InputStream postX4(@Content String foo); Future postX5(@Content String foo); - Future postX6(@Content String foo); + Future postX6(@Content String foo); Future postX7(@Content String foo); Future postX8(@Content String foo); CompletableFuture postX9(@Content String foo); - CompletableFuture postX10(@Content String foo); + CompletableFuture postX10(@Content String foo); CompletableFuture postX11(@Content String foo); CompletableFuture postX12(@Content String foo); } @@ -219,15 +219,15 @@ public String x1(@Content String body) { @Remote public interface D1 { String postX1(@Content String foo); - HttpResponse postX2(@Content String foo); + ClassicHttpResponse postX2(@Content String foo); Reader postX3(@Content String foo); InputStream postX4(@Content String foo); Future postX5(@Content String foo); - Future postX6(@Content String foo); + Future postX6(@Content String foo); Future postX7(@Content String foo); Future postX8(@Content String foo); CompletableFuture postX9(@Content String foo); - CompletableFuture postX10(@Content String foo); + CompletableFuture postX10(@Content String foo); CompletableFuture postX11(@Content String foo); CompletableFuture postX12(@Content String foo); } diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/BasicHttpRequestRetryHandler_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/BasicHttpRequestRetryHandler_Test.java index aa011c3f8b..d5f1150136 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/BasicHttpRequestRetryHandler_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/BasicHttpRequestRetryHandler_Test.java @@ -22,8 +22,10 @@ import java.io.*; import java.net.*; -import org.apache.http.*; -import org.apache.http.protocol.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.impl.io.HttpRequestExecutor; +import org.apache.hc.core5.http.io.HttpClientConnection; +import org.apache.hc.core5.http.protocol.*; import org.apache.juneau.*; import org.apache.juneau.http.classic.response.*; import org.apache.juneau.rest.mock.classic.*; @@ -43,7 +45,7 @@ public Ok get() { public static class A1 extends HttpRequestExecutor { @Override - public HttpResponse execute(HttpRequest request, HttpClientConnection conn, HttpContext context) throws IOException, BasicHttpException { + public ClassicHttpResponse execute(ClassicHttpRequest request, HttpClientConnection conn, org.apache.hc.core5.http.io.HttpResponseInformationCallback informationCallback, HttpContext context) throws IOException, HttpException { throw new UnknownHostException("foo"); } } diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestCallException_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestCallException_Test.java index 033b4c2212..bfeb088d7c 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestCallException_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestCallException_Test.java @@ -21,7 +21,7 @@ import java.io.*; -import org.apache.http.entity.*; +import org.apache.hc.core5.http.io.entity.*; import org.apache.juneau.*; import org.apache.juneau.marshall.marshaller.*; import org.apache.juneau.marshall.parser.*; diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_BasicCalls_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_BasicCalls_Test.java index d61a5daa8b..55519119be 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_BasicCalls_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_BasicCalls_Test.java @@ -25,15 +25,18 @@ import java.io.*; import java.util.function.*; -import org.apache.http.*; -import org.apache.http.client.utils.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.net.URIBuilder; +import org.apache.hc.client5.http.utils.*; import org.apache.juneau.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.apache.juneau.http.classic.part.*; import org.apache.juneau.marshall.marshaller.*; import org.apache.juneau.rest.mock.classic.*; import org.apache.juneau.rest.server.*; +import org.apache.juneau.rest.server.Method; import org.apache.juneau.rest.server.httppart.*; import org.apache.juneau.rest.server.servlet.*; import org.apache.juneau.utest.utils.*; diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Body_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Body_Test.java index 2f06c5ce9e..1369b36c12 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Body_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Body_Test.java @@ -23,7 +23,7 @@ import java.io.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.*; import org.apache.juneau.marshall.json.*; import org.apache.juneau.marshall.json5.*; diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Config_RestClient_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Config_RestClient_Test.java index 7d686ba4c9..10de27db57 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Config_RestClient_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Config_RestClient_Test.java @@ -27,8 +27,8 @@ import java.util.concurrent.*; import java.util.logging.*; -import org.apache.http.*; -import org.apache.http.protocol.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.protocol.*; import org.apache.juneau.TestBase; import org.apache.juneau.commons.*; import org.apache.juneau.commons.httppart.*; @@ -105,7 +105,7 @@ public A1(RestClient client) { super(client); } @Override - public HttpResponse run(HttpHost target, HttpRequest request, HttpContext context) throws IOException { + public ClassicHttpResponse run(HttpHost target, ClassicHttpRequest request, HttpContext context) throws IOException { request.addHeader("Check","Foo"); request.addHeader("Foo","baz"); return super.run(target,request,context); @@ -473,17 +473,18 @@ private static Object in(HttpPartType type, HttpPartSchema schema, String in, Cl } @Test void a16_request_uriParts() throws Exception { - var uri = client().build().get().uriScheme("http").uriHost("localhost").uriPort(8080).uriUserInfo("foo:bar").uri("/bean").uriFragment("baz").queryData("foo","bar").run().assertContent("{\"f\":1}").getRequest().getURI(); - assertEquals("http://foo:bar@localhost:8080/bean?foo=bar#baz",uri.toString()); - - uri = client().build().get().uriScheme("http").uriHost("localhost").uriPort(8080).uriUserInfo("foo","bar").uri("/bean").uriFragment("baz").queryData("foo","bar").run().assertContent("{\"f\":1}").getRequest().getURI(); - assertEquals("http://foo:bar@localhost:8080/bean?foo=bar#baz",uri.toString()); - - uri = client().build().get().uri("http://localhost").uri("http://foo:bar@localhost:8080/bean?foo=bar#baz").run().assertContent("{\"f\":1}").getRequest().getURI(); - assertEquals("http://foo:bar@localhost:8080/bean?foo=bar#baz",uri.toString()); - - uri = client().build().get().uri(new java.net.URI(null,null,null,null)).uri(new java.net.URI("http://foo:bar@localhost:8080/bean?foo=bar#baz")).run().assertContent("{\"f\":1}").getRequest().getURI(); - assertEquals("http://foo:bar@localhost:8080/bean?foo=bar#baz",uri.toString()); + var requests = new RestRequest[] { + client().build().get().uriScheme("http").uriHost("localhost").uriPort(8080).uriUserInfo("foo:bar").uri("/bean").uriFragment("baz").queryData("foo","bar"), + client().build().get().uriScheme("http").uriHost("localhost").uriPort(8080).uriUserInfo("foo","bar").uri("/bean").uriFragment("baz").queryData("foo","bar"), + client().build().get().uri("http://localhost").uri("http://foo:bar@localhost:8080/bean?foo=bar#baz"), + client().build().get().uri(new java.net.URI(null,null,null,null)).uri(new java.net.URI("http://foo:bar@localhost:8080/bean?foo=bar#baz")) + }; + for (var request : requests) { + // HttpClient 5 rejects userinfo in outgoing request authorities. + var exception = assertThrows(RestCallException.class, request::run); + assertTrue(exception.getCause().getMessage().contains("deprecated userinfo")); + assertEquals("http://localhost:8080/bean?foo=bar", request.getUri().toString()); + } } @Test void a17_getRootUrl() { diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_FormData_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_FormData_Test.java index 2559c3fdc0..9b11a88b3c 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_FormData_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_FormData_Test.java @@ -22,7 +22,7 @@ import java.io.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.*; import org.apache.juneau.http.classic.part.*; import org.apache.juneau.marshall.collections.*; diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Headers_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Headers_Test.java index 092819690a..13d9e0d27d 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Headers_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Headers_Test.java @@ -163,7 +163,7 @@ public HttpPartSerializerSession getPartSession() { checkClient("Cache-Control").headers(new CacheControl("none")).header("X-Expect","none").build().get("/headers").run().assertContent("[\"none\"]"); checkClient("Client-Version").headers(new ClientVersion("1")).build().get("/headers").run().assertContent("[\"1\"]"); checkClient("Connection").headers(new Connection("foo")).build().get("/headers").run().assertContent("[\"foo\"]"); - checkClient("Content-Length").headers(new ContentLength(123L)).build().get("/headers").run().assertContent("[\"123\"]"); + assertThrowsWithMessage(RestCallException.class, "Call failed.", () -> checkClient("Content-Length").headers(new ContentLength(123L)).build().get("/headers").run()); checkClient("Content-Type").headers(new ContentType("foo")).build().get("/headers").run().assertContent("[\"foo\"]"); checkClient("Date").headers(new org.apache.juneau.http.classic.header.Date(PARSEDZONEDDATETIME)).build().get("/headers").run().assertContent("[\""+PARSEDZONEDDATETIME+"\"]"); checkClient("Date").headers(new org.apache.juneau.http.classic.header.Date(ZONEDDATETIME)).build().get("/headers").run().assertContent("[\""+PARSEDZONEDDATETIME+"\"]"); @@ -214,7 +214,7 @@ public HttpPartSerializerSession getPartSession() { // Helper methods. //------------------------------------------------------------------------------------------------------------------ - private static org.apache.http.Header header(String name, String val) { + private static org.apache.hc.core5.http.Header header(String name, String val) { return basicHeader(name, val); } diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Logging_StreamClosed_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Logging_StreamClosed_Test.java index c4d3916d4c..7cd2610714 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Logging_StreamClosed_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Logging_StreamClosed_Test.java @@ -22,9 +22,9 @@ import java.nio.charset.*; import java.util.logging.*; -import org.apache.http.*; -import org.apache.http.entity.*; -import org.apache.http.message.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.io.entity.*; +import org.apache.hc.core5.http.message.*; import org.apache.juneau.*; import org.apache.juneau.marshall.*; import org.apache.juneau.marshall.parser.*; @@ -113,8 +113,8 @@ public TestClient entity(HttpEntity entity) { } @Override - protected MockRestResponse createResponse(RestRequest request, HttpResponse httpResponse, Parser parser) throws RestCallException { - var r = new BasicHttpResponse(new ProtocolVersion("http", 1, 1), 200, ""); + protected MockRestResponse createResponse(RestRequest request, ClassicHttpResponse httpResponse, Parser parser) throws RestCallException { + var r = new org.apache.hc.core5.http.message.BasicClassicHttpResponse(200, ""); r.setEntity(responseEntity); r.addHeader("Content-Type", "application/json"); return new MockRestResponse(this, request, r, parser); @@ -123,7 +123,7 @@ protected MockRestResponse createResponse(RestRequest request, HttpResponse http private static InputStreamEntity failingEntity(String body) { var data = body.getBytes(StandardCharsets.UTF_8); - return new InputStreamEntity(new FailingAfterCloseStream(data)); + return new InputStreamEntity(new FailingAfterCloseStream(data), null); } //------------------------------------------------------------------------------------------------------------------ diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Logging_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Logging_Test.java index 62c80bf279..7d2174b78f 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Logging_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Logging_Test.java @@ -20,7 +20,7 @@ import java.io.*; import java.util.logging.*; -import org.apache.http.entity.*; +import org.apache.hc.core5.http.io.entity.*; import org.apache.juneau.*; import org.apache.juneau.http.*; import org.apache.juneau.marshall.*; @@ -83,7 +83,7 @@ public ABean bean() { "---request content---", "{\"f\":1}", "=== RESPONSE ===", - "HTTP/1.1 200 ", + "HTTP/1.1 200 OK", "---response headers---", " Content-Type: application/json", "---response content---", @@ -100,7 +100,7 @@ public ABean bean() { "---request headers---", " Accept: application/json", "=== RESPONSE ===", - "HTTP/1.1 200 ", + "HTTP/1.1 200 OK", "---response headers---", " Content-Type: application/json", "---response content---", @@ -109,7 +109,7 @@ public ABean bean() { ); c.reset(); - clientPlain().logRequests(DetailLevel.FULL,Level.SEVERE,null).logToConsole().logger(l).console(c).build().post("/stream",new InputStreamEntity(inputStream("foo"))).complete(); + clientPlain().logRequests(DetailLevel.FULL,Level.SEVERE,null).logToConsole().logger(l).console(c).build().post("/stream",new InputStreamEntity(inputStream("foo"), null)).complete(); c.assertContents().asReplaceAll("\\tX-Request-Id: [^\\r\\n]*\\R", "").asTrimmed().isLines( "=== HTTP Call (outgoing) ======================================================", "=== REQUEST ===", @@ -117,7 +117,7 @@ public ABean bean() { "---request headers---", "---request entity---", "=== RESPONSE ===", - "HTTP/1.1 200 ", + "HTTP/1.1 200 OK", "---response headers---", " Content-Encoding: identity", "---response content---", @@ -126,7 +126,7 @@ public ABean bean() { ); c.reset(); - clientPlain().logRequests(DetailLevel.FULL,Level.SEVERE,(req,res)->false).logToConsole().logger(l).console(c).build().post("/stream",new InputStreamEntity(inputStream("foo"))).complete(); + clientPlain().logRequests(DetailLevel.FULL,Level.SEVERE,(req,res)->false).logToConsole().logger(l).console(c).build().post("/stream",new InputStreamEntity(inputStream("foo"), null)).complete(); c.assertContents().isEmpty(); c.reset(); } @@ -141,7 +141,7 @@ public ABean bean() { client().logger(l).logRequests(DetailLevel.SIMPLE,Level.WARNING,null).build().post("/bean",bean).complete(); l.assertLastLevel(Level.WARNING); - l.assertLastMessage().is("HTTP POST http://localhost/bean, HTTP/1.1 200 "); + l.assertLastMessage().is("HTTP POST http://localhost/bean, HTTP/1.1 200 OK"); l.assertContents().isContains("WARNING: HTTP POST http://localhost/bean, HTTP/1.1 200"); l.reset(); @@ -158,7 +158,7 @@ public ABean bean() { "---request content---", "{\"f\":1}", "=== RESPONSE ===", - "HTTP/1.1 200 ", + "HTTP/1.1 200 OK", "---response headers---", " Content-Type: application/json", "---response content---", @@ -177,7 +177,7 @@ public ABean bean() { "---request content---", "{\"f\":1}", "=== RESPONSE ===", - "HTTP/1.1 200 ", + "HTTP/1.1 200 OK", "---response headers---", " Content-Type: application/json", "---response content---", diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Paths_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Paths_Test.java index bd83e7b599..e4e1453667 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Paths_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Paths_Test.java @@ -55,8 +55,8 @@ public String toString() { } @Test void a01_path_String_Object() throws Exception { - client().build().get("/echo/{x}").pathData("x",new A1().init()).run().assertContent().isContains("GET /echo/x=1 HTTP/1.1"); - client().build().get("/echo/*").pathData("/*",new A1().init()).run().assertContent().isContains("GET /echo/x=1 HTTP/1.1"); + client().build().get("/echo/{x}").pathData("x",new A1().init()).run().assertContent().isContains("GET /echo/x%3D1 HTTP/1.1"); + client().build().get("/echo/*").pathData("/*",new A1().init()).run().assertContent().isContains("GET /echo/x%3D1 HTTP/1.1"); assertThrowsWithMessage(IllegalStateException.class, "Path variable {y} was not found in path.", ()->client().build().get("/echo/{x}").pathData("y","foo").run()); } diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Response_Body_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Response_Body_Test.java index b26c5c56bd..96f8826656 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Response_Body_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Response_Body_Test.java @@ -31,10 +31,11 @@ import java.util.*; import java.util.regex.*; -import org.apache.http.*; -import org.apache.http.conn.*; -import org.apache.http.entity.*; -import org.apache.http.message.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.io.EofSensorInputStream; +import org.apache.hc.client5.http.io.*; +import org.apache.hc.core5.http.io.entity.*; +import org.apache.hc.core5.http.message.*; import org.apache.juneau.*; import org.apache.juneau.marshall.*; import org.apache.juneau.marshall.collections.*; @@ -93,8 +94,8 @@ public TestClient(MockRestClient.Builder builder) { super(builder); } @Override - protected MockRestResponse createResponse(RestRequest request, HttpResponse httpResponse, Parser parser) throws RestCallException { - var r = new BasicHttpResponse(new ProtocolVersion("http", 1,1),200,""); + protected MockRestResponse createResponse(RestRequest request, ClassicHttpResponse httpResponse, Parser parser) throws RestCallException { + var r = new org.apache.hc.core5.http.message.BasicClassicHttpResponse(200, ""); r.setEntity(responseEntity); for (var h : headers) r.addHeader(h); @@ -134,7 +135,7 @@ protected MockRestResponse createResponse(RestRequest request, HttpResponse http is = r3.getContent().asInputStream(); assertEquals("{f:2}", toUtf8(is)); is = x.get("/bean").run().getContent().asInputStream(); - ((EofSensorInputStream)is).abortConnection(); + ((EofSensorInputStream)is).abort(); var rci = new BasicRestCallInterceptor() { @Override @@ -146,7 +147,7 @@ public void onClose(RestRequest req, RestResponse res) throws Exception { var x2 = client().interceptors(rci).build(TestClient.class).entity(new StringEntity("{f:2}")); assertThrowsWithMessage(NullPointerException.class, "foo", ()->x2.get("/bean").run().getContent().cache().asInputStream()); assertThrowsWithMessage(NullPointerException.class, "foo", ()->x2.get("/bean").run().getContent().asInputStream().close()); - assertThrowsWithMessage(NullPointerException.class, "foo", ((EofSensorInputStream)x2.get("/bean").run().getContent().asInputStream())::abortConnection); + assertThrowsWithMessage(NullPointerException.class, "foo", ((EofSensorInputStream)x2.get("/bean").run().getContent().asInputStream())::abort); } @Test void a04_asReader() throws Exception { @@ -171,7 +172,7 @@ public void onClose(RestRequest req, RestResponse res) throws Exception { x = client().build().get("/bean").run().assertContent().asBytes().asString().is("{\"f\":1}").getContent().asBytes(); assertEquals("{\"f\":1}", toUtf8(x)); - assertThrowsWithMessage(Exception.class, "foo", ()->testClient().entity(new InputStreamEntity(badStream())).get().run().getContent().asBytes()); + assertThrowsWithMessage(Exception.class, "foo", ()->testClient().entity(new InputStreamEntity(badStream(), null)).get().run().getContent().asBytes()); } @Test void a06_pipeTo() throws Exception { @@ -241,7 +242,7 @@ public A7c() { var x14 = testClient().entity(stringEntity("{f:1}")).get().run().getContent().asString(); assertEquals("{f:1}", x14); - assertThrowsWithMessage(Exception.class, "foo", ()->testClient().entity(new InputStreamEntity(badStream())).get().run().getContent().asString()); + assertThrowsWithMessage(Exception.class, "foo", ()->testClient().entity(new InputStreamEntity(badStream(), null)).get().run().getContent().asString()); var x16 = testClient().entity(stringEntity("{f:1}")).get().run().getContent().asStringFuture(); assertEquals("{f:1}", x16.get()); @@ -281,14 +282,14 @@ public A7c() { assertFalse(x2.isChunked()); - testClient().entity(inputStreamEntity("foo")).get().run().getContent().getContentEncoding().assertValue().isNull(); + testClient().entity(inputStreamEntity("foo")).get().run().getContent().getContentEncodingHeader().assertValue().isNull(); var x3 = inputStreamEntity("foo"); x3.setContentType("text/foo"); x3.setContentEncoding("identity"); testClient().entity(x3).get().run().getContent().response() - .getContent().getContentType().assertValue().is("text/foo").response() - .getContent().getContentEncoding().assertValue().is("identity"); + .getContent().getContentTypeHeader().assertValue().is("text/foo").response() + .getContent().getContentEncodingHeader().assertValue().is("identity"); var x4 = testClient().entity(inputStreamEntity("foo")).get().run().getContent().asInputStream(); assertBytes(x4).asString().is("foo"); @@ -301,18 +302,18 @@ public A7c() { assertFalse(testClient().entity(inputStreamEntity("foo")).get().run().getContent().cache().isStreaming()); assertFalse(testClient().entity(stringEntity("foo")).get().run().getContent().isStreaming()); - testClient().entity(inputStreamEntity("foo")).get().run().getContent().consumeContent(); + testClient().entity(inputStreamEntity("foo")).get().run().getContent().close(); } @Test void b02_head() throws Exception { assertFalse(client().build().head("").run().getContent().isRepeatable()); assertFalse(client().build().head("").run().getContent().isChunked()); assertEquals(-1L, client().build().head("").run().getContent().getContentLength()); - client().build().head("").run().getContent().getContentType().assertValue().isNull(); - client().build().head("").run().getContent().getContentEncoding().assertValue().isNull(); + client().build().head("").run().getContent().getContentTypeHeader().assertValue().isNull(); + client().build().head("").run().getContent().getContentEncodingHeader().assertValue().isNull(); client().build().head("").run().getContent().writeTo(new ByteArrayOutputStream()); assertFalse(client().build().head("").run().getContent().isStreaming()); - client().build().head("").run().getContent().consumeContent(); + client().build().head("").run().getContent().close(); } //------------------------------------------------------------------------------------------------------------------ @@ -339,8 +340,8 @@ private static Header header(String name, Object val) { return basicHeader(name, val); } - private static InputStreamEntity inputStreamEntity(String in) { - return new InputStreamEntity(inputStream(in)); + private static org.apache.juneau.http.classic.entity.StreamEntity inputStreamEntity(String in) { + return new org.apache.juneau.http.classic.entity.StreamEntity().setContent(inputStream(in)); } private static ClassMeta cm(Class t) { diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Response_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Response_Test.java index 2d6fefd033..d1a68efb33 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Response_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Response_Test.java @@ -25,10 +25,9 @@ import java.time.*; import java.util.*; -import org.apache.http.*; -import org.apache.http.entity.*; -import org.apache.http.message.*; -import org.apache.http.params.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.io.entity.*; +import org.apache.hc.core5.http.message.*; import org.apache.juneau.*; import org.apache.juneau.http.*; import org.apache.juneau.marshall.json5.*; @@ -70,15 +69,15 @@ public A1(MockRestClient.Builder b) { super(b); } @Override - protected MockRestResponse createResponse(RestRequest request, HttpResponse httpResponse, Parser parser) throws RestCallException { + protected MockRestResponse createResponse(RestRequest request, ClassicHttpResponse httpResponse, Parser parser) throws RestCallException { return new MockRestResponse(this, request, null, parser); } } @Test void a01_getStatusLine() throws RestCallException { assertEquals(200,client().build().get("/bean").run().getStatusLine().getStatusCode()); - assertThrowsWithMessage(Exception.class, "caused response code '0, null'", ()->client().build(A1.class).get("/bean").run()); - assertEquals(0,client().ignoreErrors().build(A1.class).get("/bean").run().getStatusLine().getStatusCode()); + assertThrowsWithMessage(Exception.class, "caused response code '500, Missing HTTP response'", ()->client().build(A1.class).get("/bean").run()); + assertEquals(500,client().ignoreErrors().build(A1.class).get("/bean").run().getStatusLine().getStatusCode()); } @Test void a03_getStatusCode() throws RestCallException { @@ -86,11 +85,11 @@ protected MockRestResponse createResponse(RestRequest request, HttpResponse http } @Test void a05_getReasonPhrase() throws RestCallException { - assertNull(client().build().get("/bean").run().getReasonPhrase()); + assertEquals("OK",client().build().get("/bean").run().getReasonPhrase()); } @Test void a07_setStatusLine() throws RestCallException { - var sl = new BasicStatusLine(new ProtocolVersion("http",9,8),299,"foo"); + var sl = new StatusLine(new ProtocolVersion("http",9,8),299,"foo"); var r = client().build().get("/bean").run(); r.setStatusLine(sl); r @@ -109,7 +108,7 @@ protected MockRestResponse createResponse(RestRequest request, HttpResponse http r.setStatusLine(new ProtocolVersion("http",9,8),296,"foo"); r.assertStatus(296); - assertEquals(9, r.getProtocolVersion().getMajor()); + assertEquals(9, r.getVersion().getMajor()); } @Test void a08_setLocale() throws RestCallException { @@ -180,10 +179,10 @@ public String getHeader(org.apache.juneau.rest.server.RestRequest req, org.apach r.getLastHeader("Foo").assertValue().is("quux"); var i = r.headerIterator(); - assertEquals("quux", i.nextHeader().getValue()); + assertEquals("quux", i.next().getValue()); i = r.headerIterator("Foo"); - assertEquals("quux", i.nextHeader().getValue()); + assertEquals("quux", i.next().getValue()); r.removeHeader(basicHeader("Foo","quux")); assertFalse(r.getFirstHeader("Foo").isPresent()); @@ -218,13 +217,6 @@ public ABean bean(@Content ABean bean) { // Other. //------------------------------------------------------------------------------------------------------------------ - @Test void e01_response_getParams_setParams() throws Exception { - var x = client(D.class).build().post("/bean",bean).run(); - var p = new BasicHttpParams(); - x.setParams(p); - assertSame(x.getParams(), p); - } - //------------------------------------------------------------------------------------------------------------------ // Helper methods. //------------------------------------------------------------------------------------------------------------------ diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Test.java index 3e52ab88c5..0ec4d88236 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Test.java @@ -26,15 +26,17 @@ import java.util.concurrent.*; import java.util.concurrent.atomic.*; -import org.apache.http.*; -import org.apache.http.auth.*; -import org.apache.http.client.config.*; -import org.apache.http.client.methods.*; -import org.apache.http.concurrent.*; -import org.apache.http.impl.client.*; -import org.apache.http.message.*; -import org.apache.http.params.*; -import org.apache.http.protocol.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.impl.io.HttpRequestExecutor; +import org.apache.hc.core5.http.io.HttpClientConnection; +import org.apache.hc.client5.http.impl.DefaultRedirectStrategy; +import org.apache.hc.client5.http.auth.*; +import org.apache.hc.client5.http.config.*; +import org.apache.hc.client5.http.classic.methods.*; +import org.apache.hc.core5.concurrent.*; +import org.apache.hc.client5.http.impl.classic.*; +import org.apache.hc.core5.http.message.*; +import org.apache.hc.core5.http.protocol.*; import org.apache.juneau.*; import org.apache.juneau.commons.reflect.*; import org.apache.juneau.marshall.parser.*; @@ -133,13 +135,13 @@ protected RestRequest createRequest(java.net.URI uri, String method, boolean has return super.createRequest(uri, method, hasBody); } @Override - protected RestResponse createResponse(RestRequest req, HttpResponse httpResponse, Parser parser) throws RestCallException { + protected RestResponse createResponse(RestRequest req, ClassicHttpResponse httpResponse, Parser parser) throws RestCallException { createResponseCalled = true; return super.createResponse(req, httpResponse, parser); } @Override /* HttpClient */ - public HttpResponse execute(HttpUriRequest request, HttpContext context) throws IOException { - return new BasicHttpResponse(new ProtocolVersion("http",1,1),200,null); + public ClassicHttpResponse execute(ClassicHttpRequest request, HttpContext context) throws IOException { + return new org.apache.hc.core5.http.message.BasicClassicHttpResponse(200, null); } } @@ -155,20 +157,20 @@ public HttpResponse execute(HttpUriRequest request, HttpContext context) throws public static class C01 implements HttpRequestInterceptor, HttpResponseInterceptor { @Override - public void process(HttpRequest request, HttpContext context) throws HttpException, IOException { + public void process(HttpRequest request, EntityDetails entity, HttpContext context) throws HttpException, IOException { request.setHeader("A1","1"); } @Override - public void process(HttpResponse response, HttpContext context) throws HttpException,IOException { + public void process(HttpResponse response, EntityDetails entity, HttpContext context) throws HttpException,IOException { response.setHeader("B1","1"); } } @Test void c01_httpClient_interceptors() throws Exception { - HttpRequestInterceptor x1 = (request, context) -> request.setHeader("A1","1"); - HttpResponseInterceptor x2 = (response, context) -> response.setHeader("B1","1"); - HttpRequestInterceptor x3 = (request, context) -> request.setHeader("A2","2"); - HttpResponseInterceptor x4 = (response, context) -> response.setHeader("B2","2"); + HttpRequestInterceptor x1 = (request, entity, context) -> request.setHeader("A1","1"); + HttpResponseInterceptor x2 = (response, entity, context) -> response.setHeader("B1","1"); + HttpRequestInterceptor x3 = (request, entity, context) -> request.setHeader("A2","2"); + HttpResponseInterceptor x4 = (response, entity, context) -> response.setHeader("B2","2"); client().addInterceptorFirst(x1).addInterceptorLast(x2).addInterceptorFirst(x3).addInterceptorLast(x4) .build().get("/echo").run().assertContent().isContains("A1: 1","A2: 2").assertHeader("B1").is("1").assertHeader("B2").is("2"); @@ -179,11 +181,11 @@ public void process(HttpResponse response, HttpContext context) throws HttpExcep @Test void c02_httpClient_httpProcessor() throws RestCallException { var x = new HttpProcessor() { @Override - public void process(HttpRequest request, HttpContext context) throws HttpException, IOException { + public void process(HttpRequest request, EntityDetails entity, HttpContext context) throws HttpException, IOException { request.setHeader("A1","1"); } @Override - public void process(HttpResponse response, HttpContext context) throws HttpException, IOException { + public void process(HttpResponse response, EntityDetails entity, HttpContext context) throws HttpException, IOException { response.setHeader("B1","1"); } }; @@ -194,9 +196,9 @@ public void process(HttpResponse response, HttpContext context) throws HttpExcep var b1 = new AtomicBoolean(); var x = new HttpRequestExecutor() { @Override - public HttpResponse execute(HttpRequest request, HttpClientConnection conn, HttpContext context) throws HttpException, IOException { + public ClassicHttpResponse execute(ClassicHttpRequest request, HttpClientConnection conn, org.apache.hc.core5.http.io.HttpResponseInformationCallback informationCallback, HttpContext context) throws HttpException, IOException { b1.set(true); - return super.execute(request, conn, context); + return super.execute(request, conn, informationCallback, context); } }; client().requestExecutor(x).build().get("/echo").run().assertContent().isContains("GET /echo HTTP/1.1"); @@ -213,8 +215,8 @@ public HttpResponse execute(HttpRequest request, HttpClientConnection conn, Http @Test void c06_httpClient_unusedHttpClientMethods() { var x = RestClient.create().build(); - assertThrows(UnsupportedOperationException.class, x::getParams); - assertNotNull(x.getConnectionManager()); + + assertNotNull(x.getHttpClientConnectionManager()); } @Test void c07_httpClient_executeHttpUriRequest() throws Exception { @@ -244,28 +246,28 @@ public HttpResponse execute(HttpRequest request, HttpClientConnection conn, Http @Test void c10_httpClient_executeResponseHandler() throws Exception { var x = new HttpGet("http://localhost/bean"); x.addHeader("Accept","application/json"); - var res = MockRestClient.create(A.class).build().execute(x,new BasicResponseHandler()); + var res = MockRestClient.create(A.class).build().execute(x,new BasicHttpClientResponseHandler()); assertEquals("{\"f\":1}",res); } @Test void c11_httpClient_executeHttpUriRequestResponseHandlerHttpContext() throws Exception { var x = new HttpGet("http://localhost/bean"); x.addHeader("Accept","application/json"); - var res = MockRestClient.create(A.class).build().execute(x,new BasicResponseHandler(),new BasicHttpContext()); + var res = MockRestClient.create(A.class).build().execute(x,new BasicHttpContext(),new BasicHttpClientResponseHandler()); assertEquals("{\"f\":1}",res); } @Test void c12_httpClient_executeHttpHostHttpRequestResponseHandlerHttpContext() throws Exception { var x = new HttpGet("http://localhost/bean"); x.addHeader("Accept","application/json"); - var res = MockRestClient.create(A.class).build().execute(new HttpHost("localhost"),x,new BasicResponseHandler(),new BasicHttpContext()); + var res = MockRestClient.create(A.class).build().execute(new HttpHost("localhost"),x,new BasicHttpContext(),new BasicHttpClientResponseHandler()); assertEquals("{\"f\":1}",res); } @Test void c13_httpClient_executeHttpHostHttpRequestResponseHandler() throws Exception { var x = new HttpGet("http://localhost/bean"); x.addHeader("Accept","application/json"); - var res = MockRestClient.create(A.class).build().execute(new HttpHost("localhost"),x,new BasicResponseHandler()); + var res = MockRestClient.create(A.class).build().execute(new HttpHost("localhost"),x,new BasicHttpClientResponseHandler()); assertEquals("{\"f\":1}",res); } @@ -301,7 +303,7 @@ public String echo(@org.apache.juneau.http.Header("Authorization") String auth, } @Test void d01_basicAuth() throws RestCallException { - client(D.class).basicAuth(AuthScope.ANY_HOST,AuthScope.ANY_PORT,"user","pw").build().get("/echo").run().assertContent().isContains("OK"); + client(D.class).basicAuth(null,-1,"user","pw").build().get("/echo").run().assertContent().isContains("OK"); } //------------------------------------------------------------------------------------------------------------------ @@ -325,7 +327,7 @@ public boolean cancel() { @Test void e03_httpRequestBase_protocolVersion() throws Exception { client().build().get("/bean").protocolVersion(new ProtocolVersion("http", 2, 0)).run().assertStatus(200); - var x = client().build().get("/bean").protocolVersion(new ProtocolVersion("http", 2, 0)).getProtocolVersion(); + var x = client().build().get("/bean").protocolVersion(new ProtocolVersion("http", 2, 0)).getVersion(); assertEquals(2,x.getMajor()); } @@ -401,13 +403,6 @@ public boolean cancel() { assertEquals("Foo: bar", x.headerIterator("Foo").next().toString()); } - - @Test void e15_httpMessage_getParams() throws Exception { - var p = new BasicHttpParams(); - var x = client().build().get("/bean"); - x.setParams(p); - assertEquals(p, x.getParams()); - } @Test void e16_toMap() throws Exception { assertNotNull(client().build().toString()); diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/Path_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/Path_Test.java index 1cf65b4a66..22491544cc 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/Path_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/Path_Test.java @@ -21,7 +21,7 @@ import java.util.*; -import org.apache.http.client.config.*; +import org.apache.hc.client5.http.config.*; import org.apache.juneau.TestBase; import org.apache.juneau.commons.*; import org.apache.juneau.commons.utils.*; @@ -409,7 +409,7 @@ public String f(RequestPathParamList path) { } @Test void f01_pathVariablesOnClass() throws Exception { - var f = MockRestClient.createLax(F.class).servletPath("/f").defaultRequestConfig(RequestConfig.custom().setNormalizeUri(false).build()).build(); + var f = MockRestClient.createLax(F.class).servletPath("/f").defaultRequestConfig(RequestConfig.custom().build()).build(); f.get("http://localhost/f/x1/x2") .run() .assertContent("a: {a=x1,b=x2}"); @@ -492,7 +492,7 @@ public String f(RequestPathParamList path) { public static class G {} @Test void g01_pathVariablesOnChildClass() throws Exception { - var g = MockRestClient.createLax(G.class).defaultRequestConfig(RequestConfig.custom().setNormalizeUri(false).build()).build(); + var g = MockRestClient.createLax(G.class).defaultRequestConfig(RequestConfig.custom().build()).build(); g.get("http://localhost/f/x1/x2") .run() .assertContent("a: {a=x1,b=x2}"); @@ -563,7 +563,7 @@ public static class G {} public static class H {} @Test void h01_pathVariablesOnParentAndChildClass() throws Exception { - var h = MockRestClient.createLax(H.class).servletPath("/h").defaultRequestConfig(RequestConfig.custom().setNormalizeUri(false).build()).build(); + var h = MockRestClient.createLax(H.class).servletPath("/h").defaultRequestConfig(RequestConfig.custom().build()).build(); h.get("http://localhost/h/ha1/hb1/f/x1/x2") .run() .assertContent("a: {a=x1,b=x2,ha=ha1,hb=hb1}"); diff --git a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/Paths_Test.java b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/Paths_Test.java index 06de7d4c1c..8236191736 100644 --- a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/Paths_Test.java +++ b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/Paths_Test.java @@ -16,7 +16,7 @@ */ package org.apache.juneau.rest.server; -import org.apache.http.client.config.*; +import org.apache.hc.client5.http.config.*; import org.apache.juneau.*; import org.apache.juneau.http.*; import org.apache.juneau.marshall.collections.*; @@ -53,7 +53,7 @@ public JsonMap get(RestRequest req, @Path("/*") String r) { return getPaths(req).append("pathRemainder2", r).append("method",1); } } - static MockRestClient a = MockRestClient.create(A.class).contextPath("/cp").servletPath("/sp").defaultRequestConfig(RequestConfig.custom().setNormalizeUri(false).build()).build(); + static MockRestClient a = MockRestClient.create(A.class).contextPath("/cp").servletPath("/sp").defaultRequestConfig(RequestConfig.custom().build()).build(); @Test void a01() throws Exception { a.get("http://localhost/cp/sp").run() @@ -192,7 +192,7 @@ public JsonMap get(RestRequest req, @Path("/*") String r) { return getPaths(req).append("pathRemainder2", r).append("method",2); } } - static MockRestClient b = MockRestClient.create(B.class).contextPath("/cp").servletPath("/sp").defaultRequestConfig(RequestConfig.custom().setNormalizeUri(false).build()).build(); + static MockRestClient b = MockRestClient.create(B.class).contextPath("/cp").servletPath("/sp").defaultRequestConfig(RequestConfig.custom().build()).build(); @Test void b01() throws Exception { b.get("http://localhost/cp/sp/subpath").run() @@ -335,7 +335,7 @@ public JsonMap get(RestRequest req, @Path("/*") String r) { return getPaths(req).append("pathRemainder2", r).append("method",3); } } - static MockRestClient c = MockRestClient.create(C.class).contextPath("/cp").servletPath("/sp").defaultRequestConfig(RequestConfig.custom().setNormalizeUri(false).build()).build(); + static MockRestClient c = MockRestClient.create(C.class).contextPath("/cp").servletPath("/sp").defaultRequestConfig(RequestConfig.custom().build()).build(); @Test void c01() throws Exception { c.get("http://localhost/cp/sp/a").run() @@ -478,7 +478,7 @@ public JsonMap get(RestRequest req, @Path("/*") String r) { return getPaths(req).append("pathRemainder2", r).append("method",4); } } - static MockRestClient d = MockRestClient.create(D.class).contextPath("/cp").servletPath("/sp").defaultRequestConfig(RequestConfig.custom().setNormalizeUri(false).build()).build(); + static MockRestClient d = MockRestClient.create(D.class).contextPath("/cp").servletPath("/sp").defaultRequestConfig(RequestConfig.custom().build()).build(); @Test void d01() throws Exception { d.get("http://localhost/cp/sp/a/subpath").run() diff --git a/juneau-rest/juneau-rest-client-apache-httpclient-45/pom.xml b/juneau-rest/juneau-rest-client-apache-httpclient-45/pom.xml index c61b86606c..fb30b9eb09 100644 --- a/juneau-rest/juneau-rest-client-apache-httpclient-45/pom.xml +++ b/juneau-rest/juneau-rest-client-apache-httpclient-45/pom.xml @@ -26,8 +26,8 @@ juneau-rest-client-apache-httpclient-45 - Apache Juneau NG REST Client — Apache HttpClient 4.5 Transport - Apache HttpClient 4.5 transport adapter for the next-generation Juneau REST client. + Apache Juneau NG REST Client — Apache HttpClient 5.6 Transport + Apache HttpClient 5.6 transport adapter for the next-generation Juneau REST client. bundle @@ -41,9 +41,8 @@ ${project.version} - org.apache.httpcomponents - httpclient - 4.5.14 + org.apache.httpcomponents.client5 + httpclient5 org.junit.jupiter diff --git a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/ApacheHc45Transport.java b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/ApacheHc45Transport.java index 382d482cf5..44866e9819 100644 --- a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/ApacheHc45Transport.java +++ b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/ApacheHc45Transport.java @@ -20,22 +20,23 @@ import java.net.*; import java.util.*; -import org.apache.http.*; -import org.apache.http.client.methods.*; -import org.apache.http.config.*; -import org.apache.http.conn.socket.*; -import org.apache.http.conn.ssl.*; -import org.apache.http.entity.*; -import org.apache.http.impl.client.*; -import org.apache.http.impl.conn.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.client5.http.classic.methods.*; +import org.apache.hc.core5.http.config.*; +import org.apache.hc.client5.http.socket.*; +import org.apache.hc.client5.http.ssl.*; +import org.apache.hc.core5.http.io.entity.*; +import org.apache.hc.client5.http.impl.DefaultHttpRequestRetryStrategy; +import org.apache.hc.client5.http.impl.classic.*; +import org.apache.hc.client5.http.impl.io.*; import org.apache.juneau.rest.client.*; /** - * {@link HttpTransport} implementation backed by Apache HttpClient 4.5. + * {@link HttpTransport} implementation backed by Apache HttpClient 5.6. * *

* This transport is auto-discovered via {@link java.util.ServiceLoader} when - * {@code org.apache.httpcomponents:httpclient} is on the classpath. You can also instantiate it explicitly: + * {@code org.apache.httpcomponents.client5:httpclient5} is on the classpath. You can also instantiate it explicitly: * *

* transport = ApacheHc45Transport.builder() @@ -81,10 +82,22 @@ private static CloseableHttpClient createDefaultHttpClient() { .register("http", PlainConnectionSocketFactory.getSocketFactory()) .register("https", SSLConnectionSocketFactory.getSocketFactory()) .build(); - var connectionManager = new PoolingHttpClientConnectionManager(registry, PolicyPinningDnsResolver.INSTANCE); + var connectionManager = new PoolingHttpClientConnectionManager(registry, org.apache.hc.core5.pool.PoolConcurrencyPolicy.STRICT, org.apache.hc.core5.pool.PoolReusePolicy.LIFO, org.apache.hc.core5.util.TimeValue.NEG_ONE_MILLISECOND, null, PolicyPinningDnsResolver.INSTANCE, null); return HttpClients.custom() .setConnectionManager(connectionManager) - .addInterceptorLast(new Hc45RedirectCredentialGuard()) + // Preserve HttpClient 4 IO retries without adding HttpClient 5 response-status retries. + .setRetryStrategy(new DefaultHttpRequestRetryStrategy(3, org.apache.hc.core5.util.TimeValue.ZERO_MILLISECONDS) { + @Override + protected boolean handleAsIdempotent(HttpRequest request) { + return request instanceof ClassicHttpRequest classic && classic.getEntity() == null; + } + + @Override + public boolean retryRequest(HttpResponse response, int executionCount, org.apache.hc.core5.http.protocol.HttpContext context) { + return false; + } + }) + .addRequestInterceptorLast(new Hc45RedirectCredentialGuard()) .setRedirectStrategy(new PolicyAwareRedirectStrategy()) .build(); } @@ -179,8 +192,8 @@ private TransportResponse sendOnce(TransportRequest request) throws TransportExc } // A failure is a stale-connection (pre-response) failure when the server closed the pooled connection before - // sending any response. Apache HttpClient 4.5 surfaces this as a NoHttpResponseException ("failed to respond") - // or a connection-reset SocketException. HttpClient 4.5's default retry handler does not retry these for + // sending any response. Apache HttpClient 5.6 surfaces this as a NoHttpResponseException ("failed to respond") + // or a connection-reset SocketException. The configured retry strategy does not retry these for // entity-enclosing idempotent methods (e.g. PUT) or for POST, so the transport applies its own idempotency-safe // retry here. private static boolean isStaleConnectionFailure(IOException e) { @@ -189,24 +202,15 @@ private static boolean isStaleConnectionFailure(IOException e) { } private static void closeQuietly(CloseableHttpResponse hcResponse) { - try { - hcResponse.close(); - } catch (IOException e) { - // Best-effort cleanup on an already-failing path; nothing more can be done. - } - } - - @Override /* Closeable */ - public void close() throws IOException { - httpClient.close(); + hcResponse.close(org.apache.hc.core5.io.CloseMode.IMMEDIATE); } // ----------------------------------------------------------------------------------------------------------------- // Internal helpers // ----------------------------------------------------------------------------------------------------------------- - private static HttpUriRequest buildHcRequest(TransportRequest request) throws TransportException { - var builder = RequestBuilder.create(request.getMethod()).setUri(request.getUri()); + private static ClassicHttpRequest buildHcRequest(TransportRequest request) throws TransportException { + var builder = org.apache.hc.core5.http.io.support.ClassicRequestBuilder.create(request.getMethod()).setUri(request.getUri()); for (var h : request.getHeaders()) builder.addHeader(h.name(), h.value()); var body = request.getBody(); @@ -220,14 +224,19 @@ private static HttpUriRequest buildHcRequest(TransportRequest request) throws Tr } private static TransportResponse buildTransportResponse(CloseableHttpResponse hcResponse) throws TransportException { - var statusLine = hcResponse.getStatusLine(); + var statusLine = new org.apache.hc.core5.http.message.StatusLine(hcResponse); var builder = TransportResponse.builder() .statusCode(statusLine.getStatusCode()) .reasonPhrase(statusLine.getReasonPhrase()) .closeCallback(hcResponse); - for (var h : hcResponse.getAllHeaders()) + for (var h : hcResponse.getHeaders()) builder.header(h.getName(), h.getValue()); var entity = hcResponse.getEntity(); + var contentType = hcResponse.getFirstHeader("Content-Type"); + if (contentType != null && "text/event-stream".equalsIgnoreCase(contentType.getValue().split(";", 2)[0].trim())) { + // An SSE stream has no final chunk to drain; close the connection to unblock any reader. + builder.closeCallback(() -> hcResponse.close(org.apache.hc.core5.io.CloseMode.IMMEDIATE)); + } if (entity != null) { try { builder.body(entity.getContent()); @@ -268,12 +277,13 @@ static final class TransportBodyEntity extends AbstractHttpEntity { private final TransportBody body; TransportBodyEntity(TransportBody body) { + super(body.getContentType(), null); this.body = body; - var ct = body.getContentType(); - if (ct != null) - setContentType(ct); } + @Override + public void close() { } + @Override /* HttpEntity */ public boolean isRepeatable() { return body.isRepeatable(); diff --git a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/ApacheHc45TransportBuilder.java b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/ApacheHc45TransportBuilder.java index 77afc1bc33..d08b8c3141 100644 --- a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/ApacheHc45TransportBuilder.java +++ b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/ApacheHc45TransportBuilder.java @@ -16,8 +16,7 @@ */ package org.apache.juneau.rest.client.apachehttpclient45; - -import org.apache.http.impl.client.*; +import org.apache.hc.client5.http.impl.classic.*; import static org.apache.juneau.commons.utils.Shorts.*; /** diff --git a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/ApacheHc45TransportProvider.java b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/ApacheHc45TransportProvider.java index 31bf3ce5f3..1457f291fd 100644 --- a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/ApacheHc45TransportProvider.java +++ b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/ApacheHc45TransportProvider.java @@ -23,7 +23,7 @@ * *

* Registered via {@code META-INF/services/org.apache.juneau.rest.client.HttpTransportProvider} so that - * {@code RestClient} can auto-discover Apache HttpClient 4.5 when this module is on the classpath. + * {@code RestClient} can auto-discover Apache HttpClient 5.6 when this module is on the classpath. * *

* Beta — API subject to change: This type is part of the next-generation REST client and HTTP stack. @@ -49,7 +49,7 @@ public int getPriority() { @Override /* HttpTransportProvider */ public boolean isAvailable() { try { - Class.forName("org.apache.http.impl.client.CloseableHttpClient"); + Class.forName("org.apache.hc.client5.http.impl.classic.CloseableHttpClient"); return true; } catch (ClassNotFoundException e) { return false; diff --git a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/Hc45RedirectCredentialGuard.java b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/Hc45RedirectCredentialGuard.java index 844009c52c..c68570918c 100644 --- a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/Hc45RedirectCredentialGuard.java +++ b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/Hc45RedirectCredentialGuard.java @@ -18,8 +18,8 @@ import java.net.*; -import org.apache.http.*; -import org.apache.http.protocol.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.protocol.*; import org.apache.juneau.rest.client.*; /** @@ -44,8 +44,9 @@ final class Hc45RedirectCredentialGuard implements HttpRequestInterceptor { private static final String ATTR_ORIGIN = Hc45RedirectCredentialGuard.class.getName() + ".origin"; @Override /* HttpRequestInterceptor */ - public void process(HttpRequest request, HttpContext context) { - var target = HttpCoreContext.adapt(context).getTargetHost(); + public void process(HttpRequest request, EntityDetails entity, HttpContext context) { + var route = org.apache.hc.client5.http.protocol.HttpClientContext.adapt(context).getHttpRoute(); + var target = route == null ? null : route.getTargetHost(); if (target == null) return; var current = originOf(target); diff --git a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/PolicyAwareRedirectStrategy.java b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/PolicyAwareRedirectStrategy.java index 4b42915376..006c07d4fe 100644 --- a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/PolicyAwareRedirectStrategy.java +++ b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/PolicyAwareRedirectStrategy.java @@ -16,9 +16,9 @@ */ package org.apache.juneau.rest.client.apachehttpclient45; -import org.apache.http.*; -import org.apache.http.impl.client.*; -import org.apache.http.protocol.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.client5.http.impl.DefaultRedirectStrategy; +import org.apache.hc.core5.http.protocol.*; /** * {@link DefaultRedirectStrategy} that never auto-follows a redirect while @@ -36,6 +36,16 @@ */ final class PolicyAwareRedirectStrategy extends DefaultRedirectStrategy { + @Override + public boolean isRedirectAllowed(HttpHost currentTarget, HttpHost newTarget, HttpRequest request, HttpContext context) { + if (org.apache.juneau.rest.client.RedirectSecurity.shouldStripCredentials( + java.net.URI.create(currentTarget.toURI()), java.net.URI.create(newTarget.toURI()))) { + for (var name : org.apache.juneau.rest.client.RedirectSecurity.stripOnCrossOrigin()) + request.removeHeaders(name); + } + return super.isRedirectAllowed(currentTarget, newTarget, request, context); + } + @Override /* DefaultRedirectStrategy */ public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context) throws ProtocolException { if (ApacheHc45Transport.isPolicyActive()) diff --git a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/PolicyPinningDnsResolver.java b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/PolicyPinningDnsResolver.java index 9e4b08015c..0cd22f1074 100644 --- a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/PolicyPinningDnsResolver.java +++ b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/PolicyPinningDnsResolver.java @@ -18,8 +18,9 @@ import java.net.*; -import org.apache.http.conn.*; -import org.apache.http.impl.conn.*; +import org.apache.hc.client5.http.*; +import org.apache.hc.client5.http.impl.*; +import org.apache.hc.client5.http.impl.io.*; import org.apache.juneau.http.remote.*; /** @@ -38,6 +39,9 @@ final class PolicyPinningDnsResolver implements DnsResolver { private PolicyPinningDnsResolver() {} + @Override + public String resolveCanonicalHostname(String host) throws UnknownHostException { return host; } + @Override /* DnsResolver */ public InetAddress[] resolve(String host) throws UnknownHostException { if (! ApacheHc45Transport.isPolicyActive()) diff --git a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/package-info.java b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/package-info.java index 20edd061cf..f476a2acf3 100644 --- a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/package-info.java +++ b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/main/java/org/apache/juneau/rest/client/apachehttpclient45/package-info.java @@ -16,7 +16,7 @@ */ /** - * {@code HttpTransport} implementation for the next-generation REST client backed by Apache HttpClient 4.5. + * {@code HttpTransport} implementation for the next-generation REST client backed by Apache HttpClient 5.6. * *

* Provides the transport ({@link org.apache.juneau.rest.client.apachehttpclient45.ApacheHc45Transport}), diff --git a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/test/java/org/apache/juneau/rest/client/ApacheHc45Transport_ErrorPaths_Test.java b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/test/java/org/apache/juneau/rest/client/ApacheHc45Transport_ErrorPaths_Test.java index a025a469ad..9c2d0ae440 100644 --- a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/test/java/org/apache/juneau/rest/client/ApacheHc45Transport_ErrorPaths_Test.java +++ b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/test/java/org/apache/juneau/rest/client/ApacheHc45Transport_ErrorPaths_Test.java @@ -21,14 +21,13 @@ import java.io.*; import java.net.*; -import org.apache.http.*; -import org.apache.http.client.methods.*; -import org.apache.http.conn.*; -import org.apache.http.entity.*; -import org.apache.http.impl.client.*; -import org.apache.http.message.*; -import org.apache.http.params.*; -import org.apache.http.protocol.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.client5.http.classic.methods.*; +import org.apache.hc.client5.http.io.*; +import org.apache.hc.core5.http.io.entity.*; +import org.apache.hc.client5.http.impl.classic.*; +import org.apache.hc.core5.http.message.*; +import org.apache.hc.core5.http.protocol.*; import org.apache.juneau.rest.client.apachehttpclient45.*; import org.junit.jupiter.api.*; @@ -47,24 +46,23 @@ class ApacheHc45Transport_ErrorPaths_Test { @FunctionalInterface private interface Executor { - CloseableHttpResponse execute(HttpHost target, HttpRequest request, HttpContext context) throws IOException; + ClassicHttpResponse execute(HttpHost target, ClassicHttpRequest request, HttpContext context) throws IOException; } private static final class FakeHttpClient extends CloseableHttpClient { private final Executor executor; FakeHttpClient(Executor executor) { this.executor = executor; } - @Override protected CloseableHttpResponse doExecute(HttpHost target, HttpRequest request, HttpContext context) throws IOException { - return executor.execute(target, request, context); + @Override protected CloseableHttpResponse doExecute(HttpHost target, ClassicHttpRequest request, HttpContext context) throws IOException { + return CloseableHttpResponse.adapt(executor.execute(target, request, context)); } @Override public void close() { /* no real connections to release */ } - @Override @Deprecated public HttpParams getParams() { return null; } - @Override @Deprecated public ClientConnectionManager getConnectionManager() { return null; } + @Override public void close(org.apache.hc.core5.io.CloseMode mode) { } } - private static final class FakeResponse extends BasicHttpResponse implements CloseableHttpResponse { + private static final class FakeResponse extends BasicClassicHttpResponse { boolean closeThrows; boolean closed; - FakeResponse(int statusCode) { super(new BasicStatusLine(HttpVersion.HTTP_1_1, statusCode, "OK")); } + FakeResponse(int statusCode) { super(statusCode, "OK"); } @Override public void close() throws IOException { closed = true; if (closeThrows) @@ -74,6 +72,8 @@ private static final class FakeResponse extends BasicHttpResponse implements Clo /** An entity whose {@code getContent()} always fails — simulates a body-read wiring failure. */ private static final class ThrowingEntity extends AbstractHttpEntity { + ThrowingEntity() { super((String)null, null); } + @Override public void close() { } @Override public boolean isRepeatable() { return true; } @Override public long getContentLength() { return -1; } @Override public InputStream getContent() throws IOException { throw new IOException("content-boom"); } diff --git a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/test/java/org/apache/juneau/rest/client/ApacheHc45Transport_StaleConnectionRetry_Test.java b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/test/java/org/apache/juneau/rest/client/ApacheHc45Transport_StaleConnectionRetry_Test.java index 2f9dda0cb6..fa594bc664 100644 --- a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/test/java/org/apache/juneau/rest/client/ApacheHc45Transport_StaleConnectionRetry_Test.java +++ b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/test/java/org/apache/juneau/rest/client/ApacheHc45Transport_StaleConnectionRetry_Test.java @@ -34,9 +34,8 @@ * non-idempotent request (e.g. {@code POST}) under the same condition. * *

- * The positive case uses {@code PUT} deliberately: HttpClient 4.5's own default retry handler does not retry - * entity-enclosing methods such as {@code PUT} once the request has been sent, so a successful retry here proves the - * transport-level retry — not the underlying client's built-in handler — is doing the work. + * The positive case uses {@code PUT}. The underlying client does not retry entity-enclosing requests, so a successful retry proves that + * the transport handles a stale connection without replaying a non-idempotent request.

*/ @SuppressWarnings({ "resource" // Transport/client instances are short-lived test fixtures. diff --git a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/test/java/org/apache/juneau/rest/client/ApacheHc45Transport_Test.java b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/test/java/org/apache/juneau/rest/client/ApacheHc45Transport_Test.java index 75aad258f0..b8f4e8f40f 100644 --- a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/test/java/org/apache/juneau/rest/client/ApacheHc45Transport_Test.java +++ b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/test/java/org/apache/juneau/rest/client/ApacheHc45Transport_Test.java @@ -38,6 +38,8 @@ class ApacheHc45Transport_Test { private static HttpServer server; private static int port; + private static final java.util.concurrent.CountDownLatch streamRelease = new java.util.concurrent.CountDownLatch(1); + private static final java.util.concurrent.atomic.AtomicInteger unavailableCalls = new java.util.concurrent.atomic.AtomicInteger(); @BeforeAll static void startServer() throws IOException { @@ -87,6 +89,27 @@ static void startServer() throws IOException { exchange.close(); }); + server.createContext("/unavailable", exchange -> { + unavailableCalls.incrementAndGet(); + exchange.getRequestBody().readAllBytes(); + exchange.sendResponseHeaders(503, -1); + exchange.close(); + }); + + server.createContext("/sse", exchange -> { + exchange.getResponseHeaders().add("Content-Type", "text/event-stream; charset=UTF-8"); + exchange.sendResponseHeaders(200, 0); + exchange.getResponseBody().write("data: foo\n\n".getBytes(StandardCharsets.UTF_8)); + exchange.getResponseBody().flush(); + try { + streamRelease.await(10, java.util.concurrent.TimeUnit.SECONDS); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } finally { + exchange.close(); + } + }); + server.start(); } @@ -137,6 +160,34 @@ void a03_get_responseHeader() throws Exception { } } + @Test + void a04_post503_isNotReplayed() throws Exception { + unavailableCalls.set(0); + try (var client = RestClient.builder().transport(ApacheHc45Transport.create()).rootUrl(rootUrl()).build()) { + try (var response = client.post("/unavailable").body(StringBody.of("foo", "text/plain")).run()) { + assertEquals(503, response.getStatusCode()); + } + } + assertEquals(1, unavailableCalls.get()); + } + + @Test + void a05_sse_closeDoesNotWaitForStreamEnd() throws Exception { + var executor = java.util.concurrent.Executors.newSingleThreadExecutor(); + try (var client = RestClient.builder().transport(ApacheHc45Transport.create()).rootUrl(rootUrl()).build()) { + var response = client.get("/sse").run(); + try { + assertEquals("data: foo\n\n", new String(response.getBodyStream().readNBytes(11), StandardCharsets.UTF_8)); + executor.submit(() -> { response.close(); return null; }).get(2, java.util.concurrent.TimeUnit.SECONDS); + } finally { + streamRelease.countDown(); + response.close(); + } + } finally { + executor.shutdownNow(); + } + } + // ================================================================================================================= // B — HTTP methods // ================================================================================================================= @@ -283,7 +334,7 @@ void d02_missingHeader_returnsDefault() throws Exception { @Test void e01_builder_withExplicitHttpClient() throws Exception { var transport = ApacheHc45Transport.builder() - .httpClient(org.apache.http.impl.client.HttpClients.createDefault()) + .httpClient(org.apache.hc.client5.http.impl.classic.HttpClients.createDefault()) .build(); try (var client = RestClient.builder().transport(transport).rootUrl(rootUrl()).build()) { try (var response = client.get("/hello").run()) { diff --git a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/test/java/org/apache/juneau/rest/client/apachehttpclient45/ApacheHc45Transport_TransportBodyEntity_Test.java b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/test/java/org/apache/juneau/rest/client/apachehttpclient45/ApacheHc45Transport_TransportBodyEntity_Test.java index 25b7f53fed..ea13bbe5da 100644 --- a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/test/java/org/apache/juneau/rest/client/apachehttpclient45/ApacheHc45Transport_TransportBodyEntity_Test.java +++ b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/test/java/org/apache/juneau/rest/client/apachehttpclient45/ApacheHc45Transport_TransportBodyEntity_Test.java @@ -18,7 +18,7 @@ import static org.junit.jupiter.api.Assertions.*; -import org.apache.http.entity.*; +import org.apache.hc.core5.http.io.entity.*; import org.apache.juneau.http.entity.*; import org.apache.juneau.rest.client.*; import org.junit.jupiter.api.*; diff --git a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/test/java/org/apache/juneau/rest/client/apachehttpclient45/Hc45RedirectCredentialGuard_Test.java b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/test/java/org/apache/juneau/rest/client/apachehttpclient45/Hc45RedirectCredentialGuard_Test.java index 1d9dcfaa0f..e25bf918c4 100644 --- a/juneau-rest/juneau-rest-client-apache-httpclient-45/src/test/java/org/apache/juneau/rest/client/apachehttpclient45/Hc45RedirectCredentialGuard_Test.java +++ b/juneau-rest/juneau-rest-client-apache-httpclient-45/src/test/java/org/apache/juneau/rest/client/apachehttpclient45/Hc45RedirectCredentialGuard_Test.java @@ -18,9 +18,9 @@ import static org.junit.jupiter.api.Assertions.*; -import org.apache.http.*; -import org.apache.http.message.*; -import org.apache.http.protocol.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.message.*; +import org.apache.hc.core5.http.protocol.*; import org.junit.jupiter.api.*; /** @@ -40,7 +40,7 @@ void a01_noTargetHostInContext_isNoOp() { var context = new BasicHttpContext(); var request = new BasicHttpRequest("GET", "/"); request.addHeader("Authorization", "Bearer secret"); - assertDoesNotThrow(() -> guard.process(request, context)); + assertDoesNotThrow(() -> guard.process(request, null, context)); assertNotNull(request.getFirstHeader("Authorization"), "with no target host to compare against, credentials must be left untouched"); } @@ -50,20 +50,20 @@ void a02_targetHostToURIThrows_originUnresolvable_isNoOp() { // HttpHost.toURI() produces a string that URI.create(...) rejects with IllegalArgumentException — // exactly the case originOf(...) guards against. var context = new BasicHttpContext(); - HttpCoreContext.adapt(context).setTargetHost(new HttpHost("exa|mple.com", 80, "http")); + org.apache.hc.client5.http.protocol.HttpClientContext.adapt(context).setRoute(new org.apache.hc.client5.http.HttpRoute(new HttpHost("http", "exa|mple.com", 80))); var request = new BasicHttpRequest("GET", "/"); request.addHeader("Authorization", "Bearer secret"); - assertDoesNotThrow(() -> guard.process(request, context)); + assertDoesNotThrow(() -> guard.process(request, null, context)); assertNotNull(request.getFirstHeader("Authorization"), "an unresolvable origin must not strip credentials"); } @Test void a03_firstRequestInExchange_recordsOriginWithoutStrippingCredentials() { var context = new BasicHttpContext(); - HttpCoreContext.adapt(context).setTargetHost(new HttpHost("example.com", 80, "http")); + org.apache.hc.client5.http.protocol.HttpClientContext.adapt(context).setRoute(new org.apache.hc.client5.http.HttpRoute(new HttpHost("http", "example.com", 80))); var request = new BasicHttpRequest("GET", "/"); request.addHeader("Authorization", "Bearer secret"); - guard.process(request, context); + guard.process(request, null, context); assertNotNull(request.getFirstHeader("Authorization"), "the first request of an exchange only records the origin; nothing to compare against yet"); } } diff --git a/juneau-rest/juneau-rest-client-apache-httpclient-50/pom.xml b/juneau-rest/juneau-rest-client-apache-httpclient-50/pom.xml index 0cda662cec..dc3ae3ddc9 100644 --- a/juneau-rest/juneau-rest-client-apache-httpclient-50/pom.xml +++ b/juneau-rest/juneau-rest-client-apache-httpclient-50/pom.xml @@ -43,7 +43,6 @@ org.apache.httpcomponents.client5 httpclient5 - 5.6.4 org.junit.jupiter diff --git a/juneau-rest/juneau-rest-client-apache-httpclient-50/src/main/java/org/apache/juneau/rest/client/apachehttpclient50/ApacheHc5Transport.java b/juneau-rest/juneau-rest-client-apache-httpclient-50/src/main/java/org/apache/juneau/rest/client/apachehttpclient50/ApacheHc5Transport.java index b2d6fea7ca..9a9408ca1d 100644 --- a/juneau-rest/juneau-rest-client-apache-httpclient-50/src/main/java/org/apache/juneau/rest/client/apachehttpclient50/ApacheHc5Transport.java +++ b/juneau-rest/juneau-rest-client-apache-httpclient-50/src/main/java/org/apache/juneau/rest/client/apachehttpclient50/ApacheHc5Transport.java @@ -147,7 +147,10 @@ private TransportResponse sendOnce(TransportRequest request) throws TransportExc private static void closeQuietly(ClassicHttpResponse hcResponse) { try { - hcResponse.close(); + if (hcResponse instanceof org.apache.hc.core5.io.ModalCloseable closeable) + closeable.close(org.apache.hc.core5.io.CloseMode.IMMEDIATE); + else + hcResponse.close(); } catch (IOException e) { // Best-effort cleanup on an already-failing path; nothing more can be done. } @@ -190,6 +193,12 @@ private static TransportResponse buildTransportResponse(ClassicHttpResponse hcRe for (var h : hcResponse.getHeaders()) builder.header(h.getName(), h.getValue()); var entity = hcResponse.getEntity(); + var contentType = hcResponse.getFirstHeader("Content-Type"); + if (contentType != null && "text/event-stream".equalsIgnoreCase(contentType.getValue().split(";", 2)[0].trim()) + && hcResponse instanceof org.apache.hc.core5.io.ModalCloseable closeable) { + // An SSE stream has no final chunk to drain; close the connection to unblock any reader. + builder.closeCallback(() -> closeable.close(org.apache.hc.core5.io.CloseMode.IMMEDIATE)); + } if (entity != null) { try { builder.body(entity.getContent()); diff --git a/juneau-rest/juneau-rest-client-classic/pom.xml b/juneau-rest/juneau-rest-client-classic/pom.xml index 94813d7821..b4add02470 100644 --- a/juneau-rest/juneau-rest-client-classic/pom.xml +++ b/juneau-rest/juneau-rest-client-classic/pom.xml @@ -27,7 +27,7 @@ juneau-rest-client-classic Apache Juneau REST Client (Classic) - Apache Juneau REST Client API - Classic (Apache HttpClient 4.5-based) + Apache Juneau REST Client API - Classic (Apache HttpClient 5.6-based) bundle @@ -51,9 +51,8 @@ ${project.version} - org.apache.httpcomponents - httpclient - 4.5.14 + org.apache.httpcomponents.client5 + httpclient5 org.apache.juneau diff --git a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/BasicHttpEntityRequestBase.java b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/BasicHttpEntityRequestBase.java index ef2ec589ca..5e548d98fe 100644 --- a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/BasicHttpEntityRequestBase.java +++ b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/BasicHttpEntityRequestBase.java @@ -16,7 +16,7 @@ */ package org.apache.juneau.rest.client.classic; -import org.apache.http.client.methods.*; +import org.apache.hc.client5.http.classic.methods.*; /** * Inner request class of {@link RestRequest} for requests with bodies. @@ -28,17 +28,18 @@ @SuppressWarnings({ "resource" // restRequest is owned by the RestClient call chain; lifecycle managed by the enclosing RestCall }) -class BasicHttpEntityRequestBase extends HttpEntityEnclosingRequestBase implements RestRequestCreated { +class BasicHttpEntityRequestBase extends HttpUriRequestBase implements RestRequestCreated { final String method; final RestRequest restRequest; BasicHttpEntityRequestBase(RestRequest restRequest, String method) { + super(method, java.net.URI.create("/")); this.restRequest = restRequest; this.method = method; } - @Override /* Overridden from HttpRequestBase */ + @Override /* Overridden from HttpUriRequestBase */ public String getMethod() { return method; } @Override /* Overridden from RestRequestCreated */ diff --git a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/BasicHttpRequestBase.java b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/BasicHttpRequestBase.java index 27a3014e63..131662b179 100644 --- a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/BasicHttpRequestBase.java +++ b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/BasicHttpRequestBase.java @@ -16,7 +16,7 @@ */ package org.apache.juneau.rest.client.classic; -import org.apache.http.client.methods.*; +import org.apache.hc.client5.http.classic.methods.*; /** * Inner request class of {@link RestRequest} for requests without bodies. @@ -28,17 +28,18 @@ @SuppressWarnings({ "resource" // restRequest is owned by the RestClient call chain; lifecycle managed by the enclosing RestCall }) -class BasicHttpRequestBase extends HttpRequestBase implements RestRequestCreated { +class BasicHttpRequestBase extends HttpUriRequestBase implements RestRequestCreated { final String method; final RestRequest restRequest; BasicHttpRequestBase(RestRequest restRequest, String method) { + super(method, java.net.URI.create("/")); this.method = method; this.restRequest = restRequest; } - @Override /* Overridden from HttpRequestBase */ + @Override /* Overridden from HttpUriRequestBase */ public String getMethod() { return method; } @Override /* Overridden from RestRequestCreated */ diff --git a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/BasicHttpRequestRetryHandler.java b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/BasicHttpRequestRetryHandler.java index 8c360fc73b..2a1cddc596 100644 --- a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/BasicHttpRequestRetryHandler.java +++ b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/BasicHttpRequestRetryHandler.java @@ -18,19 +18,21 @@ import java.io.*; -import org.apache.http.impl.client.*; -import org.apache.http.protocol.*; +import org.apache.hc.client5.http.impl.classic.*; +import org.apache.hc.client5.http.impl.DefaultHttpRequestRetryStrategy; +import org.apache.hc.core5.http.protocol.*; /** - * An extension of {@link StandardHttpRequestRetryHandler} that adds support for a retry interval. + * An extension of {@link DefaultHttpRequestRetryStrategy} that adds support for a retry interval. * *
See Also:
*/ -class BasicHttpRequestRetryHandler extends StandardHttpRequestRetryHandler { +class BasicHttpRequestRetryHandler extends DefaultHttpRequestRetryStrategy { private final int retryInterval; + private final boolean requestSentRetryEnabled; /** * Create the request retry handler. @@ -48,12 +50,23 @@ class BasicHttpRequestRetryHandler extends StandardHttpRequestRetryHandler { * @param requestSentRetryEnabled Specify true if it's OK to retry non-idempotent requests that have been sent. */ public BasicHttpRequestRetryHandler(int retryCount, int retryInterval, boolean requestSentRetryEnabled) { - super(retryCount, requestSentRetryEnabled); + super(retryCount, org.apache.hc.core5.util.TimeValue.ofMilliseconds(Math.max(0, retryInterval))); this.retryInterval = retryInterval; + this.requestSentRetryEnabled = requestSentRetryEnabled; } @Override - public boolean retryRequest(IOException exception, int executionCount, HttpContext context) { + public boolean retryRequest(org.apache.hc.core5.http.HttpResponse response, int executionCount, HttpContext context) { + return false; + } + + @Override + protected boolean handleAsIdempotent(org.apache.hc.core5.http.HttpRequest request) { + return requestSentRetryEnabled || super.handleAsIdempotent(request); + } + + @Override + public boolean retryRequest(org.apache.hc.core5.http.HttpRequest request, IOException exception, int executionCount, HttpContext context) { if (retryInterval > 0) { try { Thread.sleep(retryInterval); @@ -61,6 +74,6 @@ public boolean retryRequest(IOException exception, int executionCount, HttpConte Thread.currentThread().interrupt(); } } - return super.retryRequest(exception, executionCount, context); + return super.retryRequest(request, exception, executionCount, context); } } \ No newline at end of file diff --git a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/BasicRestCallHandler.java b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/BasicRestCallHandler.java index 9a146d945c..d911a5f736 100644 --- a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/BasicRestCallHandler.java +++ b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/BasicRestCallHandler.java @@ -18,9 +18,10 @@ import java.io.*; -import org.apache.http.*; -import org.apache.http.client.methods.*; -import org.apache.http.protocol.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.io.*; +import org.apache.hc.client5.http.classic.methods.*; +import org.apache.hc.core5.http.protocol.*; /** * Default HTTP call handler. @@ -48,7 +49,7 @@ public BasicRestCallHandler(RestClient client) { } @Override /* Overridden from RestCallHandler */ - public HttpResponse run(HttpHost target, HttpRequest request, HttpContext context) throws IOException { + public ClassicHttpResponse run(HttpHost target, ClassicHttpRequest request, HttpContext context) throws IOException { return target == null ? client.execute((HttpUriRequest)request, context) : client.execute(target, request, context); } } \ No newline at end of file diff --git a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/ClassicRedirectCredentialGuard.java b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/ClassicRedirectCredentialGuard.java index e4441b6c74..3fc2c52d99 100644 --- a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/ClassicRedirectCredentialGuard.java +++ b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/ClassicRedirectCredentialGuard.java @@ -18,8 +18,9 @@ import java.net.*; -import org.apache.http.*; -import org.apache.http.protocol.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.io.*; +import org.apache.hc.core5.http.protocol.*; import org.apache.juneau.rest.client.*; /** @@ -44,8 +45,9 @@ final class ClassicRedirectCredentialGuard implements HttpRequestInterceptor { private static final String ATTR_ORIGIN = ClassicRedirectCredentialGuard.class.getName() + ".origin"; @Override /* HttpRequestInterceptor */ - public void process(HttpRequest request, HttpContext context) { - var target = HttpCoreContext.adapt(context).getTargetHost(); + public void process(HttpRequest request, EntityDetails entity, HttpContext context) { + var route = org.apache.hc.client5.http.protocol.HttpClientContext.adapt(context).getHttpRoute(); + var target = route == null ? null : route.getTargetHost(); if (target == null) return; var current = originOf(target); diff --git a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/PolicyAwareRedirectStrategy.java b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/PolicyAwareRedirectStrategy.java index 8a7fb19e3c..edfd265652 100644 --- a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/PolicyAwareRedirectStrategy.java +++ b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/PolicyAwareRedirectStrategy.java @@ -16,9 +16,10 @@ */ package org.apache.juneau.rest.client.classic; -import org.apache.http.*; -import org.apache.http.impl.client.*; -import org.apache.http.protocol.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.io.*; +import org.apache.hc.client5.http.impl.DefaultRedirectStrategy; +import org.apache.hc.core5.http.protocol.*; import org.apache.juneau.rest.client.classic.remote.*; /** @@ -37,6 +38,16 @@ */ final class PolicyAwareRedirectStrategy extends DefaultRedirectStrategy { + @Override + public boolean isRedirectAllowed(HttpHost currentTarget, HttpHost newTarget, HttpRequest request, HttpContext context) { + if (org.apache.juneau.rest.client.RedirectSecurity.shouldStripCredentials( + java.net.URI.create(currentTarget.toURI()), java.net.URI.create(newTarget.toURI()))) { + for (var name : org.apache.juneau.rest.client.RedirectSecurity.stripOnCrossOrigin()) + request.removeHeaders(name); + } + return super.isRedirectAllowed(currentTarget, newTarget, request, context); + } + @Override /* DefaultRedirectStrategy */ public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context) throws ProtocolException { if (RemoteUrlPolicyState.isActive()) diff --git a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/PolicyPinningDnsResolver.java b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/PolicyPinningDnsResolver.java index b13437b446..c8fab60ff6 100644 --- a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/PolicyPinningDnsResolver.java +++ b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/PolicyPinningDnsResolver.java @@ -18,8 +18,9 @@ import java.net.*; -import org.apache.http.conn.*; -import org.apache.http.impl.conn.*; +import org.apache.hc.client5.http.*; +import org.apache.hc.client5.http.impl.*; +import org.apache.hc.client5.http.impl.io.*; import org.apache.juneau.http.remote.*; import org.apache.juneau.rest.client.classic.remote.*; @@ -40,6 +41,9 @@ final class PolicyPinningDnsResolver implements DnsResolver { private PolicyPinningDnsResolver() {} + @Override + public String resolveCanonicalHostname(String host) throws UnknownHostException { return host; } + @Override /* DnsResolver */ public InetAddress[] resolve(String host) throws UnknownHostException { if (! RemoteUrlPolicyState.isActive()) diff --git a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/ResponseContent.java b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/ResponseContent.java index db312883c5..0b9f62da4b 100644 --- a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/ResponseContent.java +++ b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/ResponseContent.java @@ -24,12 +24,14 @@ import java.io.*; import java.lang.reflect.*; +import java.lang.reflect.Method; import java.nio.charset.*; import java.util.concurrent.*; import java.util.regex.*; -import org.apache.http.*; -import org.apache.http.conn.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.io.*; +import org.apache.hc.client5.http.io.*; import org.apache.juneau.commons.conversion.*; import org.apache.juneau.commons.http.*; import org.apache.juneau.commons.utils.*; @@ -74,7 +76,7 @@ public class ResponseContent implements HttpEntity { private static final HttpEntity NULL_ENTITY = new HttpEntity() { @Override - public void consumeContent() throws IOException { + public void close() throws IOException { // No-op: Mock implementation - full functionality not required } @@ -82,13 +84,19 @@ public void consumeContent() throws IOException { public InputStream getContent() throws IOException, UnsupportedOperationException { return new ByteArrayInputStream(new byte[0]); } @Override - public Header getContentEncoding() { return ResponseHeader.NULL_HEADER; } + public String getContentEncoding() { return null; } @Override public long getContentLength() { return -1; } @Override - public Header getContentType() { return ResponseHeader.NULL_HEADER; } + public String getContentType() { return null; } + + @Override + public java.util.Set getTrailerNames() { return java.util.Set.of(); } + + @Override + public org.apache.hc.core5.function.Supplier> getTrailers() { return null; } @Override public boolean isChunked() { return false; } @@ -166,7 +174,7 @@ public ResponseContent(RestClient client, RestRequest request, RestResponse resp *
  • {@link Reader} - Returns access to the raw reader of the response. *
  • {@link InputStream} - Returns access to the raw input stream of the response. *
  • {@link HttpResource} - Response will be converted to a {@link StreamResource}. - *
  • Any type that takes in an {@link HttpResponse} object. + *
  • Any type that takes in an {@link ClassicHttpResponse} object. * *
  • * If {@link #cache()} or {@link RestResponse#cacheContent()} has been called, this method can be can be called multiple times and/or combined with @@ -254,13 +262,13 @@ public T as(ClassMeta type) throws RestCallException { if (type.isChildOf(RecordReader.class) || type.is(RecordReader.class)) return (T) asCursor(type); - if (type.is(HttpResponse.class)) + if (type.is(ClassicHttpResponse.class)) return (T)response; if (type.is(HttpResource.class) || type.is(BasicResource.class)) type = (ClassMeta)getClassMeta(StreamResource.class); - var result = type.getPublicConstructor(x -> x.hasParameterTypes(HttpResponse.class)).map(ci -> safe(() -> (T)ci.newInstance(response))); + var result = type.getPublicConstructor(x -> x.hasParameterTypes(ClassicHttpResponse.class)).map(ci -> safe(() -> (T)ci.newInstance(response))); if (result.isPresent()) return result.get(); @@ -433,7 +441,7 @@ private Object asCursor(ClassMeta type) throws RestCallException { *
  • {@link Reader} - Returns access to the raw reader of the response. *
  • {@link InputStream} - Returns access to the raw input stream of the response. *
  • {@link HttpResource} - Response will be converted to a {@link StreamResource}. - *
  • Any type that takes in an {@link HttpResponse} object. + *
  • Any type that takes in an {@link ClassicHttpResponse} object. * *
  • * If {@link #cache()} or {@link RestResponse#cacheContent()} has been called, this method can be can be called multiple times and/or combined with @@ -793,7 +801,7 @@ public Reader asReader() throws IOException { // Figure out what the charset of the response is. String cs = null; - var ct = getContentType().orElse(null); + var ct = getContentTypeHeader().orElse(null); // First look for "charset=" in Content-Type header of response. if (nn(ct) && ct.contains("charset=")) @@ -1025,23 +1033,13 @@ public ResponseContent cache() { } /** - * This method is called to indicate that the content of this entity is no longer required. - * - *

    - * This method is of particular importance for entities being received from a connection. - *
    The entity needs to be consumed completely in order to re-use the connection with keep-alive. + * Closes the underlying response entity. * * @throws IOException If an I/O error occurs. - * @deprecated Use standard java convention to ensure resource deallocation by calling {@link InputStream#close()} on - * the input stream returned by {@link #getContent()} */ - @Override /* Overridden from HttpEntity */ - @Deprecated(since = "10.0", forRemoval = true) - @SuppressWarnings({ - "java:S1133" // Intentional deprecation retained for backward compatibility until the documented removal; the reminder is not actionable now. - }) - public void consumeContent() throws IOException { - entity.consumeContent(); + @Override + public void close() throws IOException { + entity.close(); } /** @@ -1070,8 +1068,7 @@ public void consumeContent() throws IOException { * * @return The Content-Encoding header for this entity. Never null, but wraps a null value if the content encoding is unknown. */ - @Override /* Overridden from HttpEntity */ - public ResponseHeader getContentEncoding() { return new ResponseHeader("Content-Encoding", request, response, entity.getContentEncoding()); } + public ResponseHeader getContentEncodingHeader() { return new ResponseHeader("Content-Encoding", request, response, org.apache.juneau.http.classic.HttpHeaders.stringHeader("Content-Encoding", entity.getContentEncoding())); } /** * Tells the length of the content, if known. @@ -1084,7 +1081,7 @@ public void consumeContent() throws IOException { public long getContentLength() { return nn(body) ? body.length : entity.getContentLength(); } /** - * Obtains the Content-Type header, if known. + * Gets the Content-Type header, if known. * *

    * This is the header that should be used when sending the entity, or the one that was received with the entity. @@ -1092,8 +1089,19 @@ public void consumeContent() throws IOException { * * @return The Content-Type header for this entity. Never null, but wraps a null value if the content type is unknown. */ - @Override /* Overridden from HttpEntity */ - public ResponseHeader getContentType() { return new ResponseHeader(HEADER_ContentType, request, response, entity.getContentType()); } + public ResponseHeader getContentTypeHeader() { return new ResponseHeader(HEADER_ContentType, request, response, org.apache.juneau.http.classic.HttpHeaders.stringHeader(HEADER_ContentType, entity.getContentType())); } + + @Override + public String getContentType() { return entity.getContentType(); } + + @Override + public String getContentEncoding() { return entity.getContentEncoding(); } + + @Override + public java.util.Set getTrailerNames() { return entity.getTrailerNames(); } + + @Override + public org.apache.hc.core5.function.Supplier> getTrailers() { return entity.getTrailers(); } /** * Tells about chunked encoding for this entity. diff --git a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/ResponseHeader.java b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/ResponseHeader.java index ef1915c40d..790b62fc5a 100644 --- a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/ResponseHeader.java +++ b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/ResponseHeader.java @@ -25,10 +25,12 @@ import java.util.*; import java.util.regex.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.io.*; import org.apache.juneau.commons.lang.*; import org.apache.juneau.commons.reflect.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.apache.juneau.marshall.*; import org.apache.juneau.marshall.httppart.*; import org.apache.juneau.marshall.oapi.*; @@ -58,7 +60,7 @@ public class ResponseHeader extends BasicHeader { static final Header NULL_HEADER = new Header() { @Override /* Overridden from Header */ - public HeaderElement[] getElements() throws org.apache.http.ParseException { return new HeaderElement[0]; } + public boolean isSensitive() { return false; } @Override /* Overridden from Header */ public String getName() { return null; } @@ -85,7 +87,7 @@ public ResponseHeader(String name, RestRequest request, RestResponse response, H super(name, header == null ? null : header.getValue()); this.request = request; this.response = response; - this.elements = header == null ? new HeaderElement[0] : header.getElements(); + this.elements = header == null ? new HeaderElement[0] : org.apache.hc.core5.http.message.MessageSupport.parse(header); parser(null); } @@ -519,10 +521,10 @@ public BasicUriHeader asUriHeader() { * Parses the value. * * @return An array of {@link HeaderElement} entries, may be empty, but is never null. - * @throws org.apache.http.ParseException In case of a parsing error. + * @throws org.apache.hc.core5.http.ParseException In case of a parsing error. */ @Override /* Overridden from Header */ - public HeaderElement[] getElements() throws org.apache.http.ParseException { return cp(elements); } + public HeaderElement[] getElements() throws org.apache.hc.core5.http.ParseException { return cp(elements); } /** * Specifies the part parser to use for this header. diff --git a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/ResponseStatusLine.java b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/ResponseStatusLine.java index 0e17965241..29b4a417a3 100644 --- a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/ResponseStatusLine.java +++ b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/ResponseStatusLine.java @@ -16,11 +16,13 @@ */ package org.apache.juneau.rest.client.classic; -import org.apache.http.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.message.StatusLine; +import org.apache.hc.core5.http.io.*; import org.apache.juneau.rest.client.classic.assertion.*; /** - * An implementation of {@link StatusLine} that adds assertions methods. + * An HTTP status line wrapper with assertion methods. * *

    See Also:
      *
    • {@link RestCallHandler} *
        - *
      • {@link RestCallHandler#run(HttpHost,HttpRequest,HttpContext) run(HttpHost,HttpRequest,HttpContext)} returns HttpResponse + *
      • {@link RestCallHandler#run(HttpHost,ClassicHttpRequest,HttpContext) run(HttpHost,ClassicHttpRequest,HttpContext)} returns ClassicHttpResponse *
      *
    * *

    * Note that there are other ways of accomplishing this such as extending the {@link RestClient} class and overriding - * the {@link #run(HttpHost,HttpRequest,HttpContext)} method + * the {@link #run(HttpHost,ClassicHttpRequest,HttpContext)} method * or by defining your own {@link HttpRequestExecutor}. Using this interface is often simpler though. * * @@ -1034,7 +1047,7 @@ * * /** Optionally override to implement your own call handling. * @Override - * protected HttpResponse run(HttpHost, HttpRequest, HttpContext) {...} + * protected ClassicHttpResponse run(HttpHost, ClassicHttpRequest, HttpContext) {...} * * /** Optionally override to customize requests before they're executed. * @Override @@ -1055,7 +1068,7 @@ * *

    * The {@link RestRequest} and {@link RestResponse} objects can also be extended and integrated by overriding the - * {@link RestClient#createRequest(URI,String,boolean)} and {@link RestClient#createResponse(RestRequest,HttpResponse,Parser)} methods. + * {@link RestClient#createRequest(URI,String,boolean)} and {@link RestClient#createResponse(RestRequest,ClassicHttpResponse,Parser)} methods. * *

    Notes:
      *
    • This class is thread safe and reusable. @@ -1108,6 +1121,15 @@ public abstract static class Builder> extends Marshal private DetailLevel logRequests; private ExecutorService executorService; private HeaderList headerData; + private ConnectionConfig connectionConfig; + private SocketConfig socketConfig; + private int maxConnectionsPerRoute = 5; + private int maxConnectionsTotal = 25; + private SSLContext sslContext; + private HostnameVerifier hostnameVerifier; + private LayeredConnectionSocketFactory sslSocketFactory; + private TimeValue connectionTimeToLive; + private HttpClientBuilder httpClientBuilder; private HttpClientConnectionManager connectionManager; private HttpPartParser.Creator partParser; @@ -1224,10 +1246,10 @@ public SELF addBeanTypes() { * @param itcp New property value. *
      Cannot be null. * @return This object. - * @see HttpClientBuilder#addInterceptorFirst(HttpRequestInterceptor) + * @see HttpClientBuilder#addRequestInterceptorFirst(HttpRequestInterceptor) */ public SELF addInterceptorFirst(HttpRequestInterceptor itcp) { - httpClientBuilder().addInterceptorFirst(reqnn("itcp", itcp)); + httpClientBuilder().addRequestInterceptorFirst(reqnn("itcp", itcp)); return self(); } @@ -1241,10 +1263,10 @@ public SELF addInterceptorFirst(HttpRequestInterceptor itcp) { * @param itcp New property value. *
      Cannot be null. * @return This object. - * @see HttpClientBuilder#addInterceptorFirst(HttpResponseInterceptor) + * @see HttpClientBuilder#addResponseInterceptorFirst(HttpResponseInterceptor) */ public SELF addInterceptorFirst(HttpResponseInterceptor itcp) { - httpClientBuilder().addInterceptorFirst(reqnn("itcp", itcp)); + httpClientBuilder().addResponseInterceptorFirst(reqnn("itcp", itcp)); return self(); } @@ -1258,10 +1280,10 @@ public SELF addInterceptorFirst(HttpResponseInterceptor itcp) { * @param itcp New property value. *
      Cannot be null. * @return This object. - * @see HttpClientBuilder#addInterceptorLast(HttpRequestInterceptor) + * @see HttpClientBuilder#addRequestInterceptorLast(HttpRequestInterceptor) */ public SELF addInterceptorLast(HttpRequestInterceptor itcp) { - httpClientBuilder().addInterceptorLast(reqnn("itcp", itcp)); + httpClientBuilder().addRequestInterceptorLast(reqnn("itcp", itcp)); return self(); } @@ -1275,10 +1297,10 @@ public SELF addInterceptorLast(HttpRequestInterceptor itcp) { * @param itcp New property value. *
      Cannot be null. * @return This object. - * @see HttpClientBuilder#addInterceptorLast(HttpResponseInterceptor) + * @see HttpClientBuilder#addResponseInterceptorLast(HttpResponseInterceptor) */ public SELF addInterceptorLast(HttpResponseInterceptor itcp) { - httpClientBuilder().addInterceptorLast(reqnn("itcp", itcp)); + httpClientBuilder().addResponseInterceptorLast(reqnn("itcp", itcp)); return self(); } @@ -1371,7 +1393,7 @@ public SELF backoffManager(BackoffManager backoffManager) { */ public SELF basicAuth(String host, int port, String user, String pw) { var scope = new AuthScope(host, port); - var up = new UsernamePasswordCredentials(user, pw); + var up = new UsernamePasswordCredentials(user, pw == null ? null : pw.toCharArray()); var p = new BasicCredentialsProvider(); p.setCredentials(scope, up); defaultCredentialsProvider(p); @@ -1395,7 +1417,7 @@ public RestClient build() { * public class MyRestCallHandler implements RestCallHandler { * * @Override - * public HttpResponse run(HttpHost target, HttpRequest request, HttpContext context) throws IOException { + * public ClassicHttpResponse run(HttpHost target, ClassicHttpRequest request, HttpContext context) throws IOException { * // Custom handle requests. * } * } @@ -1408,7 +1430,7 @@ public RestClient build() { * *
      Notes:
        *
      • - * The {@link RestClient#run(HttpHost, HttpRequest, HttpContext)} method can also be overridden to produce the same results. + * The {@link RestClient#run(HttpHost, ClassicHttpRequest, HttpContext)} method can also be overridden to produce the same results. *
      • * Use {@link org.apache.juneau.commons.inject.BeanInstantiator.Builder} impl(Object) to specify an already instantiated instance. *
      • @@ -1531,10 +1553,10 @@ public SELF connectionReuseStrategy(ConnectionReuseStrategy reuseStrategy) { * @param connTimeToLiveTimeUnit New property value. *
        Cannot be null. * @return This object. - * @see HttpClientBuilder#setConnectionTimeToLive(long,TimeUnit) + * @see ConnectionConfig.Builder#setTimeToLive(TimeValue) */ public SELF connectionTimeToLive(long connTimeToLive, TimeUnit connTimeToLiveTimeUnit) { - httpClientBuilder().setConnectionTimeToLive(connTimeToLive, connTimeToLiveTimeUnit); + connectionTimeToLive = TimeValue.of(connTimeToLive, connTimeToLiveTimeUnit); return self(); } @@ -1555,7 +1577,7 @@ public SELF console(PrintStream value) { } /** - * Assigns a map of {@link org.apache.http.client.entity.InputStreamFactory InputStreamFactories} to be used for automatic content decompression. + * Assigns a map of {@link org.apache.hc.client5.http.entity.InputStreamFactory InputStreamFactories} to be used for automatic content decompression. * * @param contentDecoderMap New property value. *
        Can be null (value will not be set, default behavior will be used). @@ -1563,7 +1585,7 @@ public SELF console(PrintStream value) { * @see HttpClientBuilder#setContentDecoderRegistry(Map) */ public SELF contentDecoderRegistry(Map contentDecoderMap) { - httpClientBuilder().setContentDecoderRegistry(contentDecoderMap); + httpClientBuilder().setContentDecoderRegistry(contentDecoderMap == null ? null : new LinkedHashMap<>(contentDecoderMap)); return self(); } @@ -1649,14 +1671,14 @@ public SELF debugOutputLines(int value) { } /** - * Assigns default {@link org.apache.http.auth.AuthScheme} registry which will be used for request execution if not explicitly set in the client execution context. + * Assigns default {@link org.apache.hc.client5.http.auth.AuthScheme} registry which will be used for request execution if not explicitly set in the client execution context. * * @param authSchemeRegistry New property value. *
        Can be null (value will not be set, default behavior will be used). * @return This object. * @see HttpClientBuilder#setDefaultAuthSchemeRegistry(Lookup) */ - public SELF defaultAuthSchemeRegistry(Lookup authSchemeRegistry) { + public SELF defaultAuthSchemeRegistry(Lookup authSchemeRegistry) { httpClientBuilder().setDefaultAuthSchemeRegistry(authSchemeRegistry); return self(); } @@ -1671,10 +1693,10 @@ public SELF defaultAuthSchemeRegistry(Lookup authSchemeRegis * @param config New property value. *
        Can be null (value will not be set, default behavior will be used). * @return This object. - * @see HttpClientBuilder#setDefaultConnectionConfig(ConnectionConfig) + * @see PoolingHttpClientConnectionManager#setDefaultConnectionConfig(ConnectionConfig) */ public SELF defaultConnectionConfig(ConnectionConfig config) { - httpClientBuilder().setDefaultConnectionConfig(config); + connectionConfig = config; return self(); } @@ -1686,7 +1708,7 @@ public SELF defaultConnectionConfig(ConnectionConfig config) { * @return This object. * @see HttpClientBuilder#setDefaultCookieSpecRegistry(Lookup) */ - public SELF defaultCookieSpecRegistry(Lookup cookieSpecRegistry) { + public SELF defaultCookieSpecRegistry(Lookup cookieSpecRegistry) { httpClientBuilder().setDefaultCookieSpecRegistry(cookieSpecRegistry); return self(); } @@ -1740,10 +1762,10 @@ public SELF defaultRequestConfig(RequestConfig config) { * @param config New property value. *
        Can be null (value will not be set, default behavior will be used). * @return This object. - * @see HttpClientBuilder#setDefaultSocketConfig(SocketConfig) + * @see PoolingHttpClientConnectionManager#setDefaultSocketConfig(SocketConfig) */ public SELF defaultSocketConfig(SocketConfig config) { - httpClientBuilder().setDefaultSocketConfig(config); + socketConfig = config; return self(); } @@ -1988,7 +2010,7 @@ public SELF evictExpiredConnections() { * @see HttpClientBuilder#evictIdleConnections(long,TimeUnit) */ public SELF evictIdleConnections(long maxIdleTime, TimeUnit maxIdleTimeUnit) { - httpClientBuilder().evictIdleConnections(maxIdleTime, maxIdleTimeUnit); + httpClientBuilder().evictIdleConnections(TimeValue.of(maxIdleTime, maxIdleTimeUnit)); return self(); } @@ -2622,10 +2644,10 @@ public SELF httpClientBuilder(HttpClientBuilder value) { * * @param httpprocessor New property value. * @return This object. - * @see HttpClientBuilder#setHttpProcessor(HttpProcessor) */ public SELF httpProcessor(HttpProcessor httpprocessor) { - httpClientBuilder().setHttpProcessor(httpprocessor); + httpClientBuilder().addRequestInterceptorLast((request, entity, context) -> httpprocessor.process(request, entity, context)); + httpClientBuilder().addResponseInterceptorLast((response, entity, context) -> httpprocessor.process(response, entity, context)); return self(); } @@ -3259,10 +3281,10 @@ public SELF marshallers(Marshaller...value) { * * @param maxConnPerRoute New property value. * @return This object. - * @see HttpClientBuilder#setMaxConnPerRoute(int) + * @see PoolingHttpClientConnectionManager#setDefaultMaxPerRoute(int) */ public SELF maxConnPerRoute(int maxConnPerRoute) { - httpClientBuilder().setMaxConnPerRoute(maxConnPerRoute); + maxConnectionsPerRoute = maxConnPerRoute; return self(); } @@ -3275,10 +3297,10 @@ public SELF maxConnPerRoute(int maxConnPerRoute) { * * @param maxConnTotal New property value. * @return This object. - * @see HttpClientBuilder#setMaxConnTotal(int) + * @see PoolingHttpClientConnectionManager#setMaxTotal(int) */ public SELF maxConnTotal(int maxConnTotal) { - httpClientBuilder().setMaxConnTotal(maxConnTotal); + maxConnectionsTotal = maxConnTotal; return self(); } @@ -4266,10 +4288,10 @@ public SELF proxyAuthenticationStrategy(AuthenticationStrategy proxyAuthStrategy * @param publicSuffixMatcher New property value. *
        Can be null (value will not be set, default behavior will be used). * @return This object. - * @see HttpClientBuilder#setPublicSuffixMatcher(PublicSuffixMatcher) + * @see DefaultHostnameVerifier#DefaultHostnameVerifier(PublicSuffixMatcher) */ public SELF publicSuffixMatcher(PublicSuffixMatcher publicSuffixMatcher) { - httpClientBuilder().setPublicSuffixMatcher(publicSuffixMatcher); + hostnameVerifier = new DefaultHostnameVerifier(publicSuffixMatcher); return self(); } @@ -4555,7 +4577,7 @@ public SELF requestExecutor(HttpRequestExecutor requestExec) { } /** - * Assigns {@link HttpRequestRetryHandler} instance. + * Assigns {@link HttpRequestRetryStrategy} instance. * *
        Notes:
          *
        • This value can be overridden by the {@link #disableAutomaticRetries()} method. @@ -4564,10 +4586,10 @@ public SELF requestExecutor(HttpRequestExecutor requestExec) { * @param retryHandler New property value. *
          Can be null (value will not be set, default behavior will be used). * @return This object. - * @see HttpClientBuilder#setRetryHandler(HttpRequestRetryHandler) + * @see HttpClientBuilder#setRetryStrategy(HttpRequestRetryStrategy) */ - public SELF retryHandler(HttpRequestRetryHandler retryHandler) { - httpClientBuilder().setRetryHandler(retryHandler); + public SELF retryHandler(HttpRequestRetryStrategy retryHandler) { + httpClientBuilder().setRetryStrategy(retryHandler); return self(); } @@ -4846,15 +4868,15 @@ public SELF serializers(Serializer...value) { } /** - * Assigns {@link ServiceUnavailableRetryStrategy} instance. + * Assigns {@link HttpRequestRetryStrategy} instance. * * @param serviceUnavailStrategy New property value. *
          Can be null (value will not be set, default behavior will be used). * @return This object. - * @see HttpClientBuilder#setServiceUnavailableRetryStrategy(ServiceUnavailableRetryStrategy) + * @see HttpClientBuilder#setRetryStrategy(HttpRequestRetryStrategy) */ - public SELF serviceUnavailableRetryStrategy(ServiceUnavailableRetryStrategy serviceUnavailStrategy) { - httpClientBuilder().setServiceUnavailableRetryStrategy(serviceUnavailStrategy); + public SELF serviceUnavailableRetryStrategy(HttpRequestRetryStrategy serviceUnavailStrategy) { + httpClientBuilder().setRetryStrategy(serviceUnavailStrategy); return self(); } @@ -5094,10 +5116,9 @@ public SELF sq() { * @param sslContext New property value. *
          Can be null (value will not be set, default behavior will be used). * @return This object. - * @see HttpClientBuilder#setSSLContext(SSLContext) */ public SELF sslContext(SSLContext sslContext) { - httpClientBuilder().setSSLContext(sslContext); + this.sslContext = sslContext; return self(); } @@ -5112,10 +5133,9 @@ public SELF sslContext(SSLContext sslContext) { * @param hostnameVerifier New property value. *
          Can be null (value will not be set, default behavior will be used). * @return This object. - * @see HttpClientBuilder#setSSLHostnameVerifier(HostnameVerifier) */ public SELF sslHostnameVerifier(HostnameVerifier hostnameVerifier) { - httpClientBuilder().setSSLHostnameVerifier(hostnameVerifier); + this.hostnameVerifier = hostnameVerifier; return self(); } @@ -5129,10 +5149,9 @@ public SELF sslHostnameVerifier(HostnameVerifier hostnameVerifier) { * @param sslSocketFactory New property value. *
          Can be null (value will not be set, default behavior will be used). * @return This object. - * @see HttpClientBuilder#setSSLSocketFactory(LayeredConnectionSocketFactory) */ public SELF sslSocketFactory(LayeredConnectionSocketFactory sslSocketFactory) { - httpClientBuilder().setSSLSocketFactory(sslSocketFactory); + this.sslSocketFactory = sslSocketFactory; return self(); } @@ -5619,7 +5638,6 @@ public final UrlEncodingSerializer.Builder urlEncodingSerializer() { return urlEncodingSerializer; } - /** * Assigns {@link UserTokenHandler} instance. * @@ -5787,7 +5805,7 @@ protected BeanInstantiator.Builder createCallHandler() { * *

          * The default implementation returns an instance of a {@link PoolingHttpClientConnectionManager} if {@link #pooled()} - * was called or {@link BasicHttpClientConnectionManager} if not.. + * was called or {@link BasicHttpClientConnectionManager} if not. * *

          Example:
          *

          @@ -5806,18 +5824,25 @@ protected BeanInstantiator.Builder createCallHandler() { * @return The connection manager to use. */ protected HttpClientConnectionManager createConnectionManager() { - // A DnsResolver that pin-on-connects SSRF-guard-active @Remote connections (see PolicyPinningDnsResolver) - // while leaving ordinary connections on the default registry (matching Apache HttpClientBuilder's own - // unconfigured default) completely unaffected. + var ssl = sslSocketFactory != null ? sslSocketFactory : new SSLConnectionSocketFactory( + sslContext != null ? sslContext : org.apache.hc.core5.ssl.SSLContexts.createSystemDefault(), + hostnameVerifier != null ? hostnameVerifier : new DefaultHostnameVerifier()); var registry = RegistryBuilder.create() - .register("http", PlainConnectionSocketFactory.getSocketFactory()) - .register("https", SSLConnectionSocketFactory.getSocketFactory()) - .build(); - return pooled - ? new PoolingHttpClientConnectionManager(registry, PolicyPinningDnsResolver.INSTANCE) - : new BasicHttpClientConnectionManager(registry, null, null, PolicyPinningDnsResolver.INSTANCE); + .register("http", PlainConnectionSocketFactory.getSocketFactory()).register("https", ssl).build(); + var config = connectionConfig != null ? connectionConfig : ConnectionConfig.custom().setTimeToLive(connectionTimeToLive).build(); + if (pooled) { + var manager = new PoolingHttpClientConnectionManager(registry, org.apache.hc.core5.pool.PoolConcurrencyPolicy.STRICT, org.apache.hc.core5.pool.PoolReusePolicy.LIFO, TimeValue.NEG_ONE_MILLISECOND, null, PolicyPinningDnsResolver.INSTANCE, null); + manager.setDefaultConnectionConfig(config); + if (socketConfig != null) manager.setDefaultSocketConfig(socketConfig); + manager.setMaxTotal(maxConnectionsTotal); + manager.setDefaultMaxPerRoute(maxConnectionsPerRoute); + return manager; + } + var manager = new BasicHttpClientConnectionManager(registry, null, null, PolicyPinningDnsResolver.INSTANCE); + manager.setConnectionConfig(config); + if (socketConfig != null) manager.setSocketConfig(socketConfig); + return manager; } - /** * Creates the builder for the form data list. * @@ -5885,7 +5910,7 @@ protected CloseableHttpClient createHttpClient() { if (connectionManager == null) connectionManager = createConnectionManager(); httpClientBuilder().setConnectionManager(connectionManager); - httpClientBuilder().addInterceptorLast(new ClassicRedirectCredentialGuard()); + httpClientBuilder().addRequestInterceptorLast(new ClassicRedirectCredentialGuard()); httpClientBuilder().setRedirectStrategy(new PolicyAwareRedirectStrategy()); return httpClientBuilder().build(); } @@ -5914,7 +5939,7 @@ protected CloseableHttpClient createHttpClient() { * @return The HTTP client builder to use to create the HTTP client. */ protected HttpClientBuilder createHttpClientBuilder() { - return HttpClientBuilder.create(); + return HttpClientBuilder.create().setRetryStrategy(new BasicHttpRequestRetryHandler(3, 0, false)); } /** @@ -6068,7 +6093,6 @@ public RestClient(Builder builder) { beanStore = builder.beanStore.addBean(RestClient.class, this); callHandler = builder.callHandler().run(); - connectionManager = builder.connectionManager; console = nn(builder.console) ? builder.console : System.err; creationStack = isDebug() ? Thread.currentThread().getStackTrace() : null; detectLeaks = builder.detectLeaks; @@ -6077,6 +6101,7 @@ public RestClient(Builder builder) { formData = builder.formData().copy(); headerData = builder.headers().copy(); httpClient = builder.getHttpClient(); + connectionManager = builder.connectionManager; ssrfPolicySupported = builder.httpClient == null; ignoreErrors = builder.ignoreErrors; interceptors = nn(builder.interceptors) ? builder.interceptors.toArray(EMPTY_REST_CALL_INTERCEPTORS) : EMPTY_REST_CALL_INTERCEPTORS; @@ -6372,7 +6397,7 @@ public RestRequest delete(Object uri) throws RestCallException { * @throws ClientProtocolException In case of an http protocol error. */ @Override /* Overridden from HttpClient */ - public HttpResponse execute(HttpHost target, HttpRequest request) throws IOException { + public ClassicHttpResponse execute(HttpHost target, ClassicHttpRequest request) throws IOException { return httpClient.execute(target, request); } @@ -6381,7 +6406,7 @@ public HttpResponse execute(HttpHost target, HttpRequest request) throws IOExcep * *

          Notes:
            *
          • This method gets passed on directly to the underlying {@link HttpClient} class. - *
          • The {@link #run(HttpHost,HttpRequest,HttpContext)} method has been provided as a wrapper around this method. + *
          • The {@link #run(HttpHost,ClassicHttpRequest,HttpContext)} method has been provided as a wrapper around this method. * Subclasses can override these methods for handling requests with and without bodies separately. *
          • The {@link RestCallHandler} interface can also be implemented to intercept this method. *
          @@ -6400,7 +6425,7 @@ public HttpResponse execute(HttpHost target, HttpRequest request) throws IOExcep * @throws ClientProtocolException In case of an http protocol error. */ @Override /* Overridden from HttpClient */ - public HttpResponse execute(HttpHost target, HttpRequest request, HttpContext context) throws IOException { + public ClassicHttpResponse execute(HttpHost target, ClassicHttpRequest request, HttpContext context) throws IOException { return httpClient.execute(target, request, context); } @@ -6409,7 +6434,7 @@ public HttpResponse execute(HttpHost target, HttpRequest request, HttpContext co * *

          * The content entity associated with the response is fully consumed and the underlying connection is released back - * to the connection manager automatically in all cases relieving individual {@link ResponseHandler ResponseHandlers} + * to the connection manager automatically in all cases relieving individual {@link HttpClientResponseHandler ResponseHandlers} * from having to manage resource deallocation internally. * *

          Notes:
            @@ -6426,7 +6451,7 @@ public HttpResponse execute(HttpHost target, HttpRequest request, HttpContext co * @throws ClientProtocolException In case of an http protocol error. */ @Override /* Overridden from HttpClient */ - public T execute(HttpHost target, HttpRequest request, ResponseHandler responseHandler) throws IOException { + public T execute(HttpHost target, ClassicHttpRequest request, HttpClientResponseHandler responseHandler) throws IOException { return httpClient.execute(target, request, responseHandler); } @@ -6435,7 +6460,7 @@ public T execute(HttpHost target, HttpRequest request, ResponseHandler * The content entity associated with the response is fully consumed and the underlying connection is released back - * to the connection manager automatically in all cases relieving individual {@link ResponseHandler ResponseHandlers} + * to the connection manager automatically in all cases relieving individual {@link HttpClientResponseHandler ResponseHandlers} * from having to manage resource deallocation internally. * *
            Notes:
              @@ -6453,8 +6478,8 @@ public T execute(HttpHost target, HttpRequest request, ResponseHandler T execute(HttpHost target, HttpRequest request, ResponseHandler responseHandler, HttpContext context) throws IOException { - return httpClient.execute(target, request, responseHandler, context); + public T execute(HttpHost target, ClassicHttpRequest request, HttpContext context, HttpClientResponseHandler responseHandler) throws IOException { + return httpClient.execute(target, request, context, responseHandler); } /** @@ -6474,7 +6499,7 @@ public T execute(HttpHost target, HttpRequest request, ResponseHandler * The content entity associated with the response is fully consumed and the underlying connection is released back - * to the connection manager automatically in all cases relieving individual {@link ResponseHandler ResponseHandlers} + * to the connection manager automatically in all cases relieving individual {@link HttpClientResponseHandler ResponseHandlers} * from having to manage resource deallocation internally. * *
              Notes:
                @@ -6519,7 +6544,7 @@ public HttpResponse execute(HttpUriRequest request, HttpContext context) throws * @throws ClientProtocolException In case of an http protocol error. */ @Override /* Overridden from HttpClient */ - public T execute(HttpUriRequest request, ResponseHandler responseHandler) throws IOException { + public T execute(ClassicHttpRequest request, HttpClientResponseHandler responseHandler) throws IOException { return httpClient.execute(request, responseHandler); } @@ -6528,7 +6553,7 @@ public T execute(HttpUriRequest request, ResponseHandler respon * *

                * The content entity associated with the response is fully consumed and the underlying connection is released back - * to the connection manager automatically in all cases relieving individual {@link ResponseHandler ResponseHandlers} + * to the connection manager automatically in all cases relieving individual {@link HttpClientResponseHandler ResponseHandlers} * from having to manage resource deallocation internally. * *

                Notes:
                  @@ -6543,8 +6568,8 @@ public T execute(HttpUriRequest request, ResponseHandler respon * @throws ClientProtocolException In case of an http protocol error. */ @Override /* Overridden from HttpClient */ - public T execute(HttpUriRequest request, ResponseHandler responseHandler, HttpContext context) throws IOException { - return httpClient.execute(request, responseHandler, context); + public T execute(ClassicHttpRequest request, HttpContext context, HttpClientResponseHandler responseHandler) throws IOException { + return httpClient.execute(request, context, responseHandler); } /** @@ -6602,28 +6627,24 @@ public RestRequest formPost(Object uri) throws RestCallException { */ public RestRequest formPost(Object uri, Object body) throws RestCallException { var req = request(op("POST", uri, NO_BODY)); - try { - if (body instanceof Supplier body2) - body = body2.get(); - if (body instanceof NameValuePair body2) - return req.content(new UrlEncodedFormEntity(l(body2))); - if (body instanceof NameValuePair[] namevaluepairArray) - return req.content(new UrlEncodedFormEntity(l(namevaluepairArray))); - if (body instanceof PartList body2) - return req.content(new UrlEncodedFormEntity(body2)); - if (body instanceof HttpResource body2) - body2.getHeaders().forEach(req::header); - if (body instanceof HttpEntity body2) { - if (body2.getContentType() == null) - req.header(ContentType.APPLICATION_FORM_URLENCODED); - return req.content(body2); - } - if (body instanceof Reader || body instanceof InputStream) - return req.header(ContentType.APPLICATION_FORM_URLENCODED).content(body); - return req.content(serializedEntity(body, urlEncodingSerializer, null)); - } catch (IOException e) { - throw new RestCallException(null, e, "Could not read form post body."); - } + if (body instanceof Supplier body2) + body = body2.get(); + if (body instanceof NameValuePair body2) + return req.content(new UrlEncodedFormEntity(l(body2))); + if (body instanceof NameValuePair[] namevaluepairArray) + return req.content(new UrlEncodedFormEntity(l(namevaluepairArray))); + if (body instanceof PartList body2) + return req.content(new UrlEncodedFormEntity(body2)); + if (body instanceof HttpResource body2) + body2.getHeaders().forEach(req::header); + if (body instanceof HttpEntity body2) { + if (body2.getContentType() == null) + req.header(ContentType.APPLICATION_FORM_URLENCODED); + return req.content(body2); + } + if (body instanceof Reader || body instanceof InputStream) + return req.header(ContentType.APPLICATION_FORM_URLENCODED).content(body); + return req.content(serializedEntity(body, urlEncodingSerializer, null)); } /** @@ -6688,34 +6709,12 @@ public RestRequest get(Object uri) throws RestCallException { } /** - * Obtains the connection manager used by this client. - * - * @return The connection manager. - * @deprecated Use {@link HttpClientBuilder}. - */ - @Deprecated(since = "10.0", forRemoval = true) - @Override /* Overridden from HttpClient */ - public ClientConnectionManager getConnectionManager() { return httpClient.getConnectionManager(); } - - /** - * Returns the connection manager if one was specified in the client builder. + * Gets the connection manager used by this client. * * @return The connection manager. May be null. */ public HttpClientConnectionManager getHttpClientConnectionManager() { return connectionManager; } - /** - * Obtains the parameters for this client. - * - * These parameters will become defaults for all requests being executed with this client, and for the parameters of dependent objects in this client. - * - * @return The default parameters. - * @deprecated Use {@link RequestConfig}. - */ - @Deprecated(since = "10.0", forRemoval = true) - @Override /* Overridden from HttpClient */ - public HttpParams getParams() { return httpClient.getParams(); } - /** * Create a new proxy interface against a 3rd-party REST interface. * @@ -7487,7 +7486,7 @@ private static Reader stringBody(String body) { } /** - * Creates a {@link RestRequest} object from the specified {@link HttpRequest} object. + * Creates a {@link RestRequest} object from the specified {@link ClassicHttpRequest} object. * *

                  * Subclasses can override this method to provide their own specialized {@link RestRequest} objects. @@ -7503,7 +7502,7 @@ protected RestRequest createRequest(URI uri, String method, boolean hasBody) thr } /** - * Creates a {@link RestResponse} object from the specified {@link HttpResponse} object. + * Creates a {@link RestResponse} object from the specified {@link ClassicHttpResponse} object. * *

                  * Subclasses can override this method to provide their own specialized {@link RestResponse} objects. @@ -7515,7 +7514,7 @@ protected RestRequest createRequest(URI uri, String method, boolean hasBody) thr * @return A new {@link RestResponse} object. * @throws RestCallException If an exception or non-200 response code occurred during the connection attempt. */ - protected RestResponse createResponse(RestRequest request, HttpResponse httpResponse, Parser parser) throws RestCallException { + protected RestResponse createResponse(RestRequest request, ClassicHttpResponse httpResponse, Parser parser) throws RestCallException { return new RestResponse(this, request, httpResponse, parser); } @@ -7812,7 +7811,7 @@ protected RestRequest request(RestOperation op) throws RestCallException { * @throws IOException In case of a problem or the connection was aborted. * @throws ClientProtocolException In case of an http protocol error. */ - protected HttpResponse run(HttpHost target, HttpRequest request, HttpContext context) throws IOException { + protected ClassicHttpResponse run(HttpHost target, ClassicHttpRequest request, HttpContext context) throws IOException { return callHandler.run(target, request, context); } @@ -8033,7 +8032,7 @@ else if (pt == HEADER) if (ms > 0) { var base = rc.getConfig(); var cb = base != null ? RequestConfig.copy(base) : RequestConfig.custom(); - rc.config(cb.setSocketTimeout((int)ms).build()); + rc.config(cb.setResponseTimeout(Timeout.ofMilliseconds(ms)).build()); } } diff --git a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestOperation.java b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestOperation.java index 2797950683..b18db3d169 100644 --- a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestOperation.java +++ b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestOperation.java @@ -20,7 +20,7 @@ import java.net.*; -import org.apache.http.client.utils.*; +import org.apache.hc.client5.http.utils.*; import org.apache.juneau.http.*; /** diff --git a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestRequest.java b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestRequest.java index fcd552ea75..03fa037384 100644 --- a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestRequest.java +++ b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestRequest.java @@ -28,24 +28,28 @@ import java.io.*; import java.lang.reflect.*; +import java.lang.reflect.Method; import java.net.*; import java.util.*; import java.util.concurrent.*; import java.util.function.*; import java.util.logging.*; -import org.apache.http.*; -import org.apache.http.ParseException; -import org.apache.http.client.*; -import org.apache.http.client.config.*; -import org.apache.http.client.entity.*; -import org.apache.http.client.methods.*; -import org.apache.http.client.utils.*; -import org.apache.http.concurrent.*; -import org.apache.http.entity.BasicHttpEntity; -import org.apache.http.params.*; -import org.apache.http.protocol.*; -import org.apache.http.util.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.message.RequestLine; +import org.apache.hc.core5.net.URIBuilder; +import org.apache.hc.core5.http.io.entity.EntityUtils; +import org.apache.hc.client5.http.ClientProtocolException; +import org.apache.hc.core5.http.io.*; +import org.apache.hc.client5.http.classic.*; +import org.apache.hc.client5.http.config.*; +import org.apache.hc.client5.http.entity.*; +import org.apache.hc.client5.http.classic.methods.*; +import org.apache.hc.client5.http.utils.*; +import org.apache.hc.core5.concurrent.*; +import org.apache.hc.core5.http.io.entity.BasicHttpEntity; +import org.apache.hc.core5.http.protocol.*; +import org.apache.hc.core5.util.*; import org.apache.juneau.commons.bean.*; import org.apache.juneau.commons.collections.*; import org.apache.juneau.commons.httppart.*; @@ -119,6 +123,53 @@ }) public class RestRequest extends MarshallingSession implements HttpUriRequest, Configurable, AutoCloseable { + @Override + public void setVersion(ProtocolVersion version) { request.setVersion(version); } + + @Override + public void setUri(URI uri) { request.setUri(uri); } + + @Override + public String getRequestUri() { return request.getRequestUri(); } + + @Override + public String getPath() { return request.getPath(); } + + @Override + public void setPath(String path) { request.setPath(path); } + + @Override + public String getScheme() { return request.getScheme(); } + + @Override + public void setScheme(String scheme) { request.setScheme(scheme); } + + @Override + public org.apache.hc.core5.net.URIAuthority getAuthority() { return request.getAuthority(); } + + @Override + public void setAuthority(org.apache.hc.core5.net.URIAuthority authority) { request.setAuthority(authority); } + + @Override + public int countHeaders(String name) { return headerData.getAll(name).length; } + + @Override + public Header getHeader(String name) throws org.apache.hc.core5.http.ProtocolException { + Header[] values = getHeaders(name); + if (values.length > 1) throw new org.apache.hc.core5.http.ProtocolException("Multiple headers: " + name); + return values.length == 0 ? null : values[0]; + } + + @Override + public HttpEntity getEntity() { return request.getEntity(); } + + @Override + public void setEntity(HttpEntity entity) { request.setEntity(entity); } + + private static URI requestUri(HttpUriRequestBase request) { + try { return request.getUri(); } catch (URISyntaxException e) { throw new IllegalArgumentException(e); } + } + private static final String HEADER_ACCEPT = org.apache.juneau.http.header.Accept.NAME; private static final String HEADER_CONTENT_TYPE = org.apache.juneau.http.header.ContentType.NAME; @@ -138,7 +189,7 @@ private class SimpleHeader extends SimplePart implements Header { } @Override - public HeaderElement[] getElements() throws ParseException { return new HeaderElement[0]; } + public boolean isSensitive() { return false; } } private class SimplePart implements NameValuePair { @@ -199,7 +250,7 @@ private static Map toMap(Object o) { } final RestClient client; // The client that created this call. - private final HttpRequestBase request; // The request. + private final HttpUriRequestBase request; // The request. private boolean ignoreErrors; private boolean suppressLogging; private HttpContext context; @@ -243,7 +294,7 @@ protected RestRequest(RestClient client, URI uri, String method, boolean hasBody this.ignoreErrors = client.ignoreErrors; this.pathData = client.createPathData(); this.queryData = client.createQueryData(); - this.uriBuilder = new URIBuilder(request.getURI()); + this.uriBuilder = new URIBuilder(requestUri(request)); } /** @@ -320,8 +371,8 @@ public void addHeader(Header header) { *
                  Can be null. */ @Override /* Overridden from HttpMessage */ - public void addHeader(String name, String value) { - headerData.append(stringHeader(name, value)); + public void addHeader(String name, Object value) { + headerData.append(stringHeader(name, value == null ? null : value.toString())); } /** @@ -332,7 +383,7 @@ public void addHeader(String name, String value) { * @return This object. */ public RestRequest cancellable(Cancellable cancellable) { - request.setCancellable(cancellable); + request.setDependency(cancellable); return this; } @@ -402,7 +453,7 @@ public RestResponse complete() throws RestCallException { */ @Deprecated(since = "10.0", forRemoval = true) public RestRequest completed() { - request.completed(); + request.reset(); return this; } @@ -783,7 +834,7 @@ public RestRequest formDataPairs(String...pairs) throws RestCallException { * @return All the headers of this message */ @Override /* Overridden from HttpMessage */ - public Header[] getAllHeaders() { return headerData.getAll(); } + public Header[] getHeaders() { return headerData.getAll(); } /** * Returns the actual request configuration. @@ -821,7 +872,7 @@ public Header getFirstHeader(String name) { * * @return An immutable list of headers to send on the request. */ - public HeaderList getHeaders() { return headerData; } + public HeaderList getHeaderList() { return headerData; } /** * Returns all the headers with a specified name of this message. @@ -843,7 +894,7 @@ public Header[] getHeaders(String name) { * * @return The body of this request, or null if it doesn't have a body. */ - public HttpEntity getHttpEntity() { return hasHttpEntity() ? ((HttpEntityEnclosingRequestBase)request).getEntity() : null; } + public HttpEntity getHttpEntity() { return hasHttpEntity() ? ((HttpUriRequestBase)request).getEntity() : null; } /** * Returns the last header with a specified name of this message. @@ -869,16 +920,6 @@ public Header getLastHeader(String name) { @Override /* Overridden from HttpUriRequest */ public String getMethod() { return request.getMethod(); } - /** - * Returns the parameters effective for this message as set by {@link #setParams(HttpParams)}. - * - * @return The parameters effective for this message as set by {@link #setParams(HttpParams)}. - * @deprecated Use constructor parameters of configuration API provided by HttpClient. - */ - @Override /* Overridden from HttpMessage */ - @Deprecated(since = "10.0", forRemoval = true) - public HttpParams getParams() { return request.getParams(); } - /** * Returns the path data for the request. * @@ -892,7 +933,7 @@ public Header getLastHeader(String name) { * @return The protocol version. */ @Override /* Overridden from HttpMessage */ - public ProtocolVersion getProtocolVersion() { return request.getProtocolVersion(); } + public ProtocolVersion getVersion() { return request.getVersion(); } /** * Returns the query data for the request. @@ -906,8 +947,7 @@ public Header getLastHeader(String name) { * * @return The request line. */ - @Override /* Overridden from HttpRequest */ - public RequestLine getRequestLine() { return request.getRequestLine(); } + public RequestLine getRequestLine() { return new RequestLine(request); } /** * A shortcut for calling run().getContent().as(type). @@ -963,7 +1003,7 @@ public T getResponse(Type type, Type...args) throws RestCallException { * @return The original request URI. */ @Override /* Overridden from HttpUriRequest */ - public URI getURI() { return request.getURI(); } + public URI getUri() { return requestUri(request); } /** * Returns true if this request has a body. @@ -971,7 +1011,7 @@ public T getResponse(Type type, Type...args) throws RestCallException { * @return true if this request has a body. */ public boolean hasHttpEntity() { - return request instanceof HttpEntityEnclosingRequestBase; + return request instanceof BasicHttpEntityRequestBase; } /** @@ -1025,7 +1065,7 @@ public RestRequest header(String name, Object value) { * @return Iterator that returns {@link Header} objects in the sequence they are sent over a connection. */ @Override /* Overridden from HttpMessage */ - public HeaderIterator headerIterator() { + public Iterator

                  headerIterator() { return headerData.headerIterator(); } @@ -1036,7 +1076,7 @@ public HeaderIterator headerIterator() { * @return Iterator that returns {@link Header} objects with the argument name in the sequence they are sent over a connection. */ @Override /* Overridden from HttpMessage */ - public HeaderIterator headerIterator(String name) { + public Iterator
                  headerIterator(String name) { return headerData.headerIterator(name); } @@ -1807,7 +1847,7 @@ public RestRequest parserSessionOptionsQuery(Map properties) { * @return This object. */ public RestRequest protocolVersion(ProtocolVersion version) { - request.setProtocolVersion(version); + request.setVersion(version); return this; } @@ -1972,8 +2012,10 @@ public RestRequest queryDataPairs(String...pairs) throws RestCallException { *
                  Can be null (no-op). */ @Override /* Overridden from HttpMessage */ - public void removeHeader(Header header) { + public boolean removeHeader(Header header) { + boolean present = Arrays.asList(headerData.getAll()).contains(header); headerData.remove(header); + return present; } /** @@ -1983,8 +2025,10 @@ public void removeHeader(Header header) { *
                  Cannot be null. */ @Override /* Overridden from HttpMessage */ - public void removeHeaders(String name) { + public boolean removeHeaders(String name) { + boolean present = headerData.contains(name); headerData.remove(name); + return present; } /** @@ -2063,8 +2107,8 @@ public RestResponse run() throws RestCallException { uriBuilder.setPath(path); }); - HttpEntityEnclosingRequestBase request2 = request instanceof HttpEntityEnclosingRequestBase request3 ? request3 : null; - request.setURI(uriBuilder.build()); + HttpUriRequestBase request2 = request instanceof BasicHttpEntityRequestBase request3 ? request3 : null; + request.setUri(uriBuilder.build()); // Pick the serializer if it hasn't been overridden. var hl = headerData; @@ -2088,7 +2132,7 @@ public RestResponse run() throws RestCallException { headerData.stream().map(SimpleHeader::new).filter(SimplePart::isValid).forEach(request::addHeader); if (request2 == null && content != NO_BODY) - throw new RestCallException(null, null, "Method does not support content entity. Method=%s, URI=%s", getMethod(), getURI()); + throw new RestCallException(null, null, "Method does not support content entity. Method=%s, URI=%s", getMethod(), getUri()); if (nn(request2)) { @@ -2161,7 +2205,7 @@ else if (nn(serializer2)) ConstructorInfo c = null; var ci = ClassInfo.of(t); Throwable thrownInstance = null; - c = ci.getPublicConstructor(x -> x.hasParameterTypes(HttpResponse.class)).orElse(null); + c = ci.getPublicConstructor(x -> x.hasParameterTypes(ClassicHttpResponse.class)).orElse(null); if (nn(c)) { thrownInstance = c.newInstance(response); } else { @@ -2191,7 +2235,7 @@ else if (nn(serializer2)) if (errorCodes.test(sc) && ! ignoreErrors) { // Surface the server-reported exception detail from the Thrown header (authoritative and independent of the response body) so callers still see the original failure detail. - throw new RestCallException(response, null, "HTTP method '%s' call to '%s' caused response code '%s, %s'.\nResponse: \n%s%s", method, getURI(), sc, response.getReasonPhrase(), + throw new RestCallException(response, null, "HTTP method '%s' call to '%s' caused response code '%s, %s'.\nResponse: \n%s%s", method, getUri(), sc, response.getReasonPhrase(), response.getContent().asAbbreviatedString(1000), getThrownDetailSuffix(thrown)); } @@ -2220,17 +2264,17 @@ else if (nn(serializer2)) * remains set on the calling thread), pin-on-connects each hop's resolved address. Only called while * {@link RemoteUrlPolicyState#isActive()}, i.e. for a {@code @Remote} call with the SSRF guard in effect. */ - private HttpResponse runWithPolicyRedirects() throws IOException { + private ClassicHttpResponse runWithPolicyRedirects() throws IOException { var currentTarget = target; - HttpRequestBase currentRequest = request; + HttpUriRequestBase currentRequest = request; for (var hop = 0; hop < RemoteUrlPolicy.MAX_REDIRECT_HOPS; hop++) { // Hop 0's URI was already validated (or is the operator-configured client root, which the resolution // path intentionally does not re-check -- see RemoteUrlPolicy.requireAllowedUrl) before this request // was built; only a redirect Location -- a URL discovered at runtime -- needs a fresh pre-check here. if (hop > 0) - requirePolicyAllowed(currentRequest.getURI()); + requirePolicyAllowed(requestUri(currentRequest)); var httpResponse = client.run(currentTarget, currentRequest, context); - var sc = httpResponse.getStatusLine().getStatusCode(); + var sc = httpResponse.getCode(); if (! isRedirectStatus(sc)) return httpResponse; var locationHeader = httpResponse.getFirstHeader("Location"); @@ -2239,7 +2283,7 @@ private HttpResponse runWithPolicyRedirects() throws IOException { throw new ClientProtocolException("Redirect response (status " + sc + ") is missing a Location header"); URI target2; try { - target2 = RemoteUrlPolicy.resolveRedirectLocation(currentRequest.getURI(), locationHeader.getValue()); + target2 = RemoteUrlPolicy.resolveRedirectLocation(requestUri(currentRequest), locationHeader.getValue()); } catch (IllegalArgumentException e) { throw new ClientProtocolException(e.getMessage(), e); } @@ -2247,7 +2291,7 @@ private HttpResponse runWithPolicyRedirects() throws IOException { currentTarget = null; // Recomputed by the connection route planner from the request's own absolute URI. } throw new ClientProtocolException("Redirect limit exceeded (" + RemoteUrlPolicy.MAX_REDIRECT_HOPS - + " hops) while following a policy-covered @Remote redirect chain, starting at: " + request.getURI()); + + " hops) while following a policy-covered @Remote redirect chain, starting at: " + requestUri(request)); } private static void requirePolicyAllowed(URI uri) throws ClientProtocolException { @@ -2269,13 +2313,13 @@ private static boolean isRedirectStatus(int statusCode) { * and entity. A non-{@linkplain HttpEntity#isRepeatable() repeatable} entity cannot be safely re-sent, so such a * redirect is refused (fail closed) rather than risking a corrupt or partial replay. */ - private HttpRequestBase buildRedirectRequest(HttpRequestBase current, URI target2, int statusCode) throws ClientProtocolException { + private HttpUriRequestBase buildRedirectRequest(HttpUriRequestBase current, URI target2, int statusCode) throws ClientProtocolException { var method = current.getMethod(); var preserveMethod = eqic(method, "GET") || eqic(method, "HEAD"); var rewriteToGet = ! preserveMethod && (statusCode == 301 || statusCode == 302 || statusCode == 303); - var entity = (! rewriteToGet && current instanceof HttpEntityEnclosingRequestBase e) ? e.getEntity() : null; + var entity = (! rewriteToGet && current instanceof BasicHttpEntityRequestBase e) ? e.getEntity() : null; - HttpRequestBase next; + HttpUriRequestBase next; if (entity != null) { if (! entity.isRepeatable()) throw new ClientProtocolException("Redirect (status " + statusCode + ") requires re-sending a " @@ -2287,8 +2331,8 @@ private HttpRequestBase buildRedirectRequest(HttpRequestBase current, URI target } else { next = new BasicHttpRequestBase(this, rewriteToGet ? "GET" : method); } - next.setURI(target2); - for (var h : current.getAllHeaders()) + next.setUri(target2); + for (var h : current.getHeaders()) if (! (rewriteToGet && (eqic(h.getName(), "Content-Length") || eqic(h.getName(), HEADER_CONTENT_TYPE)))) next.addHeader(h); return next; @@ -2410,8 +2454,8 @@ public void setHeader(Header header) { *
                  Can be null. */ @Override /* Overridden from HttpMessage */ - public void setHeader(String name, String value) { - headerData.set(stringHeader(name, value)); + public void setHeader(String name, Object value) { + headerData.set(stringHeader(name, value == null ? null : value.toString())); } /** @@ -2426,19 +2470,6 @@ public void setHeaders(Header[] headers) { headerData.set(headers); } - /** - * Provides parameters to be used for the processing of this message. - * - * @param params The parameters. - *
                  Can be null (default parameters will be used). - * @deprecated Use constructor parameters of configuration API provided by HttpClient. - */ - @Override /* Overridden from HttpMessage */ - @Deprecated(since = "10.0", forRemoval = true) - public void setParams(HttpParams params) { - request.setParams(params); - } - /** * Causes logging to be suppressed for the duration of this request. * @@ -2727,7 +2758,7 @@ protected Header createHeader(String name, Object value, HttpPartSerializer seri } /** - * Constructs the {@link HttpRequestBase} object that ends up being passed to the client execute method. + * Constructs the {@link HttpUriRequestBase} object that ends up being passed to the client execute method. * *

                  * Subclasses can override this method to create their own request base objects. @@ -2735,11 +2766,11 @@ protected Header createHeader(String name, Object value, HttpPartSerializer seri * @param method The HTTP method. * @param uri The HTTP URI. * @param hasBody Whether the HTTP request has a body. - * @return A new {@link HttpRequestBase} object. + * @return A new {@link HttpUriRequestBase} object. */ - protected HttpRequestBase createInnerRequest(String method, URI uri, boolean hasBody) { + protected HttpUriRequestBase createInnerRequest(String method, URI uri, boolean hasBody) { var req = hasBody ? new BasicHttpEntityRequestBase(this, method) : new BasicHttpRequestBase(this, method); - req.setURI(uri); + req.setUri(uri); return req; } diff --git a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestRequestCreated.java b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestRequestCreated.java index 0a27de95de..42b2f93a52 100644 --- a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestRequestCreated.java +++ b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestRequestCreated.java @@ -16,7 +16,8 @@ */ package org.apache.juneau.rest.client.classic; -import org.apache.http.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.io.*; /** * Identify an {@link HttpRequest} that was created by a {@link RestRequest}. diff --git a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestResponse.java b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestResponse.java index 2b8efab754..8a56507393 100644 --- a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestResponse.java +++ b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestResponse.java @@ -23,11 +23,13 @@ import java.util.*; import java.util.logging.*; -import org.apache.http.*; -import org.apache.http.message.*; -import org.apache.http.params.*; -import org.apache.http.util.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.message.StatusLine; +import org.apache.hc.core5.http.io.entity.EntityUtils; +import org.apache.hc.core5.http.io.*; +import org.apache.hc.core5.util.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.apache.juneau.httppart.bean.*; import org.apache.juneau.marshall.*; import org.apache.juneau.marshall.httppart.*; @@ -77,11 +79,23 @@ "java:S4144", // Identical methods intentional for different test scenarios "resource" // Resource management handled externally }) -public class RestResponse implements HttpResponse, AutoCloseable { +public class RestResponse implements ClassicHttpResponse, AutoCloseable { + + @Override + public int getCode() { return response.getCode(); } + + @Override + public void setCode(int code) { response.setCode(code); } + + @Override + public void setVersion(ProtocolVersion version) { response.setVersion(version); } + + @Override + public int countHeaders(String name) { return headers.getAll(name).length; } private final RestClient client; private final RestRequest request; - private final HttpResponse response; + private final ClassicHttpResponse response; private final Parser parser; private ResponseContent responseContent; private boolean isClosed; @@ -98,13 +112,13 @@ public class RestResponse implements HttpResponse, AutoCloseable { * @param response The HTTP response. Can be null (a default empty response with a status code of 0 is substituted). * @param parser The overridden parser passed into {@link RestRequest#parser(Parser)}. */ - protected RestResponse(RestClient client, RestRequest request, HttpResponse response, Parser parser) { + protected RestResponse(RestClient client, RestRequest request, ClassicHttpResponse response, Parser parser) { this.client = client; this.request = request; this.parser = parser; - this.response = response == null ? new BasicHttpResponse(null, 0, null) : response; + this.response = response == null ? new org.apache.hc.core5.http.message.BasicClassicHttpResponse(500, "Missing HTTP response") : response; this.responseContent = new ResponseContent(client, request, this, parser); - this.headers = HeaderList.of(this.response.getAllHeaders()); + this.headers = HeaderList.of(this.response.getHeaders()); } /** @@ -128,8 +142,8 @@ public void addHeader(Header header) { * @param value The value of the header. */ @Override /* Overridden from HttpMessage */ - public void addHeader(String name, String value) { - headers.append(name, value); + public void addHeader(String name, Object value) { + headers.append(name, value == null ? null : value.toString()); } /** @@ -335,7 +349,7 @@ public FluentResponseHeaderAssertion assertHeader(String name) { * @return A new fluent assertion object. */ public FluentResponseStatusLineAssertion assertStatus() { - return new FluentResponseStatusLineAssertion<>(getStatusLine(), this); + return new FluentResponseStatusLineAssertion<>(new StatusLine(response), this); } /** @@ -414,27 +428,27 @@ public void close() { try { if (! request.isLoggingSuppressed() && (request.isDebug() || client.logRequestsPredicate.test(request, this))) { if (client.logRequests == DetailLevel.SIMPLE) { - client.log(client.logRequestsLevel, "HTTP %s %s, %s", request.getMethod(), request.getURI(), this.getStatusLine()); + client.log(client.logRequestsLevel, "HTTP %s %s, %s", request.getMethod(), request.getUri(), this.getStatusLine()); } else if (request.isDebug() || client.logRequests == DetailLevel.FULL) { var output = getContent().asString(); var sb = new StringBuilder(); sb.append("\n=== HTTP Call (outgoing) ======================================================"); sb.append("\n=== REQUEST ===\n"); - sb.append(request.getMethod()).append(" ").append(request.getURI()); + sb.append(request.getMethod()).append(" ").append(request.getUri()); sb.append("\n---request headers---"); - request.getHeaders().forEach(x -> sb.append("\n\t").append(x)); + request.getHeaderList().forEach(x -> sb.append("\n\t").append(x)); if (request.hasHttpEntity()) { sb.append("\n---request entity---"); var e = request.getHttpEntity(); if (nn(e.getContentType())) - sb.append("\n\t").append(e.getContentType()); + sb.append("\n\tContent-Type: ").append(e.getContentType()); if (e.isRepeatable()) { appendRequestContent(sb, e); } } sb.append("\n=== RESPONSE ===\n").append(getStatusLine()); sb.append("\n---response headers---"); - for (var h : getAllHeaders()) + for (var h : getHeaders()) sb.append("\n\t").append(h); sb.append("\n---response content---\n").append(output); sb.append("\n=== END ======================================================================="); @@ -516,7 +530,7 @@ public boolean containsHeader(String name) { * @return All the headers of this message. */ @Override /* Overridden from HttpMessage */ - public ResponseHeader[] getAllHeaders() { + public ResponseHeader[] getHeaders() { return headers.stream().map(x -> new ResponseHeader(x.getName(), request, this, x).parser(getPartParserSession())).toArray(ResponseHeader[]::new); } @@ -561,13 +575,13 @@ public String getCharacterEncoding() throws RestCallException { * The entity is provided by calling setEntity. * *

                  Notes:
                    - *
                  • Unlike the {@link HttpResponse#getEntity()} method, this method never returns a null response. + *
                  • Unlike the {@link ClassicHttpResponse#getEntity()} method, this method never returns a null response. * Instead, getContent().isPresent() can be used to determine whether the response has a body. *
                  * * @return The response entity. Never null. */ - @Override /* Overridden from HttpResponse */ + @Override /* Overridden from ClassicHttpResponse */ public ResponseContent getEntity() { return responseContent; } /** @@ -587,7 +601,7 @@ public ResponseHeader getFirstHeader(String name) { } // ----------------------------------------------------------------------------------------------------------------- - // HttpResponse pass-through methods. + // ClassicHttpResponse pass-through methods. // ----------------------------------------------------------------------------------------------------------------- /** @@ -641,26 +655,16 @@ public ResponseHeader getLastHeader(String name) { * * @return The locale of this response, never null. */ - @Override /* Overridden from HttpResponse */ + @Override /* Overridden from ClassicHttpResponse */ public Locale getLocale() { return response.getLocale(); } - /** - * Returns the parameters effective for this message as set by {@link #setParams(HttpParams)}. - * - * @return The parameters effective for this message as set by {@link #setParams(HttpParams)}. - * @deprecated Use configuration classes provided org.apache.http.config and org.apache.http.client.config. - */ - @Override /* Overridden from HttpMessage */ - @Deprecated(since = "10.0", forRemoval = true) - public HttpParams getParams() { return response.getParams(); } - /** * Returns the protocol version this message is compatible with. * * @return The protocol version this message is compatible with. */ @Override /* Overridden from HttpMessage */ - public ProtocolVersion getProtocolVersion() { return response.getProtocolVersion(); } + public ProtocolVersion getVersion() { return response.getVersion(); } /** * Returns the status line reason phrase of the response. @@ -694,8 +698,7 @@ public ResponseHeader getLastHeader(String name) { * * @return The status line. Never null. */ - @Override /* Overridden from HttpResponse */ - public ResponseStatusLine getStatusLine() { return new ResponseStatusLine(this, response.getStatusLine()); } + public ResponseStatusLine getStatusLine() { return new ResponseStatusLine(this, new StatusLine(response)); } /** * Shortcut for calling getHeader(name).asString(). @@ -713,7 +716,7 @@ public Optional getStringHeader(String name) { * @return {@link Iterator} that returns {@link Header} objects in the sequence they are sent over a connection. */ @Override /* Overridden from HttpMessage */ - public HeaderIterator headerIterator() { + public Iterator
                  headerIterator() { return headers.headerIterator(); } @@ -724,7 +727,7 @@ public HeaderIterator headerIterator() { * @return {@link Iterator} that returns {@link Header} objects with the argument name in the sequence they are sent over a connection. */ @Override /* Overridden from HttpMessage */ - public HeaderIterator headerIterator(String name) { + public Iterator
                  headerIterator(String name) { return headers.headerIterator(name); } @@ -761,8 +764,10 @@ public RestResponse log(Level level, Throwable t, String msg, Object...args) { * @param header The header to remove. */ @Override /* Overridden from HttpMessage */ - public void removeHeader(Header header) { + public boolean removeHeader(Header header) { + boolean present = Arrays.asList(headers.getAll()).contains(header); headers.remove(header); + return present; } /** @@ -771,8 +776,10 @@ public void removeHeader(Header header) { * @param name The name of the headers to remove. */ @Override /* Overridden from HttpMessage */ - public void removeHeaders(String name) { + public boolean removeHeaders(String name) { + boolean present = headers.contains(name); headers.remove(name); + return present; } /** @@ -786,7 +793,7 @@ public void removeHeaders(String name) { * * @param entity The entity to associate with this response, or null to unset. */ - @Override /* Overridden from HttpResponse */ + @Override /* Overridden from ClassicHttpResponse */ public void setEntity(HttpEntity entity) { response.setEntity(entity); this.responseContent = new ResponseContent(client, request, this, parser); @@ -813,8 +820,8 @@ public void setHeader(Header header) { * @param value The value of the header. */ @Override /* Overridden from HttpMessage */ - public void setHeader(String name, String value) { - headers.set(name, value); + public void setHeader(String name, Object value) { + headers.set(name, value == null ? null : value.toString()); } /** @@ -830,30 +837,18 @@ public void setHeader(String name, String value) { * * @param loc The new locale. */ - @Override /* Overridden from HttpResponse */ + @Override /* Overridden from ClassicHttpResponse */ public void setLocale(Locale loc) { response.setLocale(loc); } - /** - * Provides parameters to be used for the processing of this message. - * - * @param params The parameters. - * @deprecated Use configuration classes provided org.apache.http.config and org.apache.http.client.config. - */ - @Override /* Overridden from HttpMessage */ - @Deprecated(since = "10.0", forRemoval = true) - public void setParams(HttpParams params) { - response.setParams(params); - } - /** * Updates the status line of this response with a new reason phrase. * * @param reason The new reason phrase as a single-line string, or null to unset the reason phrase. * @throws IllegalStateException If the status line has not be set. */ - @Override /* Overridden from HttpResponse */ + @Override /* Overridden from ClassicHttpResponse */ public void setReasonPhrase(String reason) { response.setReasonPhrase(reason); } @@ -864,9 +859,8 @@ public void setReasonPhrase(String reason) { * @param code The HTTP status code. * @throws IllegalStateException If the status line has not be set. */ - @Override /* Overridden from HttpResponse */ public void setStatusCode(int code) { - response.setStatusCode(code); + response.setCode(code); } /** @@ -878,9 +872,8 @@ public void setStatusCode(int code) { * @param ver The HTTP version. * @param code The status code. */ - @Override /* Overridden from HttpResponse */ public void setStatusLine(ProtocolVersion ver, int code) { - response.setStatusLine(ver, code); + response.setVersion(ver); response.setCode(code); } /** @@ -890,9 +883,8 @@ public void setStatusLine(ProtocolVersion ver, int code) { * @param code The status code. * @param reason The reason phrase, or null to omit. */ - @Override /* Overridden from HttpResponse */ public void setStatusLine(ProtocolVersion ver, int code, String reason) { - response.setStatusLine(ver, code, reason); + response.setVersion(ver); response.setCode(code); response.setReasonPhrase(reason); } /** @@ -900,9 +892,8 @@ public void setStatusLine(ProtocolVersion ver, int code, String reason) { * * @param statusline The status line of this response */ - @Override /* Overridden from HttpResponse */ public void setStatusLine(StatusLine statusline) { - response.setStatusLine(statusline); + response.setVersion(statusline.getProtocolVersion()); response.setCode(statusline.getStatusCode()); response.setReasonPhrase(statusline.getReasonPhrase()); } /** @@ -947,7 +938,7 @@ T as(ResponseBeanMeta rbm) { }); } - HttpResponse asHttpResponse() { + ClassicHttpResponse asHttpResponse() { return response; } } \ No newline at end of file diff --git a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/assertion/FluentResponseStatusLineAssertion.java b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/assertion/FluentResponseStatusLineAssertion.java index dcd828d13f..d6c55fb80a 100644 --- a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/assertion/FluentResponseStatusLineAssertion.java +++ b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/assertion/FluentResponseStatusLineAssertion.java @@ -19,7 +19,8 @@ import java.io.*; import java.util.function.*; -import org.apache.http.*; +import org.apache.hc.core5.http.message.StatusLine; +import org.apache.hc.core5.http.io.*; import org.apache.juneau.commons.function.*; import org.apache.juneau.http.classic.response.*; import org.apache.juneau.test.assertions.*; diff --git a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/BasicHttpRequestRetryHandler_Test.java b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/BasicHttpRequestRetryHandler_Test.java index 95e085a1f3..fec892d3b5 100644 --- a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/BasicHttpRequestRetryHandler_Test.java +++ b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/BasicHttpRequestRetryHandler_Test.java @@ -20,9 +20,9 @@ import java.io.*; -import org.apache.http.client.protocol.*; -import org.apache.http.message.*; -import org.apache.http.protocol.*; +import org.apache.hc.client5.http.protocol.*; +import org.apache.hc.core5.http.message.*; +import org.apache.hc.core5.http.protocol.*; import org.junit.jupiter.api.*; /** @@ -41,19 +41,19 @@ private static HttpContext newContext() { @Test void a01_retryInterval_zero_skipsSleep() { var h = new BasicHttpRequestRetryHandler(3, 0, true); - assertTrue(h.retryRequest(new IOException("x"), 1, context)); + assertTrue(h.retryRequest(new org.apache.hc.core5.http.message.BasicHttpRequest("GET", "/"), new IOException("x"), 1, context)); } @Test void a02_retryInterval_positive_sleeps() { var h = new BasicHttpRequestRetryHandler(3, 1, true); - assertTrue(h.retryRequest(new IOException("x"), 1, context)); + assertTrue(h.retryRequest(new org.apache.hc.core5.http.message.BasicHttpRequest("GET", "/"), new IOException("x"), 1, context)); } @Test void a03_retryInterval_positive_interruptedSleep_setsInterruptFlagAndContinues() { var h = new BasicHttpRequestRetryHandler(3, 5000, true); Thread.currentThread().interrupt(); try { - assertTrue(h.retryRequest(new IOException("x"), 1, context)); + assertTrue(h.retryRequest(new org.apache.hc.core5.http.message.BasicHttpRequest("GET", "/"), new IOException("x"), 1, context)); assertTrue(Thread.currentThread().isInterrupted(), "Interrupt status should have been restored"); } finally { // Clear the interrupt flag so it doesn't leak into other tests. diff --git a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ClassicRedirectCredentialGuard_Test.java b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ClassicRedirectCredentialGuard_Test.java index 951f834087..1423ea194c 100644 --- a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ClassicRedirectCredentialGuard_Test.java +++ b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ClassicRedirectCredentialGuard_Test.java @@ -18,9 +18,9 @@ import static org.junit.jupiter.api.Assertions.*; -import org.apache.http.*; -import org.apache.http.message.*; -import org.apache.http.protocol.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.message.*; +import org.apache.hc.core5.http.protocol.*; import org.junit.jupiter.api.*; /** @@ -40,7 +40,7 @@ void a01_noTargetHostInContext_isNoOp() { var context = new BasicHttpContext(); var request = new BasicHttpRequest("GET", "/"); request.addHeader("Authorization", "Bearer secret"); - assertDoesNotThrow(() -> guard.process(request, context)); + assertDoesNotThrow(() -> guard.process(request, null, context)); assertNotNull(request.getFirstHeader("Authorization"), "with no target host to compare against, credentials must be left untouched"); } @@ -50,20 +50,20 @@ void a02_targetHostToURIThrows_originUnresolvable_isNoOp() { // HttpHost.toURI() produces a string that URI.create(...) rejects with IllegalArgumentException — // exactly the case originOf(...) guards against. var context = new BasicHttpContext(); - HttpCoreContext.adapt(context).setTargetHost(new HttpHost("exa|mple.com", 80, "http")); + org.apache.hc.client5.http.protocol.HttpClientContext.adapt(context).setRoute(new org.apache.hc.client5.http.HttpRoute(new HttpHost("http", "exa|mple.com", 80))); var request = new BasicHttpRequest("GET", "/"); request.addHeader("Authorization", "Bearer secret"); - assertDoesNotThrow(() -> guard.process(request, context)); + assertDoesNotThrow(() -> guard.process(request, null, context)); assertNotNull(request.getFirstHeader("Authorization"), "an unresolvable origin must not strip credentials"); } @Test void a03_firstRequestInExchange_recordsOriginWithoutStrippingCredentials() { var context = new BasicHttpContext(); - HttpCoreContext.adapt(context).setTargetHost(new HttpHost("example.com", 80, "http")); + org.apache.hc.client5.http.protocol.HttpClientContext.adapt(context).setRoute(new org.apache.hc.client5.http.HttpRoute(new HttpHost("http", "example.com", 80))); var request = new BasicHttpRequest("GET", "/"); request.addHeader("Authorization", "Bearer secret"); - guard.process(request, context); + guard.process(request, null, context); assertNotNull(request.getFirstHeader("Authorization"), "the first request of an exchange only records the origin; nothing to compare against yet"); } } diff --git a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseContent_Coverage_Test.java b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseContent_Coverage_Test.java index 0ed25d6a80..4f490087c5 100644 --- a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseContent_Coverage_Test.java +++ b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseContent_Coverage_Test.java @@ -23,7 +23,7 @@ import java.nio.charset.*; import java.util.concurrent.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.http.classic.entity.*; import org.junit.jupiter.api.*; @@ -95,12 +95,12 @@ private static String truncatedUrl() { } @Test void a01_asBytes_basicHttpEntityFastPath() throws Exception { - // An org.apache.http.HttpResponseInterceptor runs as part of the HttpClient's own response-processing - // pipeline -- before RestClient wraps the raw HttpResponse into a RestResponse/ResponseContent -- so + // An org.apache.hc.core5.http.HttpResponseInterceptor runs as part of the HttpClient's own response-processing + // pipeline -- before RestClient wraps the raw ClassicHttpResponse into a RestResponse/ResponseContent -- so // replacing the entity here (unlike via a RestCallInterceptor#onConnect, which runs too late) is visible to // ResponseContent's captured `entity` field, exercising the `entity instanceof BasicHttpEntity` fast path. var content = "fast-path".getBytes(StandardCharsets.UTF_8); - HttpResponseInterceptor itcp = (response, context) -> response.setEntity(new ByteArrayEntity(null, content)); + HttpResponseInterceptor itcp = (response, entity, context) -> ((org.apache.hc.core5.http.ClassicHttpResponse)response).setEntity(new ByteArrayEntity(null, content)); try (var client = RestClient.create().interceptors(itcp).build(); var req = client.get(url()); var res = req.run()) { @@ -109,7 +109,7 @@ private static String truncatedUrl() { } @Test void a02_asInputStream_unsupportedOperationException_wrappedAsIOException() throws Exception { - // asInputStream()'s non-cached branch re-fetches the *live* entity from the raw HttpResponse on every call + // asInputStream()'s non-cached branch re-fetches the *live* entity from the raw ClassicHttpResponse on every call // (unlike asBytes(), which uses the field captured at construction), so a RestCallInterceptor#onConnect // substitution -- which runs after ResponseContent is constructed but before the caller reads the body -- // is late enough to be visible here. @@ -117,15 +117,17 @@ private static String truncatedUrl() { @Override public void onConnect(RestRequest req, RestResponse res) { res.asHttpResponse().setEntity(new HttpEntity() { + @Override public java.util.Set getTrailerNames() { return java.util.Set.of(); } + @Override public org.apache.hc.core5.function.Supplier> getTrailers() { return null; } @Override public boolean isRepeatable() { return false; } @Override public boolean isChunked() { return false; } @Override public long getContentLength() { return -1; } - @Override public Header getContentType() { return null; } - @Override public Header getContentEncoding() { return null; } + @Override public String getContentType() { return null; } + @Override public String getContentEncoding() { return null; } @Override public InputStream getContent() { throw new UnsupportedOperationException("Simulated: entity content not available."); } @Override public void writeTo(OutputStream outstream) { throw new UnsupportedOperationException("Not used by this test."); } @Override public boolean isStreaming() { return false; } - @Override public void consumeContent() { /* no-op */ } + @Override public void close() { /* no-op */ } }); } }; @@ -206,14 +208,14 @@ public void onConnect(RestRequest req, RestResponse res) { } @Test void a11_nullEntitySentinel_pipeToAndAsBytes_neverDelegateToItsWriteTo() throws Exception { - // ResponseContent's NULL_ENTITY sentinel (used when the raw HttpResponse has no entity) + // ResponseContent's NULL_ENTITY sentinel (used when the raw ClassicHttpResponse has no entity) // has its own writeTo(OutputStream) simplified to fail fast (it's never legitimately invoked -- see the // in-source comment). Forcing the sentinel into play via an HttpResponseInterceptor (which runs before // ResponseContent captures `entity`, same as a01 above) and exercising both read paths confirms neither // pipeTo (which goes through ResponseContent#writeTo, then pipeTo, asInputStream and entity.getContent) nor // asBytes ever reaches the sentinel's writeTo; if they did, this test would fail with an // UnsupportedOperationException instead of observing empty content. - HttpResponseInterceptor itcp = (response, context) -> response.setEntity(null); + HttpResponseInterceptor itcp = (response, entity, context) -> ((org.apache.hc.core5.http.ClassicHttpResponse)response).setEntity(null); try (var client = RestClient.create().interceptors(itcp).build(); var req = client.get(url()); var res = req.run()) { diff --git a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseContent_Cursor_Test.java b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseContent_Cursor_Test.java index 6d65cdfad1..0ddce73783 100644 --- a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseContent_Cursor_Test.java +++ b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/ResponseContent_Cursor_Test.java @@ -23,7 +23,7 @@ import java.nio.charset.*; import java.util.concurrent.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.marshall.cbor.*; import org.apache.juneau.marshall.json.*; import org.apache.juneau.marshall.jsonl.*; @@ -183,15 +183,17 @@ private static ResponseContent jsonContent(String json) throws Exception { @Override public void onConnect(RestRequest req, RestResponse res) { res.asHttpResponse().setEntity(new HttpEntity() { + @Override public java.util.Set getTrailerNames() { return java.util.Set.of(); } + @Override public org.apache.hc.core5.function.Supplier> getTrailers() { return null; } @Override public boolean isRepeatable() { return false; } @Override public boolean isChunked() { return false; } @Override public long getContentLength() { return -1; } - @Override public Header getContentType() { return null; } - @Override public Header getContentEncoding() { return null; } + @Override public String getContentType() { return null; } + @Override public String getContentEncoding() { return null; } @Override public InputStream getContent() { throw new UnsupportedOperationException("Simulated: entity content not available."); } @Override public void writeTo(OutputStream outstream) { throw new UnsupportedOperationException("Not used by this test."); } @Override public boolean isStreaming() { return false; } - @Override public void consumeContent() { /* no-op */ } + @Override public void close() { /* no-op */ } }); } }; diff --git a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Builder_Coverage_Test.java b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Builder_Coverage_Test.java index 90eae155c9..d169dd216e 100644 --- a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Builder_Coverage_Test.java +++ b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Builder_Coverage_Test.java @@ -25,7 +25,7 @@ import java.util.concurrent.*; import java.util.concurrent.atomic.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.marshall.bson.*; import org.apache.juneau.marshall.jcs.*; import org.apache.juneau.marshall.json.*; @@ -84,7 +84,7 @@ private static String url() { } @Test void a01_addInterceptorFirst() throws Exception { - var itcp = (HttpResponseInterceptor)(response, context) -> {}; + var itcp = (HttpResponseInterceptor)(response, entity, context) -> {}; try (var client = RestClient.create().addInterceptorFirst(itcp).build(); var req = client.get(url()); var res = req.run()) { @@ -205,7 +205,7 @@ private static String url() { } @Test void a16_httpClientBuilder_custom() throws Exception { - var hcb = org.apache.http.impl.client.HttpClientBuilder.create(); + var hcb = org.apache.hc.client5.http.impl.classic.HttpClientBuilder.create(); try (var client = RestClient.create().httpClientBuilder(hcb).build(); var req = client.get(url()); var res = req.run()) { @@ -234,8 +234,8 @@ private static String url() { var restCallItcp = new BasicRestCallInterceptor() {}; b.interceptors( (Object)null, - (HttpRequestInterceptor)(request, context) -> {}, - (HttpResponseInterceptor)(response, context) -> {}, + (HttpRequestInterceptor)(request, entity, context) -> {}, + (HttpResponseInterceptor)(response, entity, context) -> {}, restCallItcp ); // A second call exercises the "interceptors already non-null" branch (addAll vs assign). diff --git a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Coverage2_Test.java b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Coverage2_Test.java index 011280f5c9..5d538539dc 100644 --- a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Coverage2_Test.java +++ b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_Coverage2_Test.java @@ -23,11 +23,10 @@ import java.util.concurrent.*; import java.util.logging.*; -import org.apache.http.*; -import org.apache.http.client.methods.*; -import org.apache.http.conn.*; -import org.apache.http.impl.client.*; -import org.apache.http.params.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.client5.http.classic.methods.*; +import org.apache.hc.client5.http.io.*; +import org.apache.hc.client5.http.impl.classic.*; import org.apache.juneau.http.remote.*; import org.apache.juneau.rest.client.classic.remote.*; import org.apache.juneau.marshall.uon.*; @@ -113,20 +112,6 @@ private static String url() { } } - @Test void a04_getParams_deprecated_delegatesToHttpClient() throws Exception { - // The default Apache HttpClient (built via HttpClientBuilder) doesn't support the legacy HttpParams API and - // throws on access; a custom CloseableHttpClient proves the successful delegation path completes normally. - // Not try-with-resources: the custom client's close() always throws (needed for a06 below), so close it via - // closeQuietly() instead of letting an auto-close propagate the simulated failure here. - var c1 = RestClient.create().httpClient(throwingHttpClient()).build(); - assertNull(c1.getParams()); - c1.closeQuietly(); - - try (var c2 = RestClient.create().build()) { - assertThrows(UnsupportedOperationException.class, c2::getParams); - } - } - @Test void a05_closeQuietly_suppressesExceptionFromHttpClientClose() { var c = RestClient.create().httpClient(throwingHttpClient()).build(); assertDoesNotThrow(c::closeQuietly); @@ -140,17 +125,14 @@ private static String url() { private static CloseableHttpClient throwingHttpClient() { return new CloseableHttpClient() { @Override - protected CloseableHttpResponse doExecute(HttpHost target, HttpRequest request, org.apache.http.protocol.HttpContext context) { + protected CloseableHttpResponse doExecute(HttpHost target, ClassicHttpRequest request, org.apache.hc.core5.http.protocol.HttpContext context) { throw new UnsupportedOperationException("Not used by this test."); } @Override public void close() throws IOException { throw new IOException("Simulated close failure."); } - @Override - public HttpParams getParams() { return null; } - @Override - public ClientConnectionManager getConnectionManager() { return null; } + @Override public void close(org.apache.hc.core5.io.CloseMode mode) { } }; } @@ -193,13 +175,12 @@ public interface EchoRemote { var executed = new boolean[]{false}; var stubClient = new CloseableHttpClient() { @Override - protected CloseableHttpResponse doExecute(HttpHost target, HttpRequest request, org.apache.http.protocol.HttpContext context) { + protected CloseableHttpResponse doExecute(HttpHost target, ClassicHttpRequest request, org.apache.hc.core5.http.protocol.HttpContext context) { executed[0] = true; throw new UnsupportedOperationException("Not used by this test."); } @Override public void close() { /* no-op */ } - @Override public HttpParams getParams() { return null; } - @Override public ClientConnectionManager getConnectionManager() { return null; } + @Override public void close(org.apache.hc.core5.io.CloseMode mode) { } }; try (var c = RestClient.create().httpClient(stubClient).rootUrl("http://example.com").build()) { var proxy = c.getRemote(EchoRemote.class, null); @@ -356,7 +337,7 @@ public void onClose(RestRequest req, RestResponse res) throws Exception { } @Test void a22_onCallClose_checkedException_wrappedThenLoggedNotThrown() throws Exception { - // RestCallException extends org.apache.http.HttpException, a CHECKED exception, so RestResponse#close's own + // RestCallException extends org.apache.hc.core5.http.HttpException, a CHECKED exception, so RestResponse#close's own // try/catch (RuntimeException rethrown, everything else logged) swallows it -- proving the generic-exception // wrapping branch of onCallClose executes without asserting on a exception type that never surfaces to the caller. try (var out = new ByteArrayOutputStream(); diff --git a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_FormPost_Coverage_Test.java b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_FormPost_Coverage_Test.java index 710f78c8a9..59dc5ed9fb 100644 --- a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_FormPost_Coverage_Test.java +++ b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestClient_FormPost_Coverage_Test.java @@ -27,8 +27,9 @@ import java.util.concurrent.atomic.*; import java.util.function.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.apache.juneau.http.classic.resource.*; import org.junit.jupiter.api.*; diff --git a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_ArgExpansion_Coverage_Test.java b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_ArgExpansion_Coverage_Test.java index d43f8b0e76..79a532334f 100644 --- a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_ArgExpansion_Coverage_Test.java +++ b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_ArgExpansion_Coverage_Test.java @@ -23,8 +23,9 @@ import java.util.*; import java.util.concurrent.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.apache.juneau.http.classic.part.*; import org.junit.jupiter.api.*; @@ -135,7 +136,7 @@ public static class NameBean { try (var r = req().formDataArg("", "foo=bar", null, null, false)) { // formDataCustom() sets the Content-Type header directly rather than touching the formData PartList. assertTrue(r.getFormData().isEmpty()); - assertEquals("application/x-www-form-urlencoded", r.getHeaders().getFirst("Content-Type").orElseThrow().getValue()); + assertEquals("application/x-www-form-urlencoded", r.getHeaderList().getFirst("Content-Type").orElseThrow().getValue()); } } @@ -163,37 +164,37 @@ public static class NameBean { @Test void b01_headerArg_emptyName_castableSingleValue() { try (var r = req().headerArg("", BasicHeader.of("X", "1"), null, null, false)) { - assertEquals("1", r.getHeaders().getFirst("X").orElseThrow().getValue()); + assertEquals("1", r.getHeaderList().getFirst("X").orElseThrow().getValue()); } } @Test void b02_headerArg_starName_headerList() { try (var r = req().headerArg("*", HeaderList.of(BasicHeader.of("Y", "2")), null, null, false)) { - assertEquals("2", r.getHeaders().getFirst("Y").orElseThrow().getValue()); + assertEquals("2", r.getHeaderList().getFirst("Y").orElseThrow().getValue()); } } @Test void b03_headerArg_emptyName_collection() { try (var r = req().headerArg("", List.of(BasicHeader.of("Z", "3")), null, null, false)) { - assertEquals("3", r.getHeaders().getFirst("Z").orElseThrow().getValue()); + assertEquals("3", r.getHeaderList().getFirst("Z").orElseThrow().getValue()); } } @Test void b04_headerArg_emptyName_array() { try (var r = req().headerArg("", new Header[]{BasicHeader.of("W", "4")}, null, null, false)) { - assertEquals("4", r.getHeaders().getFirst("W").orElseThrow().getValue()); + assertEquals("4", r.getHeaderList().getFirst("W").orElseThrow().getValue()); } } @Test void b05_headerArg_emptyName_map() { try (var r = req().headerArg("", Map.of("M", "5"), null, null, false)) { - assertEquals("5", r.getHeaders().getFirst("M").orElseThrow().getValue()); + assertEquals("5", r.getHeaderList().getFirst("M").orElseThrow().getValue()); } } @Test void b06_headerArg_emptyName_bean() { try (var r = req().headerArg("", new NameBean(), null, null, false)) { - assertEquals("bar", r.getHeaders().getFirst("foo").orElseThrow().getValue()); + assertEquals("bar", r.getHeaderList().getFirst("foo").orElseThrow().getValue()); } } @@ -207,13 +208,13 @@ public static class NameBean { @Test void b08_headerArg_emptyName_skipIfEmpty_removesEmptyValueEntries() { try (var r = req().headerArg("", List.of(BasicHeader.of("E", "")), null, null, true)) { - assertTrue(r.getHeaders().getFirst("E").isEmpty(), "Empty-valued entry should have been removed by skipIfEmpty"); + assertTrue(r.getHeaderList().getFirst("E").isEmpty(), "Empty-valued entry should have been removed by skipIfEmpty"); } } @Test void b09_headerArg_singleValue_normal() { try (var r = req().headerArg("k", "v", null, null, false)) { - assertEquals("v", r.getHeaders().getFirst("k").orElseThrow().getValue()); + assertEquals("v", r.getHeaderList().getFirst("k").orElseThrow().getValue()); } } diff --git a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_Rethrow_Coverage_Test.java b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_Rethrow_Coverage_Test.java index dd0726c5bc..d65636a507 100644 --- a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_Rethrow_Coverage_Test.java +++ b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/RestRequest_Rethrow_Coverage_Test.java @@ -40,10 +40,10 @@ class RestRequest_Rethrow_Coverage_Test { // Constructors (and classes) are public: RestRequest#run() locates rethrow candidates via // ClassInfo#getPublicConstructor(), which only sees public constructors. - /** Has only a {@code (HttpResponse)} constructor. */ + /** Has only a {@code (ClassicHttpResponse)} constructor. */ public static class ExcWithResponseCtor extends RuntimeException { private static final long serialVersionUID = 1L; - public ExcWithResponseCtor(org.apache.http.HttpResponse r) { super("response-ctor:" + r.getStatusLine().getStatusCode()); } + public ExcWithResponseCtor(org.apache.hc.core5.http.ClassicHttpResponse r) { super("response-ctor:" + r.getCode()); } } /** Has only a {@code (String)} constructor. */ diff --git a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/assertion/FluentResponseBodyAssertion_Test.java b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/assertion/FluentResponseBodyAssertion_Test.java index 01fc42773c..5cb13e192c 100644 --- a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/assertion/FluentResponseBodyAssertion_Test.java +++ b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/assertion/FluentResponseBodyAssertion_Test.java @@ -34,7 +34,7 @@ /** * Exercises the {@link FluentResponseBodyAssertion} transform/configuration methods and its * {@code RestCallException} wrapping branches against a real local server -- a real - * {@link org.apache.http.HttpEntity} stream is needed to reach the {@code IOException} paths (a + * {@link org.apache.hc.core5.http.HttpEntity} stream is needed to reach the {@code IOException} paths (a * Content-Length that overstates the bytes actually written triggers a connection-closed IOException when * the client tries to read out to the declared length). The wrapped exception is a {@link BadRequest}, not an * {@link AssertionError}, because the class's constructor configures {@code BadRequest} as its default diff --git a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/assertion/FluentResponseStatusLineAssertion_Test.java b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/assertion/FluentResponseStatusLineAssertion_Test.java index 3661f7a0c1..950f14f42f 100644 --- a/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/assertion/FluentResponseStatusLineAssertion_Test.java +++ b/juneau-rest/juneau-rest-client-classic/src/test/java/org/apache/juneau/rest/client/classic/assertion/FluentResponseStatusLineAssertion_Test.java @@ -18,8 +18,8 @@ import static org.junit.jupiter.api.Assertions.*; -import org.apache.http.*; -import org.apache.http.message.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.message.*; import org.junit.jupiter.api.*; /** @@ -30,7 +30,7 @@ */ class FluentResponseStatusLineAssertion_Test { - private final StatusLine statusLine = new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"); + private final StatusLine statusLine = new StatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"); @Test void a01_asMajor() { assertDoesNotThrow(() -> new FluentResponseStatusLineAssertion<>(statusLine, null).asMajor().is(1)); diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/JavaHttpTransport.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/JavaHttpTransport.java index a9def827e6..96c77be0a7 100644 --- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/JavaHttpTransport.java +++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/JavaHttpTransport.java @@ -66,7 +66,7 @@ * {@link PolicyEnforcedRedirects}. The JDK {@link HttpClient} has no connect-time/DNS SPI, so an IP-literal * rewrite cannot preserve TLS SNI/hostname verification for the original hostname; per the locked design, policy * -covered HTTPS requests are therefore refused (fail closed) on this transport — use a transport - * that supports connect-time pinning (e.g. Apache HttpClient 4.5/5), or set {@code allowPrivateUrls(true)} if the + * that supports connect-time pinning (e.g. Apache HttpClient 5), or set {@code allowPrivateUrls(true)} if the * target is an intentional local-dev/intranet endpoint. A policy-covered request is also refused if the * underlying {@link HttpClient} was built with automatic redirect-following enabled ({@link Redirect#NORMAL} or * {@link Redirect#ALWAYS}), since this transport cannot re-validate hops that client follows on its own; build it @@ -168,7 +168,7 @@ private TransportResponse sendOncePinned(TransportRequest request) throws Transp throw new TransportException("JavaHttpTransport cannot preserve TLS SNI/hostname verification while " + "pinning the resolved address (the JDK HttpClient has no connect-time/DNS SPI); refusing " + "(fail closed) a policy-covered HTTPS request: " + uri - + ". Use a transport with connect-time pinning support (e.g. Apache HttpClient 4.5/5), or set " + + ". Use a transport with connect-time pinning support (e.g. Apache HttpClient 5), or set " + "allowPrivateUrls(true) if this is an intentional local-dev/intranet target."); InetAddress pinned; try { @@ -211,7 +211,7 @@ private TransportResponse sendOnce(TransportRequest request, URI overrideUri, St + "policy-covered HTTP request (the JDK HttpClient's restricted-header allowlist was already " + "initialized elsewhere in this JVM); refusing (fail closed): " + request.getUri() + ". Set the JVM flag -Djdk.httpclient.allowRestrictedHeaders=host, use a transport with native " - + "connect-time pinning support (e.g. Apache HttpClient 4.5/5), or set allowPrivateUrls(true) if " + + "connect-time pinning support (e.g. Apache HttpClient 5), or set allowPrivateUrls(true) if " + "this is an intentional local-dev/intranet target.", e); } HttpResponse jdkResponse; diff --git a/juneau-rest/juneau-rest-common-classic/pom.xml b/juneau-rest/juneau-rest-common-classic/pom.xml index cb056bec36..0a60ce403b 100644 --- a/juneau-rest/juneau-rest-common-classic/pom.xml +++ b/juneau-rest/juneau-rest-common-classic/pom.xml @@ -27,7 +27,7 @@ juneau-rest-common-classic Apache Juneau REST Common (Classic) - Apache Juneau REST Common API - Apache HttpClient 4.5-compatible facades. + Apache Juneau REST Common API - Apache HttpClient 5.6-compatible facades. bundle @@ -41,9 +41,8 @@ ${project.version} - org.apache.httpcomponents - httpcore - 4.4.16 + org.apache.httpcomponents.core5 + httpcore5 org.junit.jupiter diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/BasicStatusLine.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/BasicStatusLine.java index 7c84096d76..4daa57942c 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/BasicStatusLine.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/BasicStatusLine.java @@ -21,13 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.impl.*; -import org.apache.http.message.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.impl.*; +import org.apache.hc.core5.http.message.*; import org.apache.juneau.http.*; /** - * A basic implementation of the {@link StatusLine} interface. + * A mutable HTTP status line. * *

                  * Immutability is expressed with the "funnel + nested {@code Unmodifiable} snapshot" paradigm: every mutator routes @@ -38,7 +38,7 @@ *

                */ -public class BasicStatusLine implements StatusLine { +public class BasicStatusLine { /** * Instantiates a new instance of this bean. @@ -102,10 +102,18 @@ public BasicStatusLine copy() { */ public Locale getLocale() { return locale; } - @Override /* Overridden from StatusLine */ + /** + * Gets the protocol version. + * + * @return The protocol version. + */ public ProtocolVersion getProtocolVersion() { return protocolVersion; } - @Override /* Overridden from StatusLine */ + /** + * Gets the reason phrase. + * + * @return The explicit or catalog-derived reason phrase. + */ public String getReasonPhrase() { if (reasonPhrase == null) { ReasonPhraseCatalog rfc = coalesce(reasonPhraseCatalog, EnglishReasonPhraseCatalog.INSTANCE); @@ -114,7 +122,11 @@ public String getReasonPhrase() { return reasonPhrase; } - @Override /* Overridden from StatusLine */ + /** + * Gets the status code. + * + * @return The status code. + */ public int getStatusCode() { return statusCode; } /** @@ -209,7 +221,7 @@ public boolean isUnmodifiable() { @Override /* Overridden from Object */ public String toString() { - return BasicLineFormatter.INSTANCE.formatStatusLine(null, this).toString(); + return new StatusLine(protocolVersion, statusCode, getReasonPhrase()).toString(); } @Override diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/HttpHeaders.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/HttpHeaders.java index 7a0cfc0136..4db2f801bd 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/HttpHeaders.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/HttpHeaders.java @@ -23,12 +23,13 @@ import java.util.*; import java.util.function.*; -import org.apache.http.*; -import org.apache.http.NameValuePair; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.NameValuePair; import org.apache.juneau.commons.http.*; import org.apache.juneau.commons.lang.*; import org.apache.juneau.commons.reflect.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.apache.juneau.http.classic.header.Accept; import org.apache.juneau.http.classic.header.AcceptCharset; import org.apache.juneau.http.classic.header.AcceptEncoding; @@ -46,7 +47,6 @@ import org.apache.juneau.http.classic.header.ContentLength; import org.apache.juneau.http.classic.header.ContentLocation; import org.apache.juneau.http.classic.header.ContentRange; -import org.apache.juneau.http.classic.header.ContentType; import org.apache.juneau.http.classic.header.Date; import org.apache.juneau.http.classic.header.Debug; import org.apache.juneau.http.classic.header.ETag; diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/HttpParts.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/HttpParts.java index a75d7923ba..b9f548b8f7 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/HttpParts.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/HttpParts.java @@ -23,11 +23,12 @@ import java.util.*; import java.util.function.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.httppart.*; import org.apache.juneau.commons.lang.*; import org.apache.juneau.commons.reflect.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.apache.juneau.http.classic.part.*; import org.apache.juneau.marshall.*; @@ -355,7 +356,7 @@ public static final BasicIntegerPart integerPart(String name, Supplier * Returns true if the specified type is a part type. * *

                - * A part type extends from either {@link org.apache.http.Header} or {@link org.apache.http.NameValuePair} + * A part type extends from either {@link org.apache.hc.core5.http.Header} or {@link org.apache.hc.core5.http.NameValuePair} * or is annotated with {@link org.apache.juneau.http.Header}, {@link org.apache.juneau.http.Query}, * {@link org.apache.juneau.http.FormData}, or {@link org.apache.juneau.http.Path}. * @@ -366,7 +367,7 @@ public static final BasicIntegerPart integerPart(String name, Supplier public static boolean isHttpPart(HttpPartType partType, ClassMeta type) { return switch (partType) { case PATH, QUERY, FORMDATA -> type.getProperty("HttpPart.isNameValuePair", x -> x.isAssignableTo(NameValuePair.class)).orElse(false); - case HEADER -> type.getProperty("HttpPart.isHeader", x -> x.isAssignableTo(org.apache.http.Header.class)).orElse(false); + case HEADER -> type.getProperty("HttpPart.isHeader", x -> x.isAssignableTo(org.apache.hc.core5.http.Header.class)).orElse(false); default -> false; }; } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/HttpResources.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/HttpResources.java index 97c9130b8f..04a86c0418 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/HttpResources.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/HttpResources.java @@ -19,8 +19,9 @@ import java.io.*; import java.util.function.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.apache.juneau.http.classic.resource.*; /** diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/entity/BasicHttpEntity.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/entity/BasicHttpEntity.java index 16dae16085..ef09f95028 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/entity/BasicHttpEntity.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/entity/BasicHttpEntity.java @@ -23,14 +23,15 @@ import java.nio.charset.*; import java.util.function.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.bean.*; import org.apache.juneau.http.UnmodifiableBean; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.apache.juneau.test.assertions.*; /** - * A basic {@link org.apache.http.HttpEntity} implementation with additional features. + * A basic {@link org.apache.hc.core5.http.HttpEntity} implementation with additional features. * * Provides the following features: *

                  @@ -178,8 +179,9 @@ public String asString() throws IOException { } @Override /* Overridden from HttpEntity */ - public void consumeContent() throws IOException { - // No-op: Intentional empty implementation for optional interface method + public void close() throws IOException { + if (content instanceof Closeable closeable) + closeable.close(); } /** @@ -203,13 +205,13 @@ public void consumeContent() throws IOException { public InputStream getContent() throws IOException, UnsupportedOperationException { return EMPTY_INPUT_STREAM; } @Override /* Overridden from HttpEntity */ - public Header getContentEncoding() { return contentEncoding; } + public String getContentEncoding() { return contentEncoding == null ? null : contentEncoding.getValue(); } @Override /* Overridden from HttpEntity */ public long getContentLength() { return contentLength; } @Override /* Overridden from HttpEntity */ - public Header getContentType() { return contentType; } + public String getContentType() { return contentType == null ? null : contentType.getValue(); } /** * Returns the maximum number of bytes to read or write to and from stream-based resources. @@ -225,6 +227,12 @@ public void consumeContent() throws IOException { */ public boolean isCached() { return cached; } + @Override + public java.util.Set getTrailerNames() { return java.util.Set.of(); } + + @Override + public org.apache.hc.core5.function.Supplier> getTrailers() { return null; } + @Override /* Overridden from HttpEntity */ public boolean isChunked() { return chunked; } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/entity/SerializedEntity.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/entity/SerializedEntity.java index b98e9b7c35..dfee721846 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/entity/SerializedEntity.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/entity/SerializedEntity.java @@ -23,10 +23,11 @@ import java.io.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.io.*; import org.apache.juneau.http.UnmodifiableBean; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.apache.juneau.marshall.httppart.*; import org.apache.juneau.marshall.serializer.*; @@ -122,10 +123,10 @@ public InputStream getContent() { public long getContentLength() { return -1; } @Override - public Header getContentType() { - Header x = super.getContentType(); + public String getContentType() { + String x = super.getContentType(); if (x == null && nn(serializer)) - x = contentType(serializer.getPrimaryMediaType()); + x = contentType(serializer.getPrimaryMediaType()).getValue(); return x; } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/header/BasicHeader.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/header/BasicHeader.java index ee8e7adaba..7643134abd 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/header/BasicHeader.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/header/BasicHeader.java @@ -22,8 +22,8 @@ import java.util.*; import java.util.function.*; -import org.apache.http.*; -import org.apache.http.message.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.message.*; import org.apache.juneau.commons.utils.*; import org.apache.juneau.marshall.*; import org.apache.juneau.test.assertions.*; @@ -213,11 +213,16 @@ public String get() { return asString().orElseThrow(() -> new NoSuchElementException("Header value is not present")); } - @Override + /** + * Gets the parsed header elements. + * + * @return The header elements. + * @throws ParseException If the header value cannot be parsed. + */ public HeaderElement[] getElements() throws ParseException { if (elements == null) { var s = getValue(); - HeaderElement[] x = s == null ? EMPTY_HEADER_ELEMENTS : BasicHeaderValueParser.parseElements(s, null); + HeaderElement[] x = s == null ? EMPTY_HEADER_ELEMENTS : BasicHeaderValueParser.INSTANCE.parseElements(s, new ParserCursor(0, s.length())); if (supplier == null) elements = x; return cp(x); @@ -226,6 +231,9 @@ public HeaderElement[] getElements() throws ParseException { } @Override /* Overridden from Header */ + public boolean isSensitive() { return false; } + + @Override public String getName() { return name; } @Override /* Overridden from Header */ diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/header/BasicHeaderIterator.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/header/BasicHeaderIterator.java index 1ab2b2f705..c7c1bd864a 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/header/BasicHeaderIterator.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/header/BasicHeaderIterator.java @@ -20,11 +20,11 @@ import java.util.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.utils.*; /** - * Basic implementation of a {@link HeaderIterator}. + * Basic implementation of a {@link Iterator
                  }. * *
                  Notes:
                    *
                  • This class is not thread safe. @@ -38,7 +38,7 @@ @SuppressWarnings({ "java:S1192" // Duplicated literals (argument/property names) read more clearly inline than as constants }) -public class BasicHeaderIterator implements HeaderIterator { +public class BasicHeaderIterator implements Iterator
                    { private final Header[] entries; private final String name; @@ -60,17 +60,16 @@ public BasicHeaderIterator(Header[] headers, String name, boolean caseSensitive) this.currentIndex = findNext(-1); } - @Override /* Overridden from HeaderIterator */ + @Override /* Overridden from Iterator
                    */ public boolean hasNext() { return (currentIndex >= 0); } - @Override /* Overridden from HeaderIterator */ - public final Object next() throws NoSuchElementException { + @Override /* Overridden from Iterator
                    */ + public final Header next() throws NoSuchElementException { return nextHeader(); } - @Override /* Overridden from HeaderIterator */ public Header nextHeader() throws NoSuchElementException { int current = currentIndex; @@ -86,7 +85,7 @@ public Header nextHeader() throws NoSuchElementException { /** * Not supported. */ - @Override /* Overridden from HeaderIterator */ + @Override /* Overridden from Iterator
                    */ public void remove() { throw uoex(); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/header/BasicStringHeader.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/header/BasicStringHeader.java index 14f35af306..4a2e76b583 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/header/BasicStringHeader.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/header/BasicStringHeader.java @@ -21,7 +21,7 @@ import java.util.*; import java.util.function.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.test.assertions.*; /** diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/header/HeaderList.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/header/HeaderList.java index bf4c459796..55a29b83ea 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/header/HeaderList.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/header/HeaderList.java @@ -25,9 +25,9 @@ import java.util.function.*; import java.util.stream.*; -import org.apache.http.*; -import org.apache.http.Header; -import org.apache.http.util.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.util.*; import org.apache.juneau.commons.svl.*; import org.apache.juneau.commons.utils.*; import org.apache.juneau.http.HttpHeaders; @@ -526,7 +526,7 @@ public String[] getValues(String name) { * * @return A new iterator over this list of headers. */ - public HeaderIterator headerIterator() { + public Iterator
                    headerIterator() { return new BasicHeaderIterator(toArray(new Header[0]), null, caseSensitive); } @@ -537,7 +537,7 @@ public HeaderIterator headerIterator() { * * @return A new iterator over the matching headers in this list. */ - public HeaderIterator headerIterator(String name) { + public Iterator
                    headerIterator(String name) { return new BasicHeaderIterator(getAll(name), name, caseSensitive); } @@ -779,7 +779,7 @@ public HeaderList set(Header...values) { * @param values The headers to replace. null values are ignored. * @return This object. */ - + @SuppressWarnings({ "java:S3776" // Cognitive complexity acceptable for this specific logic }) diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/header/Headerable.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/header/Headerable.java index b7f83fd362..8d67a4930c 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/header/Headerable.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/header/Headerable.java @@ -16,7 +16,7 @@ */ package org.apache.juneau.http.classic.header; -import org.apache.http.*; +import org.apache.hc.core5.http.*; /** * Identifies a class that can be converted to a {@link Header} object. diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/package-info.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/package-info.java index 584cce90c9..641ebd3f3f 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/package-info.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/package-info.java @@ -22,6 +22,6 @@ * Provides static factory collections ({@link org.apache.juneau.http.classic.HttpHeaders}, * {@link org.apache.juneau.http.classic.HttpParts}, {@link org.apache.juneau.http.classic.HttpEntities}, * {@link org.apache.juneau.http.classic.HttpResources}, and {@link org.apache.juneau.http.classic.HttpResponses}) - * plus supporting types for use with the classic {@code org.apache.http} client and server stack. + * plus supporting types for use with the classic {@code org.apache.hc} client and server stack. */ package org.apache.juneau.http.classic; diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicBooleanPart.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicBooleanPart.java index 94357d88d6..1e521e4050 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicBooleanPart.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicBooleanPart.java @@ -20,7 +20,7 @@ import java.util.*; import java.util.function.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.test.assertions.*; /** diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicCsvArrayPart.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicCsvArrayPart.java index d4a41a87e8..f4599f3ea1 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicCsvArrayPart.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicCsvArrayPart.java @@ -23,7 +23,7 @@ import java.util.*; import java.util.function.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.test.assertions.*; /** diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicDatePart.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicDatePart.java index c64562dc6b..bc803e8b0c 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicDatePart.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicDatePart.java @@ -25,7 +25,7 @@ import java.util.*; import java.util.function.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.test.assertions.*; /** diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicIntegerPart.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicIntegerPart.java index 41cd90742d..a5b5b37dcf 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicIntegerPart.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicIntegerPart.java @@ -20,7 +20,7 @@ import java.util.*; import java.util.function.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.test.assertions.*; /** diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicLongPart.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicLongPart.java index f7e3d1d383..7dd377b1dc 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicLongPart.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicLongPart.java @@ -20,7 +20,7 @@ import java.util.*; import java.util.function.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.test.assertions.*; /** diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicPart.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicPart.java index 55240f7052..113267b3d6 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicPart.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicPart.java @@ -21,9 +21,10 @@ import java.util.*; import java.util.function.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.reflect.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.apache.juneau.marshall.*; import org.apache.juneau.test.assertions.*; diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicPartIterator.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicPartIterator.java index 940b4d6b26..a6d17d1339 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicPartIterator.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicPartIterator.java @@ -20,7 +20,7 @@ import java.util.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.utils.*; /** diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicStringPart.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicStringPart.java index 56fb06cafe..eaf3d50a56 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicStringPart.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicStringPart.java @@ -21,7 +21,7 @@ import java.util.*; import java.util.function.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.test.assertions.*; /** diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicUriPart.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicUriPart.java index 95322e143d..cd08db87eb 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicUriPart.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/BasicUriPart.java @@ -22,7 +22,7 @@ import java.util.*; import java.util.function.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; /** * A {@link NameValuePair} that consists of a single URL value. diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/NameValuePairable.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/NameValuePairable.java index 04356a5efc..72bed4dc1b 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/NameValuePairable.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/NameValuePairable.java @@ -16,7 +16,7 @@ */ package org.apache.juneau.http.classic.part; -import org.apache.http.*; +import org.apache.hc.core5.http.*; /** * Identifies a class that can be converted to a {@link NameValuePair} object. diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/PartIterator.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/PartIterator.java index ac5d836c65..eda401f4c7 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/PartIterator.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/PartIterator.java @@ -18,7 +18,7 @@ import java.util.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; /** * A type-safe iterator for {@link NameValuePair} objects. diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/PartList.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/PartList.java index f57a148243..95e006cc67 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/PartList.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/PartList.java @@ -25,8 +25,8 @@ import java.util.function.*; import java.util.stream.*; -import org.apache.http.*; -import org.apache.http.util.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.util.*; import org.apache.juneau.commons.svl.*; import org.apache.juneau.commons.utils.*; import org.apache.juneau.http.*; diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/SerializedPart.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/SerializedPart.java index 269e56acc0..d93be2ce5d 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/SerializedPart.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/part/SerializedPart.java @@ -20,9 +20,10 @@ import java.util.function.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.httppart.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.apache.juneau.marshall.httppart.*; import org.apache.juneau.marshall.oapi.*; import org.apache.juneau.marshall.serializer.*; diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/resource/BasicResource.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/resource/BasicResource.java index 05ec58cd87..c03cda0861 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/resource/BasicResource.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/resource/BasicResource.java @@ -21,11 +21,12 @@ import java.io.*; import java.util.function.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.bean.*; import org.apache.juneau.http.UnmodifiableBean; import org.apache.juneau.http.classic.entity.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.apache.juneau.test.assertions.*; /** @@ -91,7 +92,7 @@ protected BasicResource(BasicResource copyFrom) { * @param response The HTTP response to copy from. Must not be null. * @throws IOException Rethrown from {@link HttpEntity#getContent()}. */ - protected BasicResource(HttpResponse response) throws IOException { + protected BasicResource(ClassicHttpResponse response) throws IOException { this(new StreamEntity()); copyFrom(response); } @@ -191,8 +192,8 @@ public String asString() throws IOException { } @Override - public void consumeContent() throws IOException { - // No-op: Intentional empty implementation for optional interface method + public void close() throws IOException { + entity.close(); } /** @@ -212,9 +213,9 @@ public void consumeContent() throws IOException { * @return This object. * @throws IOException If content could not be retrieved. */ - public SELF copyFrom(HttpResponse response) throws IOException { + public SELF copyFrom(ClassicHttpResponse response) throws IOException { reqnn("response", response); - addHeaders(response.getAllHeaders()); + addHeaders(response.getHeaders()); setContent(response.getEntity().getContent()); return self(); } @@ -223,13 +224,13 @@ public SELF copyFrom(HttpResponse response) throws IOException { public InputStream getContent() throws IOException, UnsupportedOperationException { return entity.getContent(); } @Override /* Overridden from HttpEntity */ - public Header getContentEncoding() { return entity.getContentEncoding(); } + public String getContentEncoding() { return entity.getContentEncoding(); } @Override /* Overridden from HttpEntity */ public long getContentLength() { return entity.getContentLength(); } @Override /* Overridden from HttpEntity */ - public Header getContentType() { return entity.getContentType(); } + public String getContentType() { return entity.getContentType(); } /** * Returns access to the underlying builder for the HTTP entity. @@ -241,6 +242,12 @@ public SELF copyFrom(HttpResponse response) throws IOException { @Override /* Overridden from HttpResource */ public HeaderList getHeaders() { return headers; } + @Override + public java.util.Set getTrailerNames() { return java.util.Set.of(); } + + @Override + public org.apache.hc.core5.function.Supplier> getTrailers() { return null; } + @Override /* Overridden from HttpEntity */ public boolean isChunked() { return entity.isChunked(); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/resource/HttpResource.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/resource/HttpResource.java index 4a02f32107..bcbaa86475 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/resource/HttpResource.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/resource/HttpResource.java @@ -16,8 +16,9 @@ */ package org.apache.juneau.http.classic.resource; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * An extension of an {@link HttpEntity} that also includes arbitrary headers. diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/resource/StreamResource.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/resource/StreamResource.java index 84a0a30ab6..1f4347a677 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/resource/StreamResource.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/resource/StreamResource.java @@ -19,10 +19,11 @@ import static org.apache.juneau.commons.utils.Shorts.*; import java.io.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.http.UnmodifiableBean; import org.apache.juneau.http.classic.entity.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * A streamed, non-repeatable resource that obtains its content from an {@link InputStream}. @@ -68,7 +69,7 @@ protected StreamResource(StreamResource copyFrom) { * @param response The HTTP response to copy from. Must not be null. * @throws IOException Rethrown from {@link HttpEntity#getContent()}. */ - public StreamResource(HttpResponse response) throws IOException { + public StreamResource(ClassicHttpResponse response) throws IOException { super(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Accepted.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Accepted.java index 391b6df50b..20085e272f 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Accepted.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Accepted.java @@ -19,7 +19,7 @@ import static org.apache.juneau.commons.utils.Shorts.*; import static org.apache.juneau.http.classic.response.Accepted.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; @@ -77,7 +77,7 @@ public Accepted(Accepted copyFrom) { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public Accepted(HttpResponse response) { + public Accepted(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/AlreadyReported.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/AlreadyReported.java index 6a15e84553..e595cf7aaf 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/AlreadyReported.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/AlreadyReported.java @@ -19,7 +19,7 @@ import static org.apache.juneau.commons.utils.Shorts.*; import static org.apache.juneau.http.classic.response.AlreadyReported.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; @@ -76,7 +76,7 @@ public AlreadyReported(AlreadyReported copyFrom) { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public AlreadyReported(HttpResponse response) { + public AlreadyReported(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/BadRequest.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/BadRequest.java index 3a56252cf6..e003d4bc1f 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/BadRequest.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/BadRequest.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 400 (Bad Request). @@ -77,7 +78,7 @@ public BadRequest() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public BadRequest(HttpResponse response) { + public BadRequest(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/BasicHttpException.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/BasicHttpException.java index da5d8cd24b..19a32f9cfa 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/BasicHttpException.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/BasicHttpException.java @@ -25,19 +25,20 @@ import java.lang.reflect.*; import java.util.*; -import org.apache.http.*; -import org.apache.http.impl.*; -import org.apache.http.params.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.impl.*; +import org.apache.hc.core5.http.message.StatusLine; import org.apache.juneau.http.UnmodifiableBean; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.apache.juneau.marshall.*; /** - * Basic implementation of the {@link HttpResponse} interface for error responses. + * Basic implementation of the {@link ClassicHttpResponse} interface for error responses. * *

                    - * Although this class implements the various setters defined on the {@link HttpResponse} interface, it's in general + * Although this class implements the various setters defined on the {@link ClassicHttpResponse} interface, it's in general * going to be more efficient to set the status/headers/content of this bean through the builder. * *

                    @@ -70,11 +71,37 @@ "java:S1165", // headers/statusLine/content are replaced after construction by setters, so the exception's fields cannot be final "java:S1192" // Duplicated literals (argument/property names) read more clearly inline than as constants }) -public class BasicHttpException extends BasicRuntimeException implements HttpResponse { +public class BasicHttpException extends BasicRuntimeException implements ClassicHttpResponse { private static final long serialVersionUID = 1L; HeaderList headers = HeaderList.create(); + @Override + public void close() throws java.io.IOException { if (content != null) content.close(); } + + @Override + public int getCode() { return statusLine.getStatusCode(); } + + @Override + public void setCode(int code) { modify(() -> statusLine.setStatusCode(code)); } + + @Override + public String getReasonPhrase() { return statusLine.getReasonPhrase(); } + + @Override + public void setVersion(ProtocolVersion version) { modify(() -> statusLine.setProtocolVersion(version)); } + + @Override + public int countHeaders(String name) { return headers.getAll(name).length; } + + @Override + public Header getHeader(String name) throws org.apache.hc.core5.http.ProtocolException { + Header[] values = getHeaders(name); + if (values.length > 1) + throw new org.apache.hc.core5.http.ProtocolException("Multiple headers: " + name); + return values.length == 0 ? null : values[0]; + } + transient BasicStatusLine statusLine = new BasicStatusLine(); transient HttpEntity content; @@ -93,7 +120,7 @@ public BasicHttpException() { * * @param response The HTTP response being parsed. Must not be null. */ - public BasicHttpException(HttpResponse response) { + public BasicHttpException(ClassicHttpResponse response) { super((Throwable)null); reqnn("response", response); var h = response.getLastHeader("Thrown"); @@ -102,9 +129,9 @@ public BasicHttpException(HttpResponse response) { if (partsOpt.isPresent() && !partsOpt.get().isEmpty()) setMessage(partsOpt.get().get(0).getMessage()); } - setHeaders(response.getAllHeaders()); + setHeaders(response.getHeaders()); setContent(response.getEntity()); - setStatusCode(response.getStatusLine().getStatusCode()); + setStatusCode(response.getCode()); } /** @@ -177,8 +204,8 @@ public void addHeader(Header value) { } @Override /* Overridden from HttpMessage */ - public void addHeader(String name, String value) { - modify(() -> headers.append(name, value)); + public void addHeader(String name, Object value) { + modify(() -> headers.append(name, value == null ? null : value.toString())); } @Override /* Overridden from HttpMessage */ @@ -187,7 +214,7 @@ public boolean containsHeader(String name) { } @Override /* Overridden from HttpMessage */ - public Header[] getAllHeaders() { return headers.getAll(); } + public Header[] getHeaders() { return headers.getAll(); } @Override /* Overridden from HttpMessage */ public HttpEntity getEntity() { @@ -241,7 +268,7 @@ public String getFullStackMessage(boolean scrubForXssVulnerabilities) { * * @return The underlying builder for the headers. */ - public HeaderList getHeaders() { + public HeaderList getHeaderList() { return headers; } @@ -269,10 +296,7 @@ public String getMessage() { } @Override /* Overridden from HttpMessage */ - public HttpParams getParams() { return null; } - - @Override /* Overridden from HttpMessage */ - public ProtocolVersion getProtocolVersion() { return statusLine.getProtocolVersion(); } + public ProtocolVersion getVersion() { return statusLine.getProtocolVersion(); } /** * Returns the root cause of this exception. @@ -296,8 +320,7 @@ public Throwable getRootCause() { return null; } - @Override /* Overridden from HttpMessage */ - public StatusLine getStatusLine() { return statusLine; } + public StatusLine getStatusLine() { return new StatusLine(getVersion(), getCode(), getReasonPhrase()); } @Override /* Overridden from Object */ public boolean equals(Object o) { @@ -314,12 +337,12 @@ public int hashCode() { } @Override /* Overridden from HttpMessage */ - public HeaderIterator headerIterator() { + public Iterator

                    headerIterator() { return headers.headerIterator(); } @Override /* Overridden from HttpMessage */ - public HeaderIterator headerIterator(String name) { + public Iterator
                    headerIterator(String name) { return headers.headerIterator(name); } @@ -331,13 +354,17 @@ public HeaderIterator headerIterator(String name) { public boolean isUnmodifiable() { return this instanceof UnmodifiableBean; } @Override /* Overridden from HttpMessage */ - public void removeHeader(Header value) { + public boolean removeHeader(Header value) { + boolean present = Arrays.asList(headers.getAll()).contains(value); modify(() -> headers.remove(value)); + return present; } @Override /* Overridden from HttpMessage */ - public void removeHeaders(String name) { + public boolean removeHeaders(String name) { + boolean present = headers.contains(name); modify(() -> headers.remove(name)); + return present; } /** @@ -371,8 +398,8 @@ public void setHeader(Header value) { } @Override /* Overridden from HttpMessage */ - public void setHeader(String name, String value) { - modify(() -> headers.set(name, value)); + public void setHeader(String name, Object value) { + modify(() -> headers.set(name, value == null ? null : value.toString())); } /** @@ -383,7 +410,7 @@ public void setHeader(String name, String value) { * @return This object. */ public BasicHttpException setHeader2(String name, Object value) { - return modify(() -> headers.set(name, value)); + return modify(() -> headers.set(name, value == null ? null : value.toString())); } @Override /* Overridden from HttpMessage */ @@ -444,12 +471,6 @@ public BasicHttpException setMessage(String message, Object...args) { return modify(() -> super.setMessage(message, args)); } - @Override /* Overridden from HttpMessage */ - public void setParams(HttpParams params) { - // Deprecated optional interface method; routed through the funnel so it is frozen on unmodifiable snapshots. - modify(() -> { /* No-op */ }); - } - /** * Sets the protocol version on the status line. * @@ -495,7 +516,6 @@ public BasicHttpException setReasonPhraseCatalog(ReasonPhraseCatalog value) { return modify(() -> statusLine.setReasonPhraseCatalog(value)); } - @Override /* Overridden from HttpMessage */ public void setStatusCode(int code) throws IllegalStateException { modify(() -> statusLine.setStatusCode(code)); } @@ -524,17 +544,14 @@ public BasicHttpException setStatusLine(BasicStatusLine value) { return modify(() -> statusLine = value.copy()); } - @Override /* Overridden from HttpMessage */ public void setStatusLine(ProtocolVersion ver, int code) { modify(() -> statusLine.setProtocolVersion(ver).setStatusCode(code)); } - @Override /* Overridden from HttpMessage */ public void setStatusLine(ProtocolVersion ver, int code, String reason) { modify(() -> statusLine.setProtocolVersion(ver).setReasonPhrase(reason).setStatusCode(code)); } - @Override /* Overridden from HttpMessage */ public void setStatusLine(StatusLine value) { modify(() -> statusLine.setProtocolVersion(value.getProtocolVersion()).setReasonPhrase(value.getReasonPhrase()).setStatusCode(value.getStatusCode())); } @@ -565,10 +582,10 @@ public String toString() { * @param response The HTTP response to check. Must not be null. * @throws AssertionError If status code is not what was expected. */ - protected void assertStatusCode(HttpResponse response) throws AssertionError { + protected void assertStatusCode(ClassicHttpResponse response) throws AssertionError { reqnn("response", response); int expected = getStatusLine().getStatusCode(); - int actual = response.getStatusLine().getStatusCode(); + int actual = response.getCode(); assertInteger(actual).setMsg("Unexpected status code. Expected:[%s], Actual:[%s]", expected, actual).is(expected); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/BasicHttpResponse.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/BasicHttpResponse.java index 3de50d0ec1..d73a0dd666 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/BasicHttpResponse.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/BasicHttpResponse.java @@ -23,20 +23,21 @@ import java.net.*; import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; -import org.apache.http.impl.*; -import org.apache.http.params.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.impl.*; +import org.apache.hc.core5.http.message.StatusLine; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.apache.juneau.marshall.*; /** - * Basic implementation of the {@link HttpResponse} interface. + * Basic implementation of the {@link ClassicHttpResponse} interface. * *

                    - * Although this class implements the various setters defined on the {@link HttpResponse} interface, it's in general + * Although this class implements the various setters defined on the {@link ClassicHttpResponse} interface, it's in general * going to be more efficient to set the status/headers/content of this bean through the builder. * *

                    @@ -66,7 +67,33 @@ "java:S119", // 'SELF' (CRTP self-type) is intentional and clearer than a single-letter name. "java:S1192" // Duplicated literals (argument/property names) read more clearly inline than as constants }) -public abstract class BasicHttpResponse> implements HttpResponse { +public abstract class BasicHttpResponse> implements ClassicHttpResponse { + + @Override + public void close() throws java.io.IOException { if (content != null) content.close(); } + + @Override + public int getCode() { return statusLine.getStatusCode(); } + + @Override + public void setCode(int code) { modify(() -> statusLine.setStatusCode(code)); } + + @Override + public String getReasonPhrase() { return statusLine.getReasonPhrase(); } + + @Override + public void setVersion(ProtocolVersion version) { modify(() -> statusLine.setProtocolVersion(version)); } + + @Override + public int countHeaders(String name) { return headers.getAll(name).length; } + + @Override + public Header getHeader(String name) throws org.apache.hc.core5.http.ProtocolException { + Header[] values = getHeaders(name); + if (values.length > 1) + throw new org.apache.hc.core5.http.ProtocolException("Multiple headers: " + name); + return values.length == 0 ? null : values[0]; + } BasicStatusLine statusLine = new BasicStatusLine(); HeaderList headers = HeaderList.create(); @@ -100,11 +127,11 @@ protected BasicHttpResponse(BasicStatusLine statusLine) { * * @param response The HTTP response to copy from. Must not be null. */ - protected BasicHttpResponse(HttpResponse response) { + protected BasicHttpResponse(ClassicHttpResponse response) { reqnn("response", response); - setHeaders(response.getAllHeaders()); + setHeaders(response.getHeaders()); setContent(response.getEntity()); - setStatusLine(response.getStatusLine()); + setStatusLine(new StatusLine(response)); } @Override /* Overridden from HttpMessage */ @@ -113,8 +140,8 @@ public void addHeader(Header value) { } @Override /* Overridden from HttpMessage */ - public void addHeader(String name, String value) { - modify(() -> headers.append(name, value)); + public void addHeader(String name, Object value) { + modify(() -> headers.append(name, value == null ? null : value.toString())); } @Override /* Overridden from HttpMessage */ @@ -123,7 +150,7 @@ public boolean containsHeader(String name) { } @Override /* Overridden from HttpMessage */ - public Header[] getAllHeaders() { return headers.getAll(); } + public Header[] getHeaders() { return headers.getAll(); } @Override /* Overridden from HttpMessage */ public HttpEntity getEntity() { @@ -143,7 +170,7 @@ public Header getFirstHeader(String name) { * * @return The underlying builder for the headers. */ - public HeaderList getHeaders() { return headers; } + public HeaderList getHeaderList() { return headers; } @Override /* Overridden from HttpMessage */ public Header[] getHeaders(String name) { @@ -159,21 +186,17 @@ public Header getLastHeader(String name) { public Locale getLocale() { return statusLine.getLocale(); } @Override /* Overridden from HttpMessage */ - public HttpParams getParams() { return null; } - - @Override /* Overridden from HttpMessage */ - public ProtocolVersion getProtocolVersion() { return statusLine.getProtocolVersion(); } + public ProtocolVersion getVersion() { return statusLine.getProtocolVersion(); } - @Override /* Overridden from HttpMessage */ - public StatusLine getStatusLine() { return statusLine; } + public StatusLine getStatusLine() { return new StatusLine(getVersion(), getCode(), getReasonPhrase()); } @Override /* Overridden from HttpMessage */ - public HeaderIterator headerIterator() { + public Iterator

                    headerIterator() { return headers.headerIterator(); } @Override /* Overridden from HttpMessage */ - public HeaderIterator headerIterator(String name) { + public Iterator
                    headerIterator(String name) { return headers.headerIterator(name); } @@ -185,13 +208,17 @@ public HeaderIterator headerIterator(String name) { public boolean isUnmodifiable() { return this instanceof UnmodifiableBean; } @Override /* Overridden from HttpMessage */ - public void removeHeader(Header value) { + public boolean removeHeader(Header value) { + boolean present = Arrays.asList(headers.getAll()).contains(value); modify(() -> headers.remove(value)); + return present; } @Override /* Overridden from HttpMessage */ - public void removeHeaders(String name) { + public boolean removeHeaders(String name) { + boolean present = headers.contains(name); modify(() -> headers.remove(name)); + return present; } /** @@ -225,8 +252,8 @@ public void setHeader(Header value) { } @Override /* Overridden from HttpMessage */ - public void setHeader(String name, String value) { - modify(() -> headers.set(name, value)); + public void setHeader(String name, Object value) { + modify(() -> headers.set(name, value == null ? null : value.toString())); } /** @@ -247,7 +274,7 @@ public SELF setHeader2(Header value) { * @return This object. */ public SELF setHeader2(String name, String value) { - return modify(() -> headers.set(name, value)); + return modify(() -> headers.set(name, value == null ? null : value.toString())); } @Override /* Overridden from HttpMessage */ @@ -323,12 +350,6 @@ public SELF setLocation(URI value) { return modify(() -> headers.set(Location.of(value))); } - @Override /* Overridden from HttpMessage */ - public void setParams(HttpParams params) { - // Deprecated optional interface method; routed through the funnel so it is frozen on unmodifiable snapshots. - modify(() -> { /* No-op */ }); - } - /** * Sets the protocol version on the status line. * @@ -374,7 +395,6 @@ public SELF setReasonPhraseCatalog(ReasonPhraseCatalog value) { return modify(() -> statusLine.setReasonPhraseCatalog(value)); } - @Override /* Overridden from HttpMessage */ public void setStatusCode(int code) throws IllegalStateException { modify(() -> statusLine.setStatusCode(code)); } @@ -405,17 +425,14 @@ public SELF setStatusLine(BasicStatusLine value) { return modify(() -> statusLine = value.copy()); } - @Override /* Overridden from HttpMessage */ public void setStatusLine(ProtocolVersion ver, int code) { modify(() -> statusLine.setProtocolVersion(ver).setStatusCode(code)); } - @Override /* Overridden from HttpMessage */ public void setStatusLine(ProtocolVersion ver, int code, String reason) { modify(() -> statusLine.setProtocolVersion(ver).setReasonPhrase(reason).setStatusCode(code)); } - @Override /* Overridden from HttpMessage */ public void setStatusLine(StatusLine value) { modify(() -> statusLine.setProtocolVersion(value.getProtocolVersion()).setReasonPhrase(value.getReasonPhrase()).setStatusCode(value.getStatusCode())); } @@ -497,10 +514,10 @@ protected void freeze() { * @param response The HTTP response to check. Must not be null. * @throws AssertionError If status code is not what was expected. */ - protected void assertStatusCode(HttpResponse response) throws AssertionError { + protected void assertStatusCode(ClassicHttpResponse response) throws AssertionError { reqnn("response", response); int expected = getStatusLine().getStatusCode(); - int actual = response.getStatusLine().getStatusCode(); + int actual = response.getCode(); assertInteger(actual).setMsg("Unexpected status code. Expected:[%s], Actual:[%s]", expected, actual).is(expected); } } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Conflict.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Conflict.java index c95bfef758..9e2011b5ed 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Conflict.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Conflict.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 409 (Conflict). @@ -77,7 +78,7 @@ public Conflict() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public Conflict(HttpResponse response) { + public Conflict(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Continue.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Continue.java index 949ba9b768..c40c484fe4 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Continue.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Continue.java @@ -19,7 +19,7 @@ import static org.apache.juneau.commons.utils.Shorts.*; import static org.apache.juneau.http.classic.response.Continue.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; @@ -80,7 +80,7 @@ public Continue(Continue copyFrom) { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public Continue(HttpResponse response) { + public Continue(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Created.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Created.java index dc2472340b..556b0fe5dc 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Created.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Created.java @@ -19,7 +19,7 @@ import static org.apache.juneau.commons.utils.Shorts.*; import static org.apache.juneau.http.classic.response.Created.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; @@ -76,7 +76,7 @@ public Created(Created copyFrom) { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public Created(HttpResponse response) { + public Created(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/EarlyHints.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/EarlyHints.java index 023f26198b..d92e09f6f2 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/EarlyHints.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/EarlyHints.java @@ -19,7 +19,7 @@ import static org.apache.juneau.commons.utils.Shorts.*; import static org.apache.juneau.http.classic.response.EarlyHints.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; @@ -76,7 +76,7 @@ public EarlyHints(EarlyHints copyFrom) { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public EarlyHints(HttpResponse response) { + public EarlyHints(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/ExpectationFailed.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/ExpectationFailed.java index 435bc5283a..75f1cfb9a8 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/ExpectationFailed.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/ExpectationFailed.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 417 (Expectation Failed). @@ -77,7 +78,7 @@ public ExpectationFailed() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public ExpectationFailed(HttpResponse response) { + public ExpectationFailed(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/FailedDependency.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/FailedDependency.java index a81c531271..c57eec6353 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/FailedDependency.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/FailedDependency.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 424 (Failed Dependency). @@ -77,7 +78,7 @@ public FailedDependency() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public FailedDependency(HttpResponse response) { + public FailedDependency(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Forbidden.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Forbidden.java index 62d2c94836..d896eefe7b 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Forbidden.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Forbidden.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 403 (Forbidden). @@ -78,7 +79,7 @@ public Forbidden() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public Forbidden(HttpResponse response) { + public Forbidden(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Found.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Found.java index 9ac180bb1c..961e1aa09e 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Found.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Found.java @@ -19,7 +19,7 @@ import static org.apache.juneau.commons.utils.Shorts.*; import static org.apache.juneau.http.classic.response.Found.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; @@ -80,7 +80,7 @@ public Found(Found copyFrom) { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public Found(HttpResponse response) { + public Found(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Gone.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Gone.java index 345a890340..78b8cc65bf 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Gone.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Gone.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 410 (). @@ -81,7 +82,7 @@ public Gone() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public Gone(HttpResponse response) { + public Gone(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/HttpVersionNotSupported.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/HttpVersionNotSupported.java index 3903f35c12..1f25876c73 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/HttpVersionNotSupported.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/HttpVersionNotSupported.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 505 (). @@ -77,7 +78,7 @@ public HttpVersionNotSupported() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public HttpVersionNotSupported(HttpResponse response) { + public HttpVersionNotSupported(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/IMUsed.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/IMUsed.java index e551acdb96..244a9a67f1 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/IMUsed.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/IMUsed.java @@ -19,7 +19,7 @@ import static org.apache.juneau.commons.utils.Shorts.*; import static org.apache.juneau.http.classic.response.IMUsed.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; @@ -67,7 +67,7 @@ public IMUsed() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public IMUsed(HttpResponse response) { + public IMUsed(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/InsufficientStorage.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/InsufficientStorage.java index f21a1845a0..1ee1532af5 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/InsufficientStorage.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/InsufficientStorage.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 507 (). @@ -77,7 +78,7 @@ public InsufficientStorage() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public InsufficientStorage(HttpResponse response) { + public InsufficientStorage(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/InternalServerError.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/InternalServerError.java index 44d1c6a97d..3482ae9266 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/InternalServerError.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/InternalServerError.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 500 (Internal Server Error). @@ -77,7 +78,7 @@ public InternalServerError() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public InternalServerError(HttpResponse response) { + public InternalServerError(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/LengthRequired.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/LengthRequired.java index 2fe6edbc36..3ad486f696 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/LengthRequired.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/LengthRequired.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 411 (). @@ -77,7 +78,7 @@ public LengthRequired() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public LengthRequired(HttpResponse response) { + public LengthRequired(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Locked.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Locked.java index 794722e695..0de6784b1f 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Locked.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Locked.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 423 (Locked). @@ -77,7 +78,7 @@ public Locked() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public Locked(HttpResponse response) { + public Locked(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/LoopDetected.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/LoopDetected.java index 82b604fbbb..06ed1af778 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/LoopDetected.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/LoopDetected.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 508 (Loop Detected). @@ -77,7 +78,7 @@ public LoopDetected() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public LoopDetected(HttpResponse response) { + public LoopDetected(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/MethodNotAllowed.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/MethodNotAllowed.java index 3bb8d326f3..d8dfefb101 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/MethodNotAllowed.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/MethodNotAllowed.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 405 (Method Not Allowed). @@ -77,7 +78,7 @@ public MethodNotAllowed() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public MethodNotAllowed(HttpResponse response) { + public MethodNotAllowed(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/MisdirectedRequest.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/MisdirectedRequest.java index b0b1fd5dce..763969c7ee 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/MisdirectedRequest.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/MisdirectedRequest.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 421 (Misdirected Request). @@ -77,7 +78,7 @@ public MisdirectedRequest() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public MisdirectedRequest(HttpResponse response) { + public MisdirectedRequest(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/MovedPermanently.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/MovedPermanently.java index 92983e909f..51e4fbd09e 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/MovedPermanently.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/MovedPermanently.java @@ -19,7 +19,7 @@ import static org.apache.juneau.commons.utils.Shorts.*; import static org.apache.juneau.http.classic.response.MovedPermanently.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; @@ -67,7 +67,7 @@ public MovedPermanently() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public MovedPermanently(HttpResponse response) { + public MovedPermanently(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/MultiStatus.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/MultiStatus.java index 8dc570e537..f859cf7d9c 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/MultiStatus.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/MultiStatus.java @@ -19,7 +19,7 @@ import static org.apache.juneau.commons.utils.Shorts.*; import static org.apache.juneau.http.classic.response.MultiStatus.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; @@ -67,7 +67,7 @@ public MultiStatus() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public MultiStatus(HttpResponse response) { + public MultiStatus(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/MultipleChoices.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/MultipleChoices.java index b76ccb8daa..1b7e6a813b 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/MultipleChoices.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/MultipleChoices.java @@ -19,7 +19,7 @@ import static org.apache.juneau.commons.utils.Shorts.*; import static org.apache.juneau.http.classic.response.MultipleChoices.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; @@ -68,7 +68,7 @@ public MultipleChoices() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public MultipleChoices(HttpResponse response) { + public MultipleChoices(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NetworkAuthenticationRequired.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NetworkAuthenticationRequired.java index 16fa82648c..5a31656830 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NetworkAuthenticationRequired.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NetworkAuthenticationRequired.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 511 (Network Authentication Required). @@ -78,7 +79,7 @@ public NetworkAuthenticationRequired() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public NetworkAuthenticationRequired(HttpResponse response) { + public NetworkAuthenticationRequired(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NoContent.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NoContent.java index fbd9441571..e91ef89410 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NoContent.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NoContent.java @@ -19,7 +19,7 @@ import static org.apache.juneau.commons.utils.Shorts.*; import static org.apache.juneau.http.classic.response.NoContent.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; @@ -67,7 +67,7 @@ public NoContent() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public NoContent(HttpResponse response) { + public NoContent(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NonAuthoritiveInformation.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NonAuthoritiveInformation.java index 7d5f66e11e..9eaee73894 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NonAuthoritiveInformation.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NonAuthoritiveInformation.java @@ -19,7 +19,7 @@ import static org.apache.juneau.commons.utils.Shorts.*; import static org.apache.juneau.http.classic.response.NonAuthoritiveInformation.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; @@ -67,7 +67,7 @@ public NonAuthoritiveInformation() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public NonAuthoritiveInformation(HttpResponse response) { + public NonAuthoritiveInformation(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NotAcceptable.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NotAcceptable.java index 97abda9c03..45e09eb82a 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NotAcceptable.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NotAcceptable.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 406 (Not Acceptable). @@ -77,7 +78,7 @@ public NotAcceptable() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public NotAcceptable(HttpResponse response) { + public NotAcceptable(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NotExtended.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NotExtended.java index a250e09747..6dad9a4965 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NotExtended.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NotExtended.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 510 (Not Extended). @@ -77,7 +78,7 @@ public NotExtended() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public NotExtended(HttpResponse response) { + public NotExtended(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NotFound.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NotFound.java index 2263dbb0f9..31cddc5095 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NotFound.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NotFound.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 404 (Not Found). @@ -78,7 +79,7 @@ public NotFound() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public NotFound(HttpResponse response) { + public NotFound(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NotImplemented.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NotImplemented.java index ad197716fe..eb5c899ef2 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NotImplemented.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NotImplemented.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 501 (Not Implemented). @@ -78,7 +79,7 @@ public NotImplemented() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public NotImplemented(HttpResponse response) { + public NotImplemented(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NotModified.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NotModified.java index 153d8bc447..80341bb8d1 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NotModified.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/NotModified.java @@ -19,7 +19,7 @@ import static org.apache.juneau.commons.utils.Shorts.*; import static org.apache.juneau.http.classic.response.NotModified.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; @@ -68,7 +68,7 @@ public NotModified() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public NotModified(HttpResponse response) { + public NotModified(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Ok.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Ok.java index 41d61e2810..28b1543dba 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Ok.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Ok.java @@ -19,7 +19,7 @@ import static org.apache.juneau.commons.utils.Shorts.*; import static org.apache.juneau.http.classic.response.Ok.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; @@ -72,7 +72,7 @@ public Ok() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public Ok(HttpResponse response) { + public Ok(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/PartialContent.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/PartialContent.java index ce79fd6306..d57bcddd95 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/PartialContent.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/PartialContent.java @@ -19,7 +19,7 @@ import static org.apache.juneau.commons.utils.Shorts.*; import static org.apache.juneau.http.classic.response.PartialContent.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; @@ -68,7 +68,7 @@ public PartialContent() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public PartialContent(HttpResponse response) { + public PartialContent(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/PayloadTooLarge.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/PayloadTooLarge.java index 90a2723bec..4e61710a4f 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/PayloadTooLarge.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/PayloadTooLarge.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 413 (Payload Too Large). @@ -77,7 +78,7 @@ public PayloadTooLarge() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public PayloadTooLarge(HttpResponse response) { + public PayloadTooLarge(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/PermanentRedirect.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/PermanentRedirect.java index b24b8fff24..3e8f5e1390 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/PermanentRedirect.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/PermanentRedirect.java @@ -19,7 +19,7 @@ import static org.apache.juneau.commons.utils.Shorts.*; import static org.apache.juneau.http.classic.response.PermanentRedirect.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; @@ -68,7 +68,7 @@ public PermanentRedirect() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public PermanentRedirect(HttpResponse response) { + public PermanentRedirect(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/PreconditionFailed.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/PreconditionFailed.java index d499457a59..07412cd150 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/PreconditionFailed.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/PreconditionFailed.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 412 (Precondition Failed). @@ -77,7 +78,7 @@ public PreconditionFailed() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public PreconditionFailed(HttpResponse response) { + public PreconditionFailed(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/PreconditionRequired.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/PreconditionRequired.java index da47b50931..cbe2a5bd67 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/PreconditionRequired.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/PreconditionRequired.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 428 (Precondition Required). @@ -78,7 +79,7 @@ public PreconditionRequired() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public PreconditionRequired(HttpResponse response) { + public PreconditionRequired(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Processing.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Processing.java index 8ac48ccaa7..fcd3cb2fa1 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Processing.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Processing.java @@ -19,7 +19,7 @@ import static org.apache.juneau.commons.utils.Shorts.*; import static org.apache.juneau.http.classic.response.Processing.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; @@ -69,7 +69,7 @@ public Processing() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public Processing(HttpResponse response) { + public Processing(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/RangeNotSatisfiable.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/RangeNotSatisfiable.java index 723dd698ea..2b346a20c7 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/RangeNotSatisfiable.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/RangeNotSatisfiable.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 416 (Range Not Satisfiable). @@ -78,7 +79,7 @@ public RangeNotSatisfiable() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public RangeNotSatisfiable(HttpResponse response) { + public RangeNotSatisfiable(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/RequestHeaderFieldsTooLarge.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/RequestHeaderFieldsTooLarge.java index 2521533a4d..98f5c344ee 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/RequestHeaderFieldsTooLarge.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/RequestHeaderFieldsTooLarge.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 431 (Request Header Fields Too Large). @@ -77,7 +78,7 @@ public RequestHeaderFieldsTooLarge() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public RequestHeaderFieldsTooLarge(HttpResponse response) { + public RequestHeaderFieldsTooLarge(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/ResetContent.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/ResetContent.java index 43f9638c4d..1a95c9eb98 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/ResetContent.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/ResetContent.java @@ -19,7 +19,7 @@ import static org.apache.juneau.commons.utils.Shorts.*; import static org.apache.juneau.http.classic.response.ResetContent.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; @@ -68,7 +68,7 @@ public ResetContent() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public ResetContent(HttpResponse response) { + public ResetContent(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/SeeOther.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/SeeOther.java index fcb9bc34dd..8301ee2bae 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/SeeOther.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/SeeOther.java @@ -19,7 +19,7 @@ import static org.apache.juneau.commons.utils.Shorts.*; import static org.apache.juneau.http.classic.response.SeeOther.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; @@ -68,7 +68,7 @@ public SeeOther() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public SeeOther(HttpResponse response) { + public SeeOther(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/ServiceUnavailable.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/ServiceUnavailable.java index 4538cb805f..f40ac3e9b0 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/ServiceUnavailable.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/ServiceUnavailable.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 503 (Service Unavailable). @@ -78,7 +79,7 @@ public ServiceUnavailable() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public ServiceUnavailable(HttpResponse response) { + public ServiceUnavailable(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/SwitchingProtocols.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/SwitchingProtocols.java index 2f53cbb6b9..4d73ad4310 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/SwitchingProtocols.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/SwitchingProtocols.java @@ -19,7 +19,7 @@ import static org.apache.juneau.commons.utils.Shorts.*; import static org.apache.juneau.http.classic.response.SwitchingProtocols.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; @@ -67,7 +67,7 @@ public SwitchingProtocols() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public SwitchingProtocols(HttpResponse response) { + public SwitchingProtocols(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/TemporaryRedirect.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/TemporaryRedirect.java index c77eae376e..a6e4ca5d24 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/TemporaryRedirect.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/TemporaryRedirect.java @@ -19,7 +19,7 @@ import static org.apache.juneau.commons.utils.Shorts.*; import static org.apache.juneau.http.classic.response.TemporaryRedirect.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; @@ -69,7 +69,7 @@ public TemporaryRedirect() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public TemporaryRedirect(HttpResponse response) { + public TemporaryRedirect(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/TooManyRequests.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/TooManyRequests.java index e41714f36d..df7164dc9f 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/TooManyRequests.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/TooManyRequests.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 429 (Too Many Requests). @@ -78,7 +79,7 @@ public TooManyRequests() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public TooManyRequests(HttpResponse response) { + public TooManyRequests(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Unauthorized.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Unauthorized.java index fc7db88dd0..fe80d68774 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Unauthorized.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/Unauthorized.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 401 (Unauthorized). @@ -80,7 +81,7 @@ public Unauthorized() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public Unauthorized(HttpResponse response) { + public Unauthorized(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UnavailableForLegalReasons.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UnavailableForLegalReasons.java index 11bc9b7da8..839810f214 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UnavailableForLegalReasons.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UnavailableForLegalReasons.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 451 (Unavailable For Legal Reasons). @@ -77,7 +78,7 @@ public UnavailableForLegalReasons() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public UnavailableForLegalReasons(HttpResponse response) { + public UnavailableForLegalReasons(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UnprocessableEntity.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UnprocessableEntity.java index b0cbaf102f..16064ee7b9 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UnprocessableEntity.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UnprocessableEntity.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 422 (Unprocessable Entity). @@ -77,7 +78,7 @@ public UnprocessableEntity() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public UnprocessableEntity(HttpResponse response) { + public UnprocessableEntity(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UnsupportedMediaType.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UnsupportedMediaType.java index 9a94bcdddd..ea78c0232a 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UnsupportedMediaType.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UnsupportedMediaType.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 415 (Unsupported Media Type). @@ -78,7 +79,7 @@ public UnsupportedMediaType() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public UnsupportedMediaType(HttpResponse response) { + public UnsupportedMediaType(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UpgradeRequired.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UpgradeRequired.java index 5d56c095cb..4359b478fc 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UpgradeRequired.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UpgradeRequired.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 426 (Upgrade Required). @@ -77,7 +78,7 @@ public UpgradeRequired() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public UpgradeRequired(HttpResponse response) { + public UpgradeRequired(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UriTooLong.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UriTooLong.java index 1d0b5067c8..233c4f222d 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UriTooLong.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UriTooLong.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 414 (URI Too Long). @@ -78,7 +79,7 @@ public UriTooLong() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public UriTooLong(HttpResponse response) { + public UriTooLong(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UseProxy.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UseProxy.java index 768ebacb8f..77383462f0 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UseProxy.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/UseProxy.java @@ -19,7 +19,7 @@ import static org.apache.juneau.commons.utils.Shorts.*; import static org.apache.juneau.http.classic.response.UseProxy.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; @@ -67,7 +67,7 @@ public UseProxy() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public UseProxy(HttpResponse response) { + public UseProxy(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/VariantAlsoNegotiates.java b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/VariantAlsoNegotiates.java index a485e6565a..2a23ef6cee 100644 --- a/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/VariantAlsoNegotiates.java +++ b/juneau-rest/juneau-rest-common-classic/src/main/java/org/apache/juneau/http/classic/response/VariantAlsoNegotiates.java @@ -21,12 +21,13 @@ import java.util.*; -import org.apache.http.*; -import org.apache.http.Header; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.Header; import org.apache.juneau.commons.*; import org.apache.juneau.http.*; import org.apache.juneau.http.classic.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; /** * Exception representing an HTTP 506 (Variant Also Negotiate). @@ -77,7 +78,7 @@ public VariantAlsoNegotiates() { * @param response The HTTP response to copy from. Must not be null. * @throws AssertionError If HTTP response status code does not match what was expected. */ - public VariantAlsoNegotiates(HttpResponse response) { + public VariantAlsoNegotiates(ClassicHttpResponse response) { super(response); assertStatusCode(response); } diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/BasicHeader_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/BasicHeader_Test.java index 499fc6622f..c188c4a28c 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/BasicHeader_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/BasicHeader_Test.java @@ -30,7 +30,7 @@ class BasicHeader_Test extends TestBase { - @Test void a01_ofPair() { + @Test void a01_ofPair() throws Exception { var x = stringHeader("Foo:bar"); assertEquals("Foo", x.getName()); assertEquals("bar", x.getValue()); @@ -50,26 +50,26 @@ class BasicHeader_Test extends TestBase { assertNull(stringHeader((String)null)); } - @Test void a02_of() { + @Test void a02_of() throws Exception { var x = header("Foo","bar"); assertString("Foo: bar", x); x = header("Foo",()->"bar"); assertString("Foo: bar", x); } - @Test void a05_assertions() { + @Test void a05_assertions() throws Exception { var x = header("X1","1"); x.assertName().is("X1").assertStringValue().is("1"); } - @Test void a07_eqIC() { + @Test void a07_eqIC() throws Exception { var x = header("X1","1"); assertTrue(x.equalsIgnoreCase("1")); assertFalse(x.equalsIgnoreCase("2")); assertFalse(x.equalsIgnoreCase(null)); } - @Test void a08_getElements() { + @Test void a08_getElements() throws Exception { var m = Holder.of(1); var h1 = header("X1","1"); var h2 = header("X2",()->m); @@ -95,7 +95,7 @@ class BasicHeader_Test extends TestBase { assertEquals(0, x.length); } - @Test void a09_equals() { + @Test void a09_equals() throws Exception { var h1 = header("Foo","bar"); var h2 = header("Foo","bar"); var h3 = header("Bar","bar"); @@ -133,7 +133,7 @@ class BasicHeader_Test extends TestBase { var elements1 = h3.getElements(); // Force computation of elements var cloned3 = h3.copy(); var elements2 = cloned3.getElements(); - + // Elements should be cloned (different array instances) assertNotSame(elements1, elements2); // But should have same content diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/BasicHttpResource_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/BasicHttpResource_Test.java index 182b9cdabd..762055c92d 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/BasicHttpResource_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/BasicHttpResource_Test.java @@ -109,8 +109,8 @@ class BasicHttpResource_Test extends TestBase { assertEquals(3L, readerResource(reader("foo")).setContentLength(3).getContentLength()); var x13 = stringResource("foo", contentType("text/plain")).setContentEncoding("identity"); - assertEquals("text/plain", x13.getContentType().getValue()); - assertEquals("identity", x13.getContentEncoding().getValue()); + assertEquals("text/plain", x13.getContentType()); + assertEquals("identity", x13.getContentEncoding()); var x14 = stringResource("foo", null).setContentEncoding((String)null); assertNull(x14.getContentType()); @@ -169,14 +169,14 @@ class BasicHttpResource_Test extends TestBase { @Test void a08_contentType_String() { var x1 = stringResource("foo").setContentType("text/plain"); - assertEquals("text/plain", x1.getContentType().getValue()); + assertEquals("text/plain", x1.getContentType()); var x2 = stringResource("foo").setContentType((String)null); assertNull(x2.getContentType()); } @Test void a09_contentEncoding_String() { var x1 = stringResource("foo").setContentEncoding("identity"); - assertEquals("identity", x1.getContentEncoding().getValue()); + assertEquals("identity", x1.getContentEncoding()); var x2 = stringResource("foo").setContentEncoding((String)null); assertNull(x2.getContentEncoding()); } diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/BasicPart_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/BasicPart_Test.java index a9c1ef6e4f..def25fbf86 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/BasicPart_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/BasicPart_Test.java @@ -25,9 +25,10 @@ import java.util.*; import java.util.function.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.apache.juneau.http.classic.part.*; import org.apache.juneau.marshall.marshaller.*; import org.junit.jupiter.api.*; @@ -67,7 +68,7 @@ class BasicPart_Test extends TestBase { var x3 = header("X3","3"); var x4 = serializedHeader("X4","4"); Map.Entry x5 = m("X5",(Object)"5").entrySet().iterator().next(); - org.apache.http.message.BasicNameValuePair x6 = new org.apache.http.message.BasicNameValuePair("X6","6"); + org.apache.hc.core5.http.message.BasicNameValuePair x6 = new org.apache.hc.core5.http.message.BasicNameValuePair("X6","6"); NameValuePairable x7 = () -> part("X7","7"); Headerable x8 = () -> header("X8","8"); @@ -151,7 +152,7 @@ void a07_equals() { assertNotEquals(x1, null); // Equal to a different NameValuePair impl with same name/value (cross-impl equality via the shared interface) - NameValuePair other = new org.apache.http.message.BasicNameValuePair("Foo","bar"); + NameValuePair other = new org.apache.hc.core5.http.message.BasicNameValuePair("Foo","bar"); assertEquals(x1, other); } diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/BasicStatusLine_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/BasicStatusLine_Test.java index a8cd198e29..ebaa919166 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/BasicStatusLine_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/BasicStatusLine_Test.java @@ -21,7 +21,7 @@ import java.lang.reflect.*; import java.util.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.*; import org.junit.jupiter.api.*; @@ -76,7 +76,7 @@ class BasicStatusLine_Test extends TestBase { @Test void a08_setReasonPhraseCatalog() { var sl = BasicStatusLine.create() .setStatusCode(200) - .setReasonPhraseCatalog(org.apache.http.impl.EnglishReasonPhraseCatalog.INSTANCE); + .setReasonPhraseCatalog(org.apache.hc.core5.http.impl.EnglishReasonPhraseCatalog.INSTANCE); // With a custom catalog, setReasonPhrase is null so it uses the catalog assertNotNull(sl.getReasonPhrase()); } @@ -208,7 +208,7 @@ class BasicStatusLine_Test extends TestBase { // Regression: constructing the snapshot must not route the freeze through the throwing modify(). var sl = BasicStatusLine.create(200, "OK") .setLocale(Locale.ENGLISH) - .setReasonPhraseCatalog(org.apache.http.impl.EnglishReasonPhraseCatalog.INSTANCE); + .setReasonPhraseCatalog(org.apache.hc.core5.http.impl.EnglishReasonPhraseCatalog.INSTANCE); assertDoesNotThrow(sl::unmodifiable); } } diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/HttpEntities_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/HttpEntities_Test.java index 1fa4a25e97..00455f7205 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/HttpEntities_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/HttpEntities_Test.java @@ -58,7 +58,7 @@ class HttpEntities_Test extends TestBase { @Test void a03_byteArrayEntity_bytes_withContentType() throws Exception { var e = byteArrayEntity(BYTES, CT_JSON); assertArrayEquals(BYTES, e.asBytes()); - assertEquals("application/json", e.getContentType().getValue()); + assertEquals("application/json", e.getContentType()); } @Test void a04_byteArrayEntity_bytes_withContentType_null() { @@ -81,7 +81,7 @@ class HttpEntities_Test extends TestBase { Supplier s = () -> BYTES; var e = byteArrayEntity(s, CT_JSON); assertArrayEquals(BYTES, e.asBytes()); - assertEquals("application/json", e.getContentType().getValue()); + assertEquals("application/json", e.getContentType()); } // ------------------------------------------------------------------------------------------------------------------ @@ -103,7 +103,7 @@ class HttpEntities_Test extends TestBase { @Test void b03_fileEntity_file_withContentType() { var f = new File("/tmp/nonexistent-juneau-test-file.txt"); var e = fileEntity(f, CT_JSON); - assertEquals("application/json", e.getContentType().getValue()); + assertEquals("application/json", e.getContentType()); } @Test void b04_fileEntity_file_withContentType_null() { @@ -130,7 +130,7 @@ class HttpEntities_Test extends TestBase { @Test void c03_readerEntity_reader_withContentType() throws Exception { var r = new StringReader("hello"); var e = readerEntity(r, CT_JSON); - assertEquals("application/json", e.getContentType().getValue()); + assertEquals("application/json", e.getContentType()); assertEquals("hello", e.asString()); } @@ -208,7 +208,7 @@ class HttpEntities_Test extends TestBase { var in = new ByteArrayInputStream(BYTES); var e = streamEntity(in, BYTES.length, CT_JSON); assertEquals(BYTES.length, e.getContentLength()); - assertEquals("application/json", e.getContentType().getValue()); + assertEquals("application/json", e.getContentType()); } @Test void e04_streamEntity_inputStream_unknownLength() { @@ -241,7 +241,7 @@ class HttpEntities_Test extends TestBase { @Test void f04_stringEntity_string_withContentType() throws Exception { var e = stringEntity("hello", CT_JSON); assertEquals("hello", e.asString()); - assertEquals("application/json", e.getContentType().getValue()); + assertEquals("application/json", e.getContentType()); } @Test void f05_stringEntity_string_withContentType_null() { @@ -264,7 +264,7 @@ class HttpEntities_Test extends TestBase { Supplier s = () -> "lazy"; var e = stringEntity(s, CT_JSON); assertEquals("lazy", e.asString()); - assertEquals("application/json", e.getContentType().getValue()); + assertEquals("application/json", e.getContentType()); } @Test void f09_stringEntity_supplier_withContentType_null() { diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/HttpHeaders_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/HttpHeaders_Test.java index 379fd2415a..c726417681 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/HttpHeaders_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/HttpHeaders_Test.java @@ -23,9 +23,10 @@ import java.util.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.apache.juneau.http.classic.part.*; import org.apache.juneau.marshall.marshaller.*; import org.junit.jupiter.api.*; @@ -38,7 +39,7 @@ class HttpHeaders_Test extends TestBase { var x3 = header("X3","3"); var x4 = serializedHeader("X4","4"); Map.Entry x5 = m("X5",(Object)"5").entrySet().iterator().next(); - org.apache.http.message.BasicNameValuePair x6 = new org.apache.http.message.BasicNameValuePair("X6","6"); + org.apache.hc.core5.http.message.BasicNameValuePair x6 = new org.apache.hc.core5.http.message.BasicNameValuePair("X6","6"); NameValuePairable x7 = () -> part("X7","7"); Headerable x8 = () -> header("X8","8"); SerializedPart x9 = serializedPart("X9",()->"9"); diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/HttpParts_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/HttpParts_Test.java index 1adbe180e8..cc7c293a08 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/HttpParts_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/HttpParts_Test.java @@ -25,11 +25,12 @@ import java.util.*; import java.util.function.*; -import org.apache.http.*; -import org.apache.http.message.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.message.*; import org.apache.juneau.*; import org.apache.juneau.commons.httppart.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.apache.juneau.http.classic.header.BasicHeader; import org.apache.juneau.http.classic.part.*; import org.apache.juneau.marshall.*; diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/HttpResources_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/HttpResources_Test.java index 9b4d37eac2..449752160a 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/HttpResources_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/HttpResources_Test.java @@ -56,7 +56,7 @@ class HttpResources_Test extends TestBase { @Test void a03_byteArrayResource_bytes_withContentType() throws Exception { var r = byteArrayResource(BYTES, CT_JSON); assertArrayEquals(BYTES, r.asBytes()); - assertEquals("application/json", r.getContentType().getValue()); + assertEquals("application/json", r.getContentType()); } @Test void a04_byteArrayResource_bytes_withContentType_null() { @@ -79,7 +79,7 @@ class HttpResources_Test extends TestBase { Supplier s = () -> BYTES; var r = byteArrayResource(s, CT_JSON); assertArrayEquals(BYTES, r.asBytes()); - assertEquals("application/json", r.getContentType().getValue()); + assertEquals("application/json", r.getContentType()); } @Test void a08_byteArrayResource_supplier_withContentType_null() { @@ -107,7 +107,7 @@ class HttpResources_Test extends TestBase { @Test void b03_fileResource_file_withContentType() { var f = new File("/tmp/nonexistent-juneau-test-file.txt"); var r = fileResource(f, CT_JSON); - assertEquals("application/json", r.getContentType().getValue()); + assertEquals("application/json", r.getContentType()); } @Test void b04_fileResource_file_withContentType_null() { @@ -134,7 +134,7 @@ class HttpResources_Test extends TestBase { @Test void c03_readerResource_reader_withContentType() throws Exception { var rd = new StringReader("hello"); var r = readerResource(rd, CT_JSON); - assertEquals("application/json", r.getContentType().getValue()); + assertEquals("application/json", r.getContentType()); assertEquals("hello", r.asString()); } @@ -162,7 +162,7 @@ class HttpResources_Test extends TestBase { var in = new ByteArrayInputStream(BYTES); var r = streamResource(in, BYTES.length, CT_JSON); assertEquals(BYTES.length, r.getContentLength()); - assertEquals("application/json", r.getContentType().getValue()); + assertEquals("application/json", r.getContentType()); } @Test void d04_streamResource_inputStream_unknownLength_nullCT() { @@ -195,7 +195,7 @@ class HttpResources_Test extends TestBase { @Test void e04_stringResource_string_withContentType() throws Exception { var r = stringResource("hello", CT_JSON); assertEquals("hello", r.asString()); - assertEquals("application/json", r.getContentType().getValue()); + assertEquals("application/json", r.getContentType()); } @Test void e05_stringResource_string_withContentType_null() { @@ -218,7 +218,7 @@ class HttpResources_Test extends TestBase { Supplier s = () -> "lazy"; var r = stringResource(s, CT_JSON); assertEquals("lazy", r.asString()); - assertEquals("application/json", r.getContentType().getValue()); + assertEquals("application/json", r.getContentType()); } @Test void e09_stringResource_supplier_withContentType_null() { diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/BasicHttpEntity_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/BasicHttpEntity_Test.java index 55bfe7d46b..29faa0fdee 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/BasicHttpEntity_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/BasicHttpEntity_Test.java @@ -97,7 +97,7 @@ else if (t == boolean.class) var u = x.unmodifiable(); x.setContent("changed".getBytes()).setContentType("text/html").setChunked(true); assertArrayEquals(BYTES, u.asBytes()); - assertEquals("text/plain", u.getContentType().getValue()); + assertEquals("text/plain", u.getContentType()); assertFalse(u.isChunked()); } diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/ByteArrayEntity_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/ByteArrayEntity_Test.java index 3f23aedb02..6a69dc3964 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/ByteArrayEntity_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/ByteArrayEntity_Test.java @@ -38,7 +38,7 @@ class ByteArrayEntity_Test extends TestBase { @Test void a02_constructor_contentType() throws Exception { var x = new ByteArrayEntity(ContentType.TEXT_PLAIN, BYTES); assertArrayEquals(BYTES, x.asBytes()); - assertEquals("text/plain", x.getContentType().getValue()); + assertEquals("text/plain", x.getContentType()); } @Test void a03_getContent() throws Exception { diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/FileEntity_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/FileEntity_Test.java index b0b546eed1..e2b06f97c1 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/FileEntity_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/FileEntity_Test.java @@ -49,7 +49,7 @@ static void setupTempFile() throws Exception { @Test void a02_constructor_contentType() throws Exception { var x = new FileEntity(ContentType.TEXT_PLAIN, tempFile); assertEquals("hello world", x.asString()); - assertEquals("text/plain", x.getContentType().getValue()); + assertEquals("text/plain", x.getContentType()); } @Test void a03_asBytes_uncached() throws Exception { @@ -124,7 +124,7 @@ static void setupTempFile() throws Exception { var copy = x.copy(); assertNotSame(x, copy); assertEquals("hello world", copy.asString()); - assertEquals("text/plain", copy.getContentType().getValue()); + assertEquals("text/plain", copy.getContentType()); } @Test void a14_setChunked() { @@ -141,7 +141,7 @@ static void setupTempFile() throws Exception { @Test void a16_setContentType_string() { var x = new FileEntity().setContent(tempFile).setContentType("text/plain"); - assertEquals("text/plain", x.getContentType().getValue()); + assertEquals("text/plain", x.getContentType()); } @Test void a17_setCharset() throws Exception { @@ -158,12 +158,12 @@ static void setupTempFile() throws Exception { @Test void a19_setContentEncoding_string() { var x = new FileEntity().setContent(tempFile).setContentEncoding("gzip"); - assertEquals("gzip", x.getContentEncoding().getValue()); + assertEquals("gzip", x.getContentEncoding()); } @Test void a20_setContentEncoding_object() { var x = new FileEntity().setContent(tempFile).setContentEncoding(ContentEncoding.of("identity")); - assertEquals("identity", x.getContentEncoding().getValue()); + assertEquals("identity", x.getContentEncoding()); } @Test void a21_setContentLength() { @@ -174,7 +174,7 @@ static void setupTempFile() throws Exception { @Test void a22_setContentType_object() { var x = new FileEntity().setContent(tempFile).setContentType(ContentType.TEXT_HTML); - assertEquals("text/html", x.getContentType().getValue()); + assertEquals("text/html", x.getContentType()); } @Test void a23_unmodifiable() { diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/ReaderEntity_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/ReaderEntity_Test.java index c747b2e168..fa57acfef3 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/ReaderEntity_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/ReaderEntity_Test.java @@ -43,7 +43,7 @@ private static Reader reader() { @Test void a02_constructor_contentType() throws Exception { var x = new ReaderEntity(ContentType.TEXT_PLAIN, reader()); assertEquals("hello world", x.asString()); - assertEquals("text/plain", x.getContentType().getValue()); + assertEquals("text/plain", x.getContentType()); } @Test void a03_asBytes_uncached() throws Exception { @@ -139,7 +139,7 @@ private static Reader reader() { var copy = x.copy(); assertNotSame(x, copy); assertEquals("hello world", copy.asString()); - assertEquals("text/plain", copy.getContentType().getValue()); + assertEquals("text/plain", copy.getContentType()); } @Test void a18_setChunked() { @@ -156,7 +156,7 @@ private static Reader reader() { @Test void a20_setContentType_string() { var x = new ReaderEntity().setContent(reader()).setContentType("text/plain"); - assertEquals("text/plain", x.getContentType().getValue()); + assertEquals("text/plain", x.getContentType()); } @Test void a21_setCharset() throws Exception { @@ -173,12 +173,12 @@ private static Reader reader() { @Test void a23_setContentEncoding_string() { var x = new ReaderEntity().setContent(reader()).setContentEncoding("gzip"); - assertEquals("gzip", x.getContentEncoding().getValue()); + assertEquals("gzip", x.getContentEncoding()); } @Test void a24_setContentEncoding_object() { var x = new ReaderEntity().setContent(reader()).setContentEncoding(ContentEncoding.of("identity")); - assertEquals("identity", x.getContentEncoding().getValue()); + assertEquals("identity", x.getContentEncoding()); } @Test void a25_setContentLength() { @@ -188,7 +188,7 @@ private static Reader reader() { @Test void a26_setContentType_object() { var x = new ReaderEntity().setContent(reader()).setContentType(ContentType.TEXT_HTML); - assertEquals("text/html", x.getContentType().getValue()); + assertEquals("text/html", x.getContentType()); } @Test void a27_unmodifiable() { diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/SerializedEntity_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/SerializedEntity_Test.java index b06cbbc6cb..fd253241b9 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/SerializedEntity_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/SerializedEntity_Test.java @@ -43,7 +43,7 @@ class SerializedEntity_Test extends TestBase { @Test void a03_constructor_full() throws Exception { var x = new SerializedEntity(ContentType.APPLICATION_JSON, "hello", JsonSerializer.DEFAULT, null); assertEquals("\"hello\"", x.asString()); - assertEquals("application/json", x.getContentType().getValue()); + assertEquals("application/json", x.getContentType()); } @Test void a04_copy() throws Exception { @@ -88,7 +88,7 @@ class SerializedEntity_Test extends TestBase { @Test void a10_getContentType_explicit() { var x = serializedEntity("hello", JsonSerializer.DEFAULT).setContentType("text/plain"); - assertEquals("text/plain", x.getContentType().getValue()); + assertEquals("text/plain", x.getContentType()); } @Test void a11_isRepeatable() { @@ -134,12 +134,12 @@ class SerializedEntity_Test extends TestBase { @Test void a18_setContentEncoding_string() { var x = serializedEntity("hello", null).setContentEncoding("gzip"); - assertEquals("gzip", x.getContentEncoding().getValue()); + assertEquals("gzip", x.getContentEncoding()); } @Test void a19_setContentEncoding_object() { var x = serializedEntity("hello", null).setContentEncoding(ContentEncoding.of("identity")); - assertEquals("identity", x.getContentEncoding().getValue()); + assertEquals("identity", x.getContentEncoding()); } @Test void a20_setContentLength() { @@ -150,12 +150,12 @@ class SerializedEntity_Test extends TestBase { @Test void a21_setContentType_string() { var x = serializedEntity("hello", null).setContentType("text/plain"); - assertEquals("text/plain", x.getContentType().getValue()); + assertEquals("text/plain", x.getContentType()); } @Test void a22_setContentType_object() { var x = serializedEntity("hello", null).setContentType(ContentType.TEXT_HTML); - assertEquals("text/html", x.getContentType().getValue()); + assertEquals("text/html", x.getContentType()); } @Test void a23_setMaxLength() { diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/StreamEntity_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/StreamEntity_Test.java index cb4b389e66..0161a0c736 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/StreamEntity_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/StreamEntity_Test.java @@ -45,7 +45,7 @@ private static InputStream stream() { @Test void a02_constructor_contentType() throws Exception { var x = new StreamEntity(ContentType.TEXT_PLAIN, stream()); assertEquals("hello world", x.asString()); - assertEquals("text/plain", x.getContentType().getValue()); + assertEquals("text/plain", x.getContentType()); } @Test void a03_asBytes_uncached() throws Exception { @@ -140,7 +140,7 @@ private static InputStream stream() { var copy = x.copy(); assertNotSame(x, copy); assertEquals("hello world", copy.asString()); - assertEquals("text/plain", copy.getContentType().getValue()); + assertEquals("text/plain", copy.getContentType()); } @Test void a18_setChunked() { @@ -157,7 +157,7 @@ private static InputStream stream() { @Test void a20_setContentType_string() { var x = new StreamEntity().setContent(stream()).setContentType("text/plain"); - assertEquals("text/plain", x.getContentType().getValue()); + assertEquals("text/plain", x.getContentType()); } @Test void a21_setCharset() throws Exception { @@ -174,12 +174,12 @@ private static InputStream stream() { @Test void a23_setContentEncoding_string() { var x = new StreamEntity().setContent(stream()).setContentEncoding("gzip"); - assertEquals("gzip", x.getContentEncoding().getValue()); + assertEquals("gzip", x.getContentEncoding()); } @Test void a24_setContentEncoding_object() { var x = new StreamEntity().setContent(stream()).setContentEncoding(ContentEncoding.of("identity")); - assertEquals("identity", x.getContentEncoding().getValue()); + assertEquals("identity", x.getContentEncoding()); } @Test void a25_setContentLength() { @@ -189,7 +189,7 @@ private static InputStream stream() { @Test void a26_setContentType_object() { var x = new StreamEntity().setContent(stream()).setContentType(ContentType.TEXT_HTML); - assertEquals("text/html", x.getContentType().getValue()); + assertEquals("text/html", x.getContentType()); } @Test void a27_unmodifiable() { diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/StringEntity_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/StringEntity_Test.java index cbbe94a54d..47a528a9a6 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/StringEntity_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/entity/StringEntity_Test.java @@ -45,7 +45,7 @@ class StringEntity_Test extends TestBase { @Test void a02_ctor_contentTypeAndContent() throws Exception { var x = new StringEntity(ContentType.of("text/plain"), "foo"); assertEquals("foo", x.asString()); - assertEquals("text/plain", x.getContentType().getValue()); + assertEquals("text/plain", x.getContentType()); } @Test void a03_ctor_nullContent_treatedAsEmpty() throws Exception { diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/header/BasicHeaderIterator_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/header/BasicHeaderIterator_Test.java index 04a1ebb1ba..97f7946dc0 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/header/BasicHeaderIterator_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/header/BasicHeaderIterator_Test.java @@ -20,7 +20,7 @@ import java.util.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.*; import org.junit.jupiter.api.*; @@ -50,7 +50,7 @@ private static Header h(String name, String value) { var it = new BasicHeaderIterator(headers, null, false); var names = new ArrayList(); while (it.hasNext()) - names.add(it.nextHeader().getName()); + names.add(it.next().getName()); assertEquals(List.of("A", "B", "A"), names); } @@ -63,7 +63,7 @@ private static Header h(String name, String value) { Header[] headers = {h("Foo", "1"), h("foo", "2"), h("Bar", "3")}; var it = new BasicHeaderIterator(headers, "Foo", true); assertTrue(it.hasNext()); - assertEquals("1", it.nextHeader().getValue()); + assertEquals("1", it.next().getValue()); assertFalse(it.hasNext()); } @@ -71,9 +71,9 @@ private static Header h(String name, String value) { Header[] headers = {h("Foo", "1"), h("foo", "2"), h("Bar", "3")}; var it = new BasicHeaderIterator(headers, "Foo", false); assertTrue(it.hasNext()); - assertEquals("1", it.nextHeader().getValue()); + assertEquals("1", it.next().getValue()); assertTrue(it.hasNext()); - assertEquals("2", it.nextHeader().getValue()); + assertEquals("2", it.next().getValue()); assertFalse(it.hasNext()); } @@ -96,8 +96,8 @@ private static Header h(String name, String value) { @Test void c02_nextHeader_exhausted_throws() { Header[] headers = {h("A", "1")}; var it = new BasicHeaderIterator(headers, null, false); - it.nextHeader(); - assertThrows(NoSuchElementException.class, it::nextHeader); + it.next(); + assertThrows(NoSuchElementException.class, it::next); } @Test void c03_empty_hasNextFalse() { diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/header/BasicHeader_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/header/BasicHeader_Test.java index 30c946b62d..fa3de6ee88 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/header/BasicHeader_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/header/BasicHeader_Test.java @@ -21,7 +21,7 @@ import java.util.*; import java.util.function.*; -import org.apache.http.message.*; +import org.apache.hc.core5.http.message.*; import org.apache.juneau.*; import org.junit.jupiter.api.*; @@ -38,24 +38,24 @@ class BasicHeader_Test extends TestBase { // Constructors / factories //------------------------------------------------------------------------------------------------------------------ - @Test void a01_ctor_nameAndValue() { + @Test void a01_ctor_nameAndValue() throws Exception { var h = new BasicHeader("Foo", "bar"); assertEquals("Foo", h.getName()); assertEquals("bar", h.getValue()); } - @Test void a02_ctor_nonStringValue_convertsViaToString() { + @Test void a02_ctor_nonStringValue_convertsViaToString() throws Exception { var h = new BasicHeader("Foo", 123); assertEquals("123", h.getValue()); } - @Test void a03_ctor_nullValue() { + @Test void a03_ctor_nullValue() throws Exception { var h = new BasicHeader("Foo", (Object)null); assertNull(h.getValue()); assertTrue(h.asString().isEmpty()); } - @Test void a04_ctor_supplierValue_delaysEvaluation() { + @Test void a04_ctor_supplierValue_delaysEvaluation() throws Exception { var calls = new int[1]; var h = new BasicHeader("Foo", () -> { calls[0]++; return "bar"; }); assertEquals(0, calls[0]); @@ -63,31 +63,31 @@ class BasicHeader_Test extends TestBase { assertEquals(1, calls[0]); } - @Test void a05_ctor_nameNull_throws() { + @Test void a05_ctor_nameNull_throws() throws Exception { assertThrows(IllegalArgumentException.class, () -> new BasicHeader(null, "bar")); } - @Test void a06_ctor_nameEmpty_throws() { + @Test void a06_ctor_nameEmpty_throws() throws Exception { assertThrows(IllegalArgumentException.class, () -> new BasicHeader("", "bar")); } - @Test void a07_of_nameValuePair() { + @Test void a07_of_nameValuePair() throws Exception { var h = BasicHeader.of(new BasicNameValuePair("Foo", "bar")); assertEquals("Foo", h.getName()); assertEquals("bar", h.getValue()); } - @Test void a08_of_nameAndValue() { + @Test void a08_of_nameAndValue() throws Exception { var h = BasicHeader.of("Foo", "bar"); assertEquals("Foo", h.getName()); assertEquals("bar", h.getValue()); } - @Test void a09_of_nameAndValue_null_returnsNull() { + @Test void a09_of_nameAndValue_null_returnsNull() throws Exception { assertNull(BasicHeader.of("Foo", null)); } - @Test void a10_copy() { + @Test void a10_copy() throws Exception { var h = new BasicHeader("Foo", "bar"); var h2 = h.copy(); assertNotSame(h, h2); @@ -106,26 +106,26 @@ class BasicHeader_Test extends TestBase { // equals() / hashCode() //------------------------------------------------------------------------------------------------------------------ - @Test void b01_equals_sameNameAndValue_isEqual() { + @Test void b01_equals_sameNameAndValue_isEqual() throws Exception { var a = new BasicHeader("Foo", "bar"); var b = new BasicHeader("Foo", "bar"); assertEquals(a, b); assertEquals(a.hashCode(), b.hashCode()); } - @Test void b02_equals_differentName_notEqual() { + @Test void b02_equals_differentName_notEqual() throws Exception { var a = new BasicHeader("Foo", "bar"); var b = new BasicHeader("Baz", "bar"); assertNotEquals(a, b); } - @Test void b03_equals_differentValue_notEqual() { + @Test void b03_equals_differentValue_notEqual() throws Exception { var a = new BasicHeader("Foo", "bar"); var b = new BasicHeader("Foo", "baz"); assertNotEquals(a, b); } - @Test void b04_equals_null_returnsFalse() { + @Test void b04_equals_null_returnsFalse() throws Exception { var a = new BasicHeader("Foo", "bar"); assertFalse(a.equals(null)); } @@ -133,21 +133,21 @@ class BasicHeader_Test extends TestBase { @SuppressWarnings({ "unlikely-arg-type" // Intentionally comparing to a mismatched type to cover the equals() type-guard branch. }) - @Test void b05_equals_notAHeader_returnsFalse() { + @Test void b05_equals_notAHeader_returnsFalse() throws Exception { var a = new BasicHeader("Foo", "bar"); assertFalse(a.equals("not a header")); } - @Test void b06_equals_reflexive() { + @Test void b06_equals_reflexive() throws Exception { var a = new BasicHeader("Foo", "bar"); assertEquals(a, a); } - @Test void b07_equals_crossImplementation_otherHeaderType() { + @Test void b07_equals_crossImplementation_otherHeaderType() throws Exception { // equals() gates on the Header *interface*, not this concrete class, so any Header impl with the same // name+value compares equal. var a = new BasicHeader("Foo", "bar"); - var b = new org.apache.http.message.BasicHeader("Foo", "bar"); + var b = new org.apache.hc.core5.http.message.BasicHeader("Foo", "bar"); assertEquals(a, b); } @@ -155,12 +155,12 @@ class BasicHeader_Test extends TestBase { // equalsIgnoreCase() //------------------------------------------------------------------------------------------------------------------ - @Test void c01_equalsIgnoreCase_match() { + @Test void c01_equalsIgnoreCase_match() throws Exception { var h = new BasicHeader("Foo", "BAR"); assertTrue(h.equalsIgnoreCase("bar")); } - @Test void c02_equalsIgnoreCase_noMatch() { + @Test void c02_equalsIgnoreCase_noMatch() throws Exception { var h = new BasicHeader("Foo", "bar"); assertFalse(h.equalsIgnoreCase("baz")); } @@ -169,41 +169,41 @@ class BasicHeader_Test extends TestBase { // get() / isPresent() / isNotEmpty() / orElse() / asString() //------------------------------------------------------------------------------------------------------------------ - @Test void d01_get_present() { + @Test void d01_get_present() throws Exception { var h = new BasicHeader("Foo", "bar"); assertEquals("bar", h.get()); } - @Test void d02_get_absent_throws() { + @Test void d02_get_absent_throws() throws Exception { var h = new BasicHeader("Foo", (Object)null); assertThrows(NoSuchElementException.class, h::get); } - @Test void d03_isPresent_true() { + @Test void d03_isPresent_true() throws Exception { assertTrue(new BasicHeader("Foo", "bar").isPresent()); } - @Test void d04_isPresent_false() { + @Test void d04_isPresent_false() throws Exception { assertFalse(new BasicHeader("Foo", (Object)null).isPresent()); } - @Test void d05_isNotEmpty_true() { + @Test void d05_isNotEmpty_true() throws Exception { assertTrue(new BasicHeader("Foo", "bar").isNotEmpty()); } - @Test void d06_isNotEmpty_false_whenAbsent() { + @Test void d06_isNotEmpty_false_whenAbsent() throws Exception { assertFalse(new BasicHeader("Foo", (Object)null).isNotEmpty()); } - @Test void d07_isNotEmpty_false_whenEmptyString() { + @Test void d07_isNotEmpty_false_whenEmptyString() throws Exception { assertFalse(new BasicHeader("Foo", "").isNotEmpty()); } - @Test void d08_orElse_present() { + @Test void d08_orElse_present() throws Exception { assertEquals("bar", new BasicHeader("Foo", "bar").orElse("default")); } - @Test void d09_orElse_absent() { + @Test void d09_orElse_absent() throws Exception { assertEquals("default", new BasicHeader("Foo", (Object)null).orElse("default")); } @@ -237,15 +237,15 @@ class BasicHeader_Test extends TestBase { // assertions / toString //------------------------------------------------------------------------------------------------------------------ - @Test void f01_assertName() { + @Test void f01_assertName() throws Exception { new BasicHeader("Foo", "bar").assertName().is("Foo"); } - @Test void f02_assertStringValue() { + @Test void f02_assertStringValue() throws Exception { new BasicHeader("Foo", "bar").assertStringValue().is("bar"); } - @Test void f03_toString() { + @Test void f03_toString() throws Exception { assertEquals("Foo: bar", new BasicHeader("Foo", "bar").toString()); } } diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/header/HeaderList_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/header/HeaderList_Test.java index dfcf4e52d2..a4dc458742 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/header/HeaderList_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/header/HeaderList_Test.java @@ -24,7 +24,7 @@ import java.util.*; import java.util.concurrent.atomic.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.*; import org.apache.juneau.marshall.httppart.*; import org.apache.juneau.marshall.oapi.*; @@ -379,27 +379,27 @@ public Foo(String value) { var x = HeaderList.of(Accept.TEXT_XML,ContentType.TEXT_XML); var i1 = x.headerIterator(); - assertString("Accept: text/xml", i1.nextHeader()); - assertString("Content-Type: text/xml", i1.nextHeader()); - assertThrowsWithMessage(NoSuchElementException.class, "Iteration already finished.", i1::nextHeader); + assertString("Accept: text/xml", i1.next()); + assertString("Content-Type: text/xml", i1.next()); + assertThrowsWithMessage(NoSuchElementException.class, "Iteration already finished.", i1::next); var i2 = x.headerIterator(); assertString("Accept: text/xml", i2.next()); - assertString("Content-Type: text/xml", i2.nextHeader()); + assertString("Content-Type: text/xml", i2.next()); assertThrowsWithMessage(NoSuchElementException.class, "Iteration already finished.", i2::next); var i3 = x.headerIterator("accept"); - assertString("Accept: text/xml", i3.nextHeader()); - assertThrowsWithMessage(NoSuchElementException.class, "Iteration already finished.", i3::nextHeader); + assertString("Accept: text/xml", i3.next()); + assertThrowsWithMessage(NoSuchElementException.class, "Iteration already finished.", i3::next); var x2 = HeaderList.create().append(Accept.TEXT_XML,ContentType.TEXT_XML).caseSensitive(true); var i4 = x2.headerIterator("Accept"); - assertString("Accept: text/xml", i4.nextHeader()); - assertThrowsWithMessage(NoSuchElementException.class, "Iteration already finished.", i4::nextHeader); + assertString("Accept: text/xml", i4.next()); + assertThrowsWithMessage(NoSuchElementException.class, "Iteration already finished.", i4::next); var i5 = x2.headerIterator("accept"); - assertThrowsWithMessage(NoSuchElementException.class, "Iteration already finished.", i5::nextHeader); + assertThrowsWithMessage(NoSuchElementException.class, "Iteration already finished.", i5::next); assertThrowsWithMessage(UnsupportedOperationException.class, "Not supported.", i5::remove); } diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/part/BasicPartIterator_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/part/BasicPartIterator_Test.java index 27d6667f2c..9c6d13f950 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/part/BasicPartIterator_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/part/BasicPartIterator_Test.java @@ -20,7 +20,7 @@ import java.util.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.*; import org.junit.jupiter.api.*; diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/part/PartList_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/part/PartList_Test.java index bfac795346..ebf5a68e60 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/part/PartList_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/part/PartList_Test.java @@ -24,7 +24,7 @@ import java.util.*; import java.util.concurrent.atomic.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.*; import org.apache.juneau.commons.httppart.*; import org.apache.juneau.http.*; diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/BasicResource_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/BasicResource_Test.java index 458fe7e1a7..1bf47d8588 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/BasicResource_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/BasicResource_Test.java @@ -22,10 +22,11 @@ import java.io.*; -import org.apache.http.*; -import org.apache.http.message.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.core5.http.message.*; import org.apache.juneau.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.junit.jupiter.api.*; // Closeable resources in tests are intentionally unassigned; closing is handled by test infrastructure. @@ -41,7 +42,7 @@ class BasicResource_Test extends TestBase { @Test void a01_constructor_entity() throws Exception { var x = new StringResource(contentType("text/plain"), "foo"); assertEquals("foo", toUtf8(x.getContent())); - assertEquals("text/plain", x.getContentType().getValue()); + assertEquals("text/plain", x.getContentType()); assertNotNull(x.getEntity()); assertSame(x.getEntity(), x.getEntity()); } @@ -52,13 +53,13 @@ class BasicResource_Test extends TestBase { var x = new StringResource(src); assertNotSame(src, x); assertEquals("foo", toUtf8(x.getContent())); - assertEquals("text/plain", x.getContentType().getValue()); + assertEquals("text/plain", x.getContentType()); assertEquals("bar", x.getHeaders().getFirst("Foo").get().getValue()); } @Test void a03_constructor_httpResponse() throws Exception { - var resp = new BasicHttpResponse(new ProtocolVersion("HTTP", 1, 1), 200, "OK"); - resp.setEntity(new org.apache.http.entity.StringEntity("hello")); + var resp = new org.apache.hc.core5.http.message.BasicClassicHttpResponse(200, "OK"); + resp.setEntity(new org.apache.hc.core5.http.io.entity.StringEntity("hello")); resp.addHeader("X-Foo", "bar"); resp.addHeader("Content-Type", "text/plain"); resp.addHeader("Content-Encoding", "identity"); @@ -66,8 +67,8 @@ class BasicResource_Test extends TestBase { var x = new StreamResource(resp); assertEquals("hello", toUtf8(x.getContent())); assertEquals("bar", x.getHeaders().getFirst("X-Foo").get().getValue()); - assertEquals("text/plain", x.getContentType().getValue()); - assertEquals("identity", x.getContentEncoding().getValue()); + assertEquals("text/plain", x.getContentType()); + assertEquals("identity", x.getContentEncoding()); assertEquals(5L, x.getContentLength()); } @@ -103,10 +104,10 @@ class BasicResource_Test extends TestBase { header("Content-Length", "3"), header("X-Foo", "bar"), null, // null header skipped - new org.apache.http.message.BasicHeader("", "ignored") // empty-name header skipped + new org.apache.hc.core5.http.message.BasicHeader("", "ignored") // empty-name header skipped ); - assertEquals("text/plain", x.getContentType().getValue()); - assertEquals("identity", x.getContentEncoding().getValue()); + assertEquals("text/plain", x.getContentType()); + assertEquals("identity", x.getContentEncoding()); assertEquals(3L, x.getContentLength()); assertEquals("bar", x.getHeaders().getFirst("X-Foo").get().getValue()); } @@ -119,10 +120,10 @@ class BasicResource_Test extends TestBase { header("Content-Length", "3"), header("X-Foo", "bar"), null, // null header skipped - new org.apache.http.message.BasicHeader("", "ignored") // empty-name header skipped + new org.apache.hc.core5.http.message.BasicHeader("", "ignored") // empty-name header skipped ); - assertEquals("text/plain", x.getContentType().getValue()); - assertEquals("identity", x.getContentEncoding().getValue()); + assertEquals("text/plain", x.getContentType()); + assertEquals("identity", x.getContentEncoding()); assertEquals(3L, x.getContentLength()); assertEquals("bar", x.getHeaders().getFirst("X-Foo").get().getValue()); } @@ -153,21 +154,21 @@ class BasicResource_Test extends TestBase { @Test void c03_setContentType_string_andContentType() { var x = new StringResource(null, "foo") .setContentType("text/plain"); - assertEquals("text/plain", x.getContentType().getValue()); + assertEquals("text/plain", x.getContentType()); var x2 = new StringResource(null, "foo") .setContentType(contentType("text/html")); - assertEquals("text/html", x2.getContentType().getValue()); + assertEquals("text/html", x2.getContentType()); } @Test void c04_setContentEncoding_string_andContentEncoding() { var x = new StringResource(null, "foo") .setContentEncoding("identity"); - assertEquals("identity", x.getContentEncoding().getValue()); + assertEquals("identity", x.getContentEncoding()); var x2 = new StringResource(null, "foo") .setContentEncoding(contentEncoding("gzip")); - assertEquals("gzip", x2.getContentEncoding().getValue()); + assertEquals("gzip", x2.getContentEncoding()); } @Test void c05_setContentLength() { @@ -213,7 +214,7 @@ class BasicResource_Test extends TestBase { var x2 = x.copy(); assertNotSame(x, x2); assertEquals("foo", toUtf8(x2.getContent())); - assertEquals("text/plain", x2.getContentType().getValue()); + assertEquals("text/plain", x2.getContentType()); assertEquals("bar", x2.getHeaders().getFirst("Foo").get().getValue()); } @@ -227,7 +228,7 @@ class BasicResource_Test extends TestBase { @Test void d06_consumeContent() { var x = new StringResource(null, "foo"); // consumeContent() is a no-op that must complete without throwing. - assertDoesNotThrow(x::consumeContent); + assertDoesNotThrow(x::close); } //------------------------------------------------------------------------------------------------------------------ diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/ByteArrayResource_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/ByteArrayResource_Test.java index 53b72de475..dbf76b506e 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/ByteArrayResource_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/ByteArrayResource_Test.java @@ -20,9 +20,10 @@ import static org.apache.juneau.http.classic.HttpHeaders.*; import static org.junit.jupiter.api.Assertions.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.junit.jupiter.api.*; // Closeable resources in tests are intentionally unassigned; closing is handled by test infrastructure. @@ -39,7 +40,7 @@ class ByteArrayResource_Test extends TestBase { var x2 = new ByteArrayResource(contentType("text/plain"), "foo".getBytes()); assertEquals("foo", toUtf8(x2.getContent())); - assertEquals("text/plain", x2.getContentType().getValue()); + assertEquals("text/plain", x2.getContentType()); assertTrue(x2.isRepeatable()); assertFalse(x2.isStreaming()); } @@ -66,21 +67,21 @@ class ByteArrayResource_Test extends TestBase { @Test void a04_contentType() { var x = new ByteArrayResource(null, "foo".getBytes()) .setContentType("text/plain"); - assertEquals("text/plain", x.getContentType().getValue()); + assertEquals("text/plain", x.getContentType()); var x2 = new ByteArrayResource(null, "foo".getBytes()) .setContentType(contentType("text/html")); - assertEquals("text/html", x2.getContentType().getValue()); + assertEquals("text/html", x2.getContentType()); } @Test void a05_contentEncoding() { var x = new ByteArrayResource(null, "foo".getBytes()) .setContentEncoding("identity"); - assertEquals("identity", x.getContentEncoding().getValue()); + assertEquals("identity", x.getContentEncoding()); var x2 = new ByteArrayResource(null, "foo".getBytes()) .setContentEncoding(contentEncoding("gzip")); - assertEquals("gzip", x2.getContentEncoding().getValue()); + assertEquals("gzip", x2.getContentEncoding()); } @Test void a06_chunked() { @@ -124,7 +125,7 @@ class ByteArrayResource_Test extends TestBase { ByteArrayResource x2 = x.copy(); assertNotSame(x, x2); assertEquals("foo", toUtf8(x2.getContent())); - assertEquals("text/plain", x2.getContentType().getValue()); + assertEquals("text/plain", x2.getContentType()); assertEquals("bar", x2.getHeaders().getFirst("Foo").get().getValue()); } diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/FileResource_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/FileResource_Test.java index 0397edb84c..7f6cabb776 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/FileResource_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/FileResource_Test.java @@ -23,9 +23,10 @@ import java.io.*; import java.nio.file.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.junit.jupiter.api.*; // Closeable resources in tests are intentionally unassigned; closing is handled by test infrastructure. @@ -45,7 +46,7 @@ class FileResource_Test extends TestBase { var x2 = new FileResource(contentType("text/plain"), f); assertEquals("foo", toUtf8(x2.getContent())); - assertEquals("text/plain", x2.getContentType().getValue()); + assertEquals("text/plain", x2.getContentType()); assertTrue(x2.isRepeatable()); assertFalse(x2.isStreaming()); @@ -85,11 +86,11 @@ class FileResource_Test extends TestBase { var x = new FileResource(null, f) .setContentType("text/plain"); - assertEquals("text/plain", x.getContentType().getValue()); + assertEquals("text/plain", x.getContentType()); var x2 = new FileResource(null, f) .setContentType(contentType("text/html")); - assertEquals("text/html", x2.getContentType().getValue()); + assertEquals("text/html", x2.getContentType()); f.delete(); } @@ -99,11 +100,11 @@ class FileResource_Test extends TestBase { var x = new FileResource(null, f) .setContentEncoding("identity"); - assertEquals("identity", x.getContentEncoding().getValue()); + assertEquals("identity", x.getContentEncoding()); var x2 = new FileResource(null, f) .setContentEncoding(contentEncoding("gzip")); - assertEquals("gzip", x2.getContentEncoding().getValue()); + assertEquals("gzip", x2.getContentEncoding()); f.delete(); } @@ -159,7 +160,7 @@ class FileResource_Test extends TestBase { FileResource x2 = x.copy(); assertNotSame(x, x2); assertEquals("foo", toUtf8(x2.getContent())); - assertEquals("text/plain", x2.getContentType().getValue()); + assertEquals("text/plain", x2.getContentType()); assertEquals("bar", x2.getHeaders().getFirst("Foo").get().getValue()); f.delete(); diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/ReaderResource_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/ReaderResource_Test.java index c0075d61e9..79681720da 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/ReaderResource_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/ReaderResource_Test.java @@ -21,9 +21,10 @@ import static org.apache.juneau.http.classic.HttpHeaders.*; import static org.junit.jupiter.api.Assertions.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.junit.jupiter.api.*; // Closeable resources in tests are intentionally unassigned; closing is handled by test infrastructure. @@ -35,7 +36,7 @@ class ReaderResource_Test extends TestBase { @Test void a01_basic() throws Exception { var x = new ReaderResource(contentType("text/plain"), reader("foo")); assertEquals("foo", toUtf8(x.getContent())); - assertEquals("text/plain", x.getContentType().getValue()); + assertEquals("text/plain", x.getContentType()); assertFalse(x.isRepeatable()); assertTrue(x.isStreaming()); } @@ -62,21 +63,21 @@ class ReaderResource_Test extends TestBase { @Test void a04_contentType() { var x = new ReaderResource(null, reader("foo")) .setContentType("text/plain"); - assertEquals("text/plain", x.getContentType().getValue()); + assertEquals("text/plain", x.getContentType()); var x2 = new ReaderResource(null, reader("foo")) .setContentType(contentType("text/html")); - assertEquals("text/html", x2.getContentType().getValue()); + assertEquals("text/html", x2.getContentType()); } @Test void a05_contentEncoding() { var x = new ReaderResource(null, reader("foo")) .setContentEncoding("identity"); - assertEquals("identity", x.getContentEncoding().getValue()); + assertEquals("identity", x.getContentEncoding()); var x2 = new ReaderResource(null, reader("foo")) .setContentEncoding(contentEncoding("gzip")); - assertEquals("gzip", x2.getContentEncoding().getValue()); + assertEquals("gzip", x2.getContentEncoding()); } @Test void a06_chunked() { @@ -120,7 +121,7 @@ class ReaderResource_Test extends TestBase { ReaderResource x2 = x.copy(); assertNotSame(x, x2); assertEquals("foo", toUtf8(x2.getContent())); - assertEquals("text/plain", x2.getContentType().getValue()); + assertEquals("text/plain", x2.getContentType()); assertEquals("bar", x2.getHeaders().getFirst("Foo").get().getValue()); } diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/StreamResource_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/StreamResource_Test.java index a76cf0f470..8b75b8087a 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/StreamResource_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/StreamResource_Test.java @@ -21,9 +21,10 @@ import static org.apache.juneau.http.classic.HttpHeaders.*; import static org.junit.jupiter.api.Assertions.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.junit.jupiter.api.*; // Closeable resources in tests are intentionally unassigned; closing is handled by test infrastructure. @@ -35,7 +36,7 @@ class StreamResource_Test extends TestBase { @Test void a01_basic() throws Exception { var x = new StreamResource(contentType("text/plain"), inputStream("foo")); assertEquals("foo", toUtf8(x.getContent())); - assertEquals("text/plain", x.getContentType().getValue()); + assertEquals("text/plain", x.getContentType()); assertFalse(x.isRepeatable()); assertTrue(x.isStreaming()); } @@ -62,21 +63,21 @@ class StreamResource_Test extends TestBase { @Test void a04_contentType() { var x = new StreamResource(null, inputStream("foo")) .setContentType("text/plain"); - assertEquals("text/plain", x.getContentType().getValue()); + assertEquals("text/plain", x.getContentType()); var x2 = new StreamResource(null, inputStream("foo")) .setContentType(contentType("text/html")); - assertEquals("text/html", x2.getContentType().getValue()); + assertEquals("text/html", x2.getContentType()); } @Test void a05_contentEncoding() { var x = new StreamResource(null, inputStream("foo")) .setContentEncoding("identity"); - assertEquals("identity", x.getContentEncoding().getValue()); + assertEquals("identity", x.getContentEncoding()); var x2 = new StreamResource(null, inputStream("foo")) .setContentEncoding(contentEncoding("gzip")); - assertEquals("gzip", x2.getContentEncoding().getValue()); + assertEquals("gzip", x2.getContentEncoding()); } @Test void a06_chunked() { @@ -120,7 +121,7 @@ class StreamResource_Test extends TestBase { StreamResource x2 = x.copy(); assertNotSame(x, x2); assertEquals("foo", toUtf8(x2.getContent())); - assertEquals("text/plain", x2.getContentType().getValue()); + assertEquals("text/plain", x2.getContentType()); assertEquals("bar", x2.getHeaders().getFirst("Foo").get().getValue()); } diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/StringResource_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/StringResource_Test.java index 0056c82f69..a33d96235e 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/StringResource_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/resource/StringResource_Test.java @@ -20,9 +20,10 @@ import static org.apache.juneau.http.classic.HttpHeaders.*; import static org.junit.jupiter.api.Assertions.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.*; import org.apache.juneau.http.classic.header.*; +import org.apache.juneau.http.classic.header.ContentType; import org.junit.jupiter.api.*; // Closeable resources in tests are intentionally unassigned; closing is handled by test infrastructure. @@ -39,7 +40,7 @@ class StringResource_Test extends TestBase { var x2 = new StringResource(contentType("text/plain"), "foo"); assertEquals("foo", toUtf8(x2.getContent())); - assertEquals("text/plain", x2.getContentType().getValue()); + assertEquals("text/plain", x2.getContentType()); assertTrue(x2.isRepeatable()); assertFalse(x2.isStreaming()); @@ -69,21 +70,21 @@ class StringResource_Test extends TestBase { @Test void a04_contentType() { var x = new StringResource(null, "foo") .setContentType("text/plain"); - assertEquals("text/plain", x.getContentType().getValue()); + assertEquals("text/plain", x.getContentType()); var x2 = new StringResource(null, "foo") .setContentType(contentType("text/html")); - assertEquals("text/html", x2.getContentType().getValue()); + assertEquals("text/html", x2.getContentType()); } @Test void a05_contentEncoding() { var x = new StringResource(null, "foo") .setContentEncoding("identity"); - assertEquals("identity", x.getContentEncoding().getValue()); + assertEquals("identity", x.getContentEncoding()); var x2 = new StringResource(null, "foo") .setContentEncoding(contentEncoding("gzip")); - assertEquals("gzip", x2.getContentEncoding().getValue()); + assertEquals("gzip", x2.getContentEncoding()); } @Test void a06_chunked() { @@ -127,7 +128,7 @@ class StringResource_Test extends TestBase { StringResource x2 = x.copy(); assertNotSame(x, x2); assertEquals("foo", toUtf8(x2.getContent())); - assertEquals("text/plain", x2.getContentType().getValue()); + assertEquals("text/plain", x2.getContentType()); assertEquals("bar", x2.getHeaders().getFirst("Foo").get().getValue()); } diff --git a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/response/ClassicResponse_Test.java b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/response/ClassicResponse_Test.java index eea4a024e3..ffe389dbb4 100644 --- a/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/response/ClassicResponse_Test.java +++ b/juneau-rest/juneau-rest-common-classic/src/test/java/org/apache/juneau/http/classic/response/ClassicResponse_Test.java @@ -20,7 +20,7 @@ import java.util.stream.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.*; import org.junit.jupiter.params.*; import org.junit.jupiter.params.provider.*; @@ -65,7 +65,7 @@ static Stream a01_responseClasses() { @MethodSource void a01_responseClasses(Class> type, int expectedCode, String expectedPhrase) throws Exception { var instance = type.getDeclaredConstructor().newInstance(); - var statusLine = ((HttpResponse)instance).getStatusLine(); + var statusLine = new org.apache.hc.core5.http.message.StatusLine((ClassicHttpResponse)instance); assertEquals(expectedCode, statusLine.getStatusCode()); assertEquals(expectedPhrase, statusLine.getReasonPhrase()); } @@ -83,7 +83,7 @@ void a02_responseSetContent(Class> type, int expe void a03_responseSetHeader(Class> type, int expectedCode, String expectedPhrase) throws Exception { var instance = type.getDeclaredConstructor().newInstance(); instance.setHeader2("X-Test", "value1"); - var header = ((HttpResponse)instance).getFirstHeader("X-Test"); + var header = ((ClassicHttpResponse)instance).getFirstHeader("X-Test"); assertNotNull(header); assertEquals("value1", header.getValue()); } @@ -93,7 +93,7 @@ void a03_responseSetHeader(Class> type, int expec void a04_responseCopyConstructor(Class> type, int expectedCode, String expectedPhrase) throws Exception { var instance = type.getDeclaredConstructor().newInstance(); var copy = (BasicHttpResponse) type.getMethod("copy").invoke(instance); - var statusLine = ((HttpResponse)copy).getStatusLine(); + var statusLine = new org.apache.hc.core5.http.message.StatusLine((ClassicHttpResponse)copy); assertEquals(expectedCode, statusLine.getStatusCode()); assertEquals(expectedPhrase, statusLine.getReasonPhrase()); } @@ -154,7 +154,7 @@ static Stream a06_exceptionClasses() { @MethodSource void a06_exceptionClasses(Class type, int expectedCode, String expectedPhrase) throws Exception { var instance = type.getDeclaredConstructor().newInstance(); - var statusLine = ((HttpResponse)instance).getStatusLine(); + var statusLine = new org.apache.hc.core5.http.message.StatusLine((ClassicHttpResponse)instance); assertEquals(expectedCode, statusLine.getStatusCode()); assertEquals(expectedPhrase, statusLine.getReasonPhrase()); } @@ -172,7 +172,7 @@ void a07_exceptionSetContent(Class type, int expec void a08_exceptionWithMessage(Class type, int expectedCode, String expectedPhrase) throws Exception { var instance = type.getDeclaredConstructor(String.class, Object[].class).newInstance("test %s", new Object[]{"msg"}); assertEquals("test msg", instance.getMessage()); - var statusLine = ((HttpResponse)instance).getStatusLine(); + var statusLine = new org.apache.hc.core5.http.message.StatusLine((ClassicHttpResponse)instance); assertEquals(expectedCode, statusLine.getStatusCode()); } @@ -182,7 +182,7 @@ void a09_exceptionWithCause(Class type, int expect var cause = new RuntimeException("root cause"); var instance = type.getDeclaredConstructor(Throwable.class).newInstance(cause); assertSame(cause, instance.getCause()); - var statusLine = ((HttpResponse)instance).getStatusLine(); + var statusLine = new org.apache.hc.core5.http.message.StatusLine((ClassicHttpResponse)instance); assertEquals(expectedCode, statusLine.getStatusCode()); } @@ -191,7 +191,7 @@ void a09_exceptionWithCause(Class type, int expect void a10_exceptionCopyConstructor(Class type, int expectedCode, String expectedPhrase) throws Exception { var instance = type.getDeclaredConstructor().newInstance(); var copy = (BasicHttpException) type.getMethod("copy").invoke(instance); - var statusLine = ((HttpResponse)copy).getStatusLine(); + var statusLine = new org.apache.hc.core5.http.message.StatusLine((ClassicHttpResponse)copy); assertEquals(expectedCode, statusLine.getStatusCode()); assertEquals(expectedPhrase, statusLine.getReasonPhrase()); } @@ -201,7 +201,7 @@ void a10_exceptionCopyConstructor(Class type, int void a11_exceptionSetHeader(Class type, int expectedCode, String expectedPhrase) throws Exception { var instance = type.getDeclaredConstructor().newInstance(); instance.setHeader2("X-Test", "value1"); - var header = ((HttpResponse)instance).getFirstHeader("X-Test"); + var header = ((ClassicHttpResponse)instance).getFirstHeader("X-Test"); assertNotNull(header); assertEquals("value1", header.getValue()); } diff --git a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpProtocolVersion.java b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpProtocolVersion.java index 940baf413f..eaa226f118 100644 --- a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpProtocolVersion.java +++ b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpProtocolVersion.java @@ -25,7 +25,7 @@ * The HTTP protocol version that appears in request and response start lines (e.g. {@code "HTTP/1.1"}). * *

                    - * Mirrors the semantics of {@code org.apache.http.ProtocolVersion} without the Apache HttpCore dependency. + * Mirrors the semantics of {@code org.apache.hc.core5.http.ProtocolVersion} without the Apache HttpCore dependency. * The protocol name and major/minor numbers are stored separately so callers can compare versions numerically. * *

                    diff --git a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpRequestLine.java b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpRequestLine.java index aebb027e9f..be5a0cc8db 100644 --- a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpRequestLine.java +++ b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpRequestLine.java @@ -20,7 +20,7 @@ * The first line of an HTTP request message, containing the method, request URI, and protocol version. * *

                    - * Mirrors the semantics of {@code org.apache.http.RequestLine} without the Apache HttpCore dependency. + * Mirrors the semantics of {@code org.apache.hc.core5.http.message.RequestLine} without the Apache HttpCore dependency. * The default immutable implementation is {@link org.apache.juneau.http.request.HttpRequestLineBean}. * *

                    diff --git a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpStatusLine.java b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpStatusLine.java index 09626837a1..725af268ef 100644 --- a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpStatusLine.java +++ b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpStatusLine.java @@ -20,7 +20,7 @@ * The first line of an HTTP response message, containing the protocol version, status code, and reason phrase. * *

                    - * Mirrors the semantics of {@code org.apache.http.StatusLine} without the Apache HttpCore dependency. + * Mirrors the semantics of {@code org.apache.hc.core5.http.message.StatusLine} without the Apache HttpCore dependency. * The default immutable implementation is {@link org.apache.juneau.http.response.HttpStatusLineBean}. * *

                    diff --git a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/response/HttpResponseMessage.java b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/response/HttpResponseMessage.java index 08dbb9e8d4..e3486e6161 100644 --- a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/response/HttpResponseMessage.java +++ b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/response/HttpResponseMessage.java @@ -26,7 +26,7 @@ * A complete HTTP response message: status line, headers, and optional body. * *

                    - * Mirrors the semantics of {@code org.apache.http.HttpResponse} without the Apache HttpCore dependency. + * Mirrors the semantics of {@code org.apache.hc.core5.http.ClassicHttpResponse} without the Apache HttpCore dependency. * *

                    * Beta — API subject to change: This type is part of the next-generation REST client and HTTP stack. diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockServletRequest.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockServletRequest.java index a098c32441..13e105d363 100644 --- a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockServletRequest.java +++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockServletRequest.java @@ -30,7 +30,7 @@ import java.util.*; import java.util.logging.*; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.marshall.marshaller.*; import org.apache.juneau.rest.server.util.*; diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/classic/MockHttpClientConnectionManager.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/classic/MockHttpClientConnectionManager.java index 80fb254dd2..3d95c957a0 100644 --- a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/classic/MockHttpClientConnectionManager.java +++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/classic/MockHttpClientConnectionManager.java @@ -21,10 +21,10 @@ import java.io.*; import java.util.concurrent.*; -import org.apache.http.*; -import org.apache.http.conn.*; -import org.apache.http.conn.routing.*; -import org.apache.http.protocol.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.client5.http.io.*; +import org.apache.hc.client5.http.routing.*; +import org.apache.hc.core5.http.protocol.*; /** * An implementation of {@link HttpClientConnectionManager} specifically for use in mocked connections using the {@link MockRestClient} class. @@ -42,75 +42,65 @@ */ class MockHttpClientConnectionManager implements HttpClientConnectionManager { - private ConnectionRequest cr; + private MockRestClient client; - @Override /* Overridden from HttpClientConnectionManager */ - public void closeExpiredConnections() { - // No-op: Mock implementation - full functionality not required - } - - @Override /* Overridden from HttpClientConnectionManager */ - public void closeIdleConnections(long idletime, TimeUnit tunit) { - // No-op: Mock implementation - full functionality not required - } - - @Override /* Overridden from HttpClientConnectionManager */ - public void connect(HttpClientConnection conn, HttpRoute route, int connectTimeout, HttpContext context) throws IOException { - // No-op: Mock implementation - full functionality not required - } - - @Override /* Overridden from Object */ - public boolean equals(Object o) { - // All MockHttpClientConnectionManagers are considered equal. - return nn(o) && o instanceof MockHttpClientConnectionManager; - } - - @Override /* Overridden from Object */ - public int hashCode() { - return MockHttpClientConnectionManager.class.hashCode(); - } + public void init(MockRestClient client) { this.client = client; } - /** - * Post-creation initialization method. - * - * @param mockRestClient Allows the connection manager to reference the mock rest client that created it. - */ - public void init(MockRestClient mockRestClient) { - this.cr = new ConnectionRequest() { + @Override + public LeaseRequest lease(String id, org.apache.hc.client5.http.HttpRoute route, org.apache.hc.core5.util.Timeout timeout, Object state) { + return new LeaseRequest() { @Override - public boolean cancel() { - return false; - } + public boolean cancel() { return false; } @Override - public HttpClientConnection get(long timeout, TimeUnit tunit) throws InterruptedException, ExecutionException, ConnectionPoolTimeoutException { - return mockRestClient; + public ConnectionEndpoint get(org.apache.hc.core5.util.Timeout timeout) { + return new ConnectionEndpoint() { + @Override + public ClassicHttpResponse execute(String id, ClassicHttpRequest request, + org.apache.hc.core5.http.impl.io.HttpRequestExecutor executor, HttpContext context) throws IOException, HttpException { + return executor.execute(request, client, context); + } + + @Override + public ClassicHttpResponse execute(String id, ClassicHttpRequest request, + ConnectionEndpoint.RequestExecutor executor, HttpContext context) throws IOException, HttpException { + return executor.execute(request, client, context); + } + + @Override + public boolean isConnected() { return true; } + + @Override + public void setSocketTimeout(org.apache.hc.core5.util.Timeout timeout) { } + + @Override + public void close() { } + + @Override + public void close(org.apache.hc.core5.io.CloseMode mode) { } + }; } }; } - @Override /* Overridden from HttpClientConnectionManager */ - public void releaseConnection(HttpClientConnection conn, Object newState, long validDuration, TimeUnit timeUnit) { - // No-op: Mock implementation - full functionality not required - } + @Override + public void release(ConnectionEndpoint endpoint, Object state, org.apache.hc.core5.util.TimeValue duration) { } - @Override /* Overridden from HttpClientConnectionManager */ - public ConnectionRequest requestConnection(HttpRoute route, Object state) { - return cr; - } + @Override + public void connect(ConnectionEndpoint endpoint, org.apache.hc.core5.util.TimeValue timeout, HttpContext context) { } - @Override /* Overridden from HttpClientConnectionManager */ - public void routeComplete(HttpClientConnection conn, HttpRoute route, HttpContext context) throws IOException { - // No-op: Mock implementation - full functionality not required - } + @Override + public void upgrade(ConnectionEndpoint endpoint, HttpContext context) { } - @Override /* Overridden from HttpClientConnectionManager */ - public void shutdown() { - // No-op: Mock implementation - full functionality not required - } + @Override + public void close() { } - @Override /* Overridden from HttpClientConnectionManager */ - public void upgrade(HttpClientConnection conn, HttpRoute route, HttpContext context) throws IOException { - // No-op: Mock implementation - full functionality not required - } -} \ No newline at end of file + @Override + public void close(org.apache.hc.core5.io.CloseMode mode) { } + + @Override + public boolean equals(Object o) { return o instanceof MockHttpClientConnectionManager; } + + @Override + public int hashCode() { return MockHttpClientConnectionManager.class.hashCode(); } +} diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/classic/MockRestClient.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/classic/MockRestClient.java index 85b040283a..ce5c5038c8 100644 --- a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/classic/MockRestClient.java +++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/classic/MockRestClient.java @@ -28,11 +28,11 @@ import java.util.logging.*; import java.util.zip.*; -import org.apache.http.*; -import org.apache.http.client.methods.*; -import org.apache.http.conn.*; -import org.apache.http.entity.*; -import org.apache.http.message.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.client5.http.classic.methods.*; +import org.apache.hc.client5.http.io.*; +import org.apache.hc.core5.http.io.entity.*; +import org.apache.hc.core5.http.message.*; import org.apache.juneau.commons.inject.*; import org.apache.juneau.http.classic.header.ContentType; import org.apache.juneau.http.remote.*; @@ -228,7 +228,34 @@ "resource", // Builders and requests returned to callers; lifecycle managed by the enclosing MockRestClient or test "unchecked" // Type erasure requires cast for builder chain }) -public class MockRestClient extends RestClient implements HttpClientConnection { +public class MockRestClient extends RestClient implements org.apache.hc.core5.http.io.HttpClientConnection { + + @Override + public void close(org.apache.hc.core5.io.CloseMode mode) { } + + @Override + public boolean isDataAvailable(org.apache.hc.core5.util.Timeout timeout) { return true; } + + @Override + public boolean isConsistent() { return true; } + + @Override + public void terminateRequest(ClassicHttpRequest request) { } + + @Override + public EndpointDetails getEndpointDetails() { return null; } + + @Override + public java.net.SocketAddress getLocalAddress() { return null; } + + @Override + public java.net.SocketAddress getRemoteAddress() { return null; } + + @Override + public ProtocolVersion getProtocolVersion() { return HttpVersion.HTTP_1_1; } + + @Override + public javax.net.ssl.SSLSession getSSLSession() { return null; } /** * Builder class. @@ -448,7 +475,6 @@ public Builder suppressLogging() { return logRequests(DetailLevel.NONE, null, null); } - } private static Map,RestContext> restContexts = new ConcurrentHashMap<>(); @@ -645,6 +671,7 @@ private static Builder preInit(Builder builder) { private final Map pathVars; private final ThreadLocal rreq = new ThreadLocal<>(); + private final ThreadLocal activeRequest = new ThreadLocal<>(); private final ThreadLocal rres = new ThreadLocal<>(); private final ThreadLocal sreq = new ThreadLocal<>(); @@ -674,7 +701,6 @@ public MockRestRequest callback(String callString) throws RestCallException { return (MockRestRequest)super.callback(callString); } - @Override /* Overridden from HttpClientConnection */ public void close() throws IOException { // Don't call super.close() because it will close the client. rreq.remove(); @@ -688,7 +714,6 @@ public MockRestRequest delete(Object url) throws RestCallException { return (MockRestRequest)super.delete(url); } - @Override /* Overridden from HttpClientConnection */ public void flush() throws IOException { // No-op: Mock implementation - full functionality not required } @@ -762,26 +787,21 @@ public MockRestRequest get(Object url) throws RestCallException { */ public MockServletResponse getCurrentServerResponse() { return sres.get(); } - @Override /* Overridden from HttpClientConnection */ public HttpConnectionMetrics getMetrics() { return null; } - @Override /* Overridden from HttpClientConnection */ - public int getSocketTimeout() { return Integer.MAX_VALUE; } + public org.apache.hc.core5.util.Timeout getSocketTimeout() { return org.apache.hc.core5.util.Timeout.DISABLED; } @Override /* Overridden from RestClient */ public MockRestRequest head(Object url) throws RestCallException { return (MockRestRequest)super.head(url); } - @Override /* Overridden from HttpClientConnection */ public boolean isOpen() { return true; } - @Override /* Overridden from HttpClientConnection */ public boolean isResponseAvailable(int timeout) throws IOException { return true; } - @Override /* Overridden from HttpClientConnection */ public boolean isStale() { return false; } @Override /* Overridden from RestClient */ @@ -834,17 +854,18 @@ public MockRestRequest put(Object url, String body, ContentType contentType) thr return (MockRestRequest)super.put(url, body, contentType); } - @Override /* Overridden from HttpClientConnection */ - public void receiveResponseEntity(HttpResponse response) throws HttpException, IOException { + public void receiveResponseEntity(ClassicHttpResponse response) throws HttpException, IOException { + // Preserve bodyless Reset Content responses when HttpClient 5 asks for their entity. + if (response.getCode() == 205) + return; InputStream is = new ByteArrayInputStream(sres.get().getContent()); var contentEncoding = response.getLastHeader("Content-Encoding"); if (nn(contentEncoding) && eqic(contentEncoding.getValue(), "gzip")) is = new GZIPInputStream(is); - response.setEntity(new InputStreamEntity(is)); + response.setEntity(new InputStreamEntity(is, org.apache.hc.core5.http.ContentType.parse(response.getFirstHeader("Content-Type") == null ? null : response.getFirstHeader("Content-Type").getValue()))); } - @Override /* Overridden from HttpClientConnection */ - public HttpResponse receiveResponseHeader() throws HttpException, IOException { + public ClassicHttpResponse receiveResponseHeader() throws HttpException, IOException { try { var res = MockServletResponse.create(); var logLevel = sreq.get().getLogLevel(); @@ -872,7 +893,7 @@ public HttpResponse receiveResponseHeader() throws HttpException, IOException { sres.set(res); - var response = new BasicHttpResponse(new BasicStatusLine(HttpVersion.HTTP_1_1, res.getStatus(), res.getMessage())); + var response = new BasicClassicHttpResponse(res.getStatus(), res.getStatus() >= 1000 && res.getMessage() == null ? "" : res.getMessage()); res.getHeaders().forEach((k, v) -> { for (var hv : v) response.addHeader(k, hv); @@ -904,8 +925,7 @@ public MockRestRequest request(String method, Object url, Object body) throws Re return (MockRestRequest)super.request(method, url, body); } - @Override /* Overridden from HttpClientConnection */ - public void sendRequestEntity(HttpEntityEnclosingRequest request) throws HttpException, IOException { + public void sendRequestEntity(ClassicHttpRequest request) throws HttpException, IOException { byte[] body = {}; var entity = request.getEntity(); if (nn(entity)) { @@ -920,10 +940,9 @@ public void sendRequestEntity(HttpEntityEnclosingRequest request) throws HttpExc sreq.get().content(body); } - @Override /* Overridden from HttpClientConnection */ - public void sendRequestHeader(HttpRequest request) throws HttpException, IOException { + public void sendRequestHeader(ClassicHttpRequest request) throws HttpException, IOException { try { - var rl = request.getRequestLine(); + var rl = new RequestLine(request); var path = rl.getUri(); var target = findTarget(request); @@ -939,9 +958,9 @@ public void sendRequestHeader(HttpRequest request) throws HttpException, IOExcep if (nn(pr.getError())) throw new IllegalStateException(pr.getError()); - var r = MockServletRequest.create(request.getRequestLine().getMethod(), pr.getURI()).contextPath(pr.getContextPath()).servletPath(pr.getServletPath()).pathVars(pathVars).logLevel(isDebug() ? Level.FINEST : null); + var r = MockServletRequest.create(new RequestLine(request).getMethod(), pr.getURI()).contextPath(pr.getContextPath()).servletPath(pr.getServletPath()).pathVars(pathVars).logLevel(isDebug() ? Level.FINEST : null); - for (var h : request.getAllHeaders()) + for (var h : request.getHeaders()) r.header(h.getName(), h.getValue()); sreq.set(r); @@ -951,12 +970,10 @@ public void sendRequestHeader(HttpRequest request) throws HttpException, IOExcep } } - @Override /* Overridden from HttpClientConnection */ - public void setSocketTimeout(int timeout) { + public void setSocketTimeout(org.apache.hc.core5.util.Timeout timeout) { // No-op: Mock implementation - full functionality not required } - @Override /* Overridden from HttpClientConnection */ public void shutdown() throws IOException { // No-op: Mock implementation - full functionality not required } @@ -966,20 +983,22 @@ public void shutdown() throws IOException { * Returns the same object if one of the low-level client methods are used (e.g. execute(HttpUriRequest)). */ private HttpRequest findRestRequest(HttpRequest req) { - if (req instanceof RestRequestCreated req2) - return req2.getRestRequest(); - if (req instanceof HttpRequestWrapper req2) - return findRestRequest(req2.getOriginal()); - return req; + if (req instanceof RestRequestCreated created) return created.getRestRequest(); + return activeRequest.get() != null ? activeRequest.get() : req; } private static String findTarget(HttpRequest req) { - if (req instanceof HttpRequestWrapper req2) { - var httpHost = req2.getTarget(); - if (nn(httpHost)) - return httpHost.toURI(); + return req.getAuthority() != null ? (req.getScheme() != null ? req.getScheme() : "http") + "://" + req.getAuthority() : "http://localhost"; + } + + @Override + protected ClassicHttpResponse run(HttpHost target, ClassicHttpRequest request, org.apache.hc.core5.http.protocol.HttpContext context) throws IOException { + activeRequest.set(request instanceof RestRequestCreated created ? created.getRestRequest() : request); + try { + return super.run(target, request, context); + } finally { + activeRequest.remove(); } - return "http://localhost"; } @Override /* Overridden from RestClient */ @@ -988,7 +1007,7 @@ protected MockRestRequest createRequest(URI uri, String method, boolean hasBody) } @Override /* Overridden from RestClient */ - protected MockRestResponse createResponse(RestRequest req, HttpResponse httpResponse, Parser parser) throws RestCallException { + protected MockRestResponse createResponse(RestRequest req, ClassicHttpResponse httpResponse, Parser parser) throws RestCallException { return new MockRestResponse(this, req, httpResponse, parser); } diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/classic/MockRestRequest.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/classic/MockRestRequest.java index f51d1df54a..a9896c16e0 100644 --- a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/classic/MockRestRequest.java +++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/classic/MockRestRequest.java @@ -24,10 +24,10 @@ import java.util.*; import java.util.function.*; -import org.apache.http.*; -import org.apache.http.client.config.*; -import org.apache.http.concurrent.*; -import org.apache.http.protocol.*; +import org.apache.hc.core5.http.*; +import org.apache.hc.client5.http.config.*; +import org.apache.hc.core5.concurrent.*; +import org.apache.hc.core5.http.protocol.*; import org.apache.juneau.marshall.httppart.*; import org.apache.juneau.marshall.parser.*; import org.apache.juneau.marshall.serializer.*; diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/classic/MockRestResponse.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/classic/MockRestResponse.java index 8c8a58e511..73f46f0252 100644 --- a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/classic/MockRestResponse.java +++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/classic/MockRestResponse.java @@ -16,7 +16,7 @@ */ package org.apache.juneau.rest.mock.classic; -import org.apache.http.*; +import org.apache.hc.core5.http.*; import org.apache.juneau.marshall.parser.*; import org.apache.juneau.rest.client.classic.*; @@ -40,7 +40,7 @@ public class MockRestResponse extends RestResponse { * @param response The HTTP response. Can be null (a default empty response with a status code of 0 is substituted). * @param parser The overridden parser passed into {@link RestRequest#parser(Parser)}. */ - public MockRestResponse(RestClient client, RestRequest request, HttpResponse response, Parser parser) { + public MockRestResponse(RestClient client, RestRequest request, ClassicHttpResponse response, Parser parser) { super(client, request, response, parser); ((MockRestClient)client).currentResponse(this); } diff --git a/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/mock/classic/MockRestClient_Coverage_Test.java b/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/mock/classic/MockRestClient_Coverage_Test.java index ee5bb96efd..ee9af7f200 100644 --- a/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/mock/classic/MockRestClient_Coverage_Test.java +++ b/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/mock/classic/MockRestClient_Coverage_Test.java @@ -112,7 +112,7 @@ public String get() { @Test void a06_getSocketTimeout() { var client = MockRestClient.create(A.class).build(); - assertEquals(Integer.MAX_VALUE, client.getSocketTimeout()); + assertEquals(org.apache.hc.core5.util.Timeout.DISABLED, client.getSocketTimeout()); } @Test void a07_isOpen() { @@ -219,13 +219,11 @@ public String get() { @Test void d03_connectionManager_noOpMethods() { var cm = new MockHttpClientConnectionManager(); // These should be no-ops - assertDoesNotThrow(cm::closeExpiredConnections); - assertDoesNotThrow(() -> cm.closeIdleConnections(10, java.util.concurrent.TimeUnit.SECONDS)); - assertDoesNotThrow(() -> cm.connect(null, null, 0, null)); - assertDoesNotThrow(() -> cm.releaseConnection(null, null, 0, java.util.concurrent.TimeUnit.SECONDS)); - assertDoesNotThrow(() -> cm.routeComplete(null, null, null)); - assertDoesNotThrow(cm::shutdown); - assertDoesNotThrow(() -> cm.upgrade(null, null, null)); + assertDoesNotThrow(() -> cm.close()); + assertDoesNotThrow(() -> cm.close(org.apache.hc.core5.io.CloseMode.GRACEFUL)); + assertDoesNotThrow(() -> cm.connect(null, null, null)); + assertDoesNotThrow(() -> cm.release(null, null, null)); + assertDoesNotThrow(() -> cm.upgrade(null, null)); } @Test void d04_connectionManager_requestConnection() throws Exception { diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/processor/LegacyHttpResponseAdapter.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/processor/LegacyHttpResponseAdapter.java index 5793c0bded..2634bfb70b 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/processor/LegacyHttpResponseAdapter.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/processor/LegacyHttpResponseAdapter.java @@ -27,11 +27,11 @@ import org.apache.juneau.http.response.*; /** - * Reflection-based adapter that bridges legacy {@code org.apache.http.HttpResponse} (Apache HttpClient 4.5) + * Reflection-based adapter that bridges legacy {@code org.apache.hc.core5.http.ClassicHttpResponse} (Apache HttpClient 5.6) * objects to the modern {@link HttpResponseMessage} contract. * *

                    - * This adapter exists so that user code returning legacy {@code org.apache.http.*} response types from + * This adapter exists so that user code returning legacy {@code org.apache.hc.core5.http.*} response types from * {@code @RestGet} methods continues to render correctly through the response-processor chain even though * {@code juneau-rest-server} no longer compiles against Apache HttpClient. The adapter uses pure * reflection — no compile-time dependency on the Apache HttpClient types — so this module remains @@ -39,22 +39,22 @@ * *

                    * Detection: an object is considered a "legacy HTTP response" if it implements - * {@code org.apache.http.HttpResponse}. Detection caches the loaded class once per VM. + * {@code org.apache.hc.core5.http.ClassicHttpResponse}. Detection caches the loaded class once per VM. */ @SuppressWarnings({ "java:S1192" // Duplicate string literals are HTTP header names and MIME type strings; intentional }) final class LegacyHttpResponseAdapter { - private static final Class LEGACY_HTTP_RESPONSE = tryLoad("org.apache.http.HttpResponse"); - private static final Class LEGACY_HTTP_ENTITY = tryLoad("org.apache.http.HttpEntity"); + private static final Class LEGACY_HTTP_RESPONSE = tryLoad("org.apache.hc.core5.http.ClassicHttpResponse"); + private static final Class LEGACY_HTTP_ENTITY = tryLoad("org.apache.hc.core5.http.HttpEntity"); private static final Class LEGACY_HTTP_RESOURCE = tryLoad("org.apache.juneau.http.classic.resource.HttpResource"); private LegacyHttpResponseAdapter() {} /** * Returns true if the given object is an instance of the legacy - * {@code org.apache.http.HttpResponse} interface, indicating it should be adapted. + * {@code org.apache.hc.core5.http.ClassicHttpResponse} interface, indicating it should be adapted. * * @param obj The candidate object. May be null. * @return true if adaptation is needed, otherwise false. @@ -65,7 +65,7 @@ static boolean isLegacyResponse(Object obj) { /** * Returns true if the given object is an instance of the legacy - * {@code org.apache.http.HttpEntity} interface. + * {@code org.apache.hc.core5.http.HttpEntity} interface. * * @param obj The candidate object. May be null. * @return true if the object is a legacy entity, otherwise false. @@ -75,9 +75,9 @@ static boolean isLegacyEntity(Object obj) { } /** - * Adapts a legacy {@code org.apache.http.HttpResponse} into a {@link HttpResponseMessage}. + * Adapts a legacy {@code org.apache.hc.core5.http.ClassicHttpResponse} into a {@link HttpResponseMessage}. * - * @param legacy The legacy response. Must be an instance of {@code org.apache.http.HttpResponse}. + * @param legacy The legacy response. Must be an instance of {@code org.apache.hc.core5.http.ClassicHttpResponse}. * @return A {@link HttpResponseMessage} view over the legacy object. */ static HttpResponseMessage adapt(Object legacy) { @@ -85,9 +85,9 @@ static HttpResponseMessage adapt(Object legacy) { } /** - * Adapts a legacy {@code org.apache.http.HttpEntity} into an {@link HttpBody}. + * Adapts a legacy {@code org.apache.hc.core5.http.HttpEntity} into an {@link HttpBody}. * - * @param legacyEntity The legacy entity. Must be an instance of {@code org.apache.http.HttpEntity}. + * @param legacyEntity The legacy entity. Must be an instance of {@code org.apache.hc.core5.http.HttpEntity}. * @return An {@link HttpBody} view over the legacy entity. */ static HttpBody adaptEntity(Object legacyEntity) { @@ -156,17 +156,14 @@ private static final class LegacyAdapter implements HttpResponseMessage { @Override public HttpStatusLine getStatusLine() { - var sl = invoke(legacy, "getStatusLine", new Class[0]); - if (sl == null) - return HttpStatusLineBean.of(200, "OK"); - var statusCode = (int) invoke(sl, "getStatusCode", new Class[0]); - var reasonPhrase = (String) invoke(sl, "getReasonPhrase", new Class[0]); + var statusCode = (int) invoke(legacy, "getCode", new Class[0]); + var reasonPhrase = (String) invoke(legacy, "getReasonPhrase", new Class[0]); return HttpStatusLineBean.of(statusCode, reasonPhrase); } @Override public List getHeaders() { - var arr = (Object[]) invoke(legacy, "getAllHeaders", new Class[0]); + var arr = (Object[]) invoke(legacy, "getHeaders", new Class[0]); if (arr == null || arr.length == 0) return List.of(); var out = new ArrayList(arr.length); @@ -205,7 +202,7 @@ private static final class LegacyEntityBody implements HttpBody { @Override public String getContentType() { var h = invoke(entity, "getContentType", new Class[0]); - return h == null ? null : (String) invoke(h, "getValue", new Class[0]); + return (String) h; } @Override diff --git a/pom.xml b/pom.xml index 370fd2d493..ac7f6c682a 100644 --- a/pom.xml +++ b/pom.xml @@ -104,6 +104,8 @@ 1.5.18 2.26.1 2.3.232 + 5.4.4 + 5.6.4 @@ -128,6 +130,30 @@ file:///tmp/site + + + + org.apache.httpcomponents.core5 + httpcore5 + ${httpcore.version} + + + org.apache.httpcomponents.core5 + httpcore5-h2 + ${httpcore.version} + + + org.apache.httpcomponents.client5 + httpclient5 + ${httpclient.version} + + + org.apache.httpcomponents.client5 + httpclient5-cache + ${httpclient.version} + + + org.apache.commons @@ -304,8 +330,8 @@ https://docs.oracle.com/en/java/javase/${maven.compiler.target}/docs/api/ https://jakarta.ee/specifications/platform/8/apidocs/ - https://hc.apache.org/httpcomponents-client-4.5.x/current/httpclient/apidocs/ - https://hc.apache.org/httpcomponents-core-4.4.x/current/httpcore/apidocs/ + https://hc.apache.org/httpcomponents-client-5.6.x/current/httpclient5/apidocs/ + https://hc.apache.org/httpcomponents-core-5.4.x/current/httpcore5/apidocs/ false