-
Notifications
You must be signed in to change notification settings - Fork 358
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Created HttpUrlConnector extension for Http100Continue Signed-off-by: Maxim Nesen <maxim.nesen@oracle.com>
- Loading branch information
Showing
3 changed files
with
146 additions
and
23 deletions.
There are no files selected for viewing
57 changes: 57 additions & 0 deletions
57
core-client/src/main/java/org/glassfish/jersey/client/internal/ConnectorExtension.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
/* | ||
* Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved. | ||
* | ||
* This program and the accompanying materials are made available under the | ||
* terms of the Eclipse Public License v. 2.0, which is available at | ||
* http://www.eclipse.org/legal/epl-2.0. | ||
* | ||
* This Source Code may also be made available under the following Secondary | ||
* Licenses when the conditions for such availability set forth in the | ||
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License, | ||
* version 2 with the GNU Classpath Exception, which is available at | ||
* https://www.gnu.org/software/classpath/license.html. | ||
* | ||
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 | ||
*/ | ||
|
||
package org.glassfish.jersey.client.internal; | ||
|
||
import org.glassfish.jersey.client.ClientRequest; | ||
|
||
/** | ||
* Connector extension interface to extend existing connector's functionality. | ||
* | ||
* @param <T> type of connection to be extended/processed | ||
* @param <E> type of exception which can be thrown while processing/handling exeption | ||
* | ||
* @since 2.33 | ||
*/ | ||
interface ConnectorExtension<T, E extends Exception> { | ||
|
||
/** | ||
* Main function which allows extension of connector's functionality | ||
* | ||
* @param request request instance to work with (shall contain all required settings/params to be used in extension) | ||
* @param extensionParam connector's instance which is being extended | ||
*/ | ||
void invoke(ClientRequest request, T extensionParam); | ||
|
||
/** | ||
* After connection is done some additional work may be done | ||
* | ||
* @param extensionParam connector's instance which is being extended | ||
*/ | ||
void postConnectionProcessing(T extensionParam); | ||
|
||
/** | ||
* Exception handling method | ||
* | ||
* @param request request instance to work with (shall contain all required settings/params to be used in extension) | ||
* @param ex exception instance which comes from connector | ||
* @param extensionParam connector's instance which is being extended | ||
* @return true if exception was handled by this method, false otherwise | ||
* @throws E can thor exception if required by handling | ||
*/ | ||
boolean handleException(ClientRequest request, T extensionParam, E ex) throws E; | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
72 changes: 72 additions & 0 deletions
72
...java/org/glassfish/jersey/client/internal/HttpUrlExpect100ContinueConnectorExtension.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
/* | ||
* Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved. | ||
* | ||
* This program and the accompanying materials are made available under the | ||
* terms of the Eclipse Public License v. 2.0, which is available at | ||
* http://www.eclipse.org/legal/epl-2.0. | ||
* | ||
* This Source Code may also be made available under the following Secondary | ||
* Licenses when the conditions for such availability set forth in the | ||
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License, | ||
* version 2 with the GNU Classpath Exception, which is available at | ||
* https://www.gnu.org/software/classpath/license.html. | ||
* | ||
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 | ||
*/ | ||
|
||
package org.glassfish.jersey.client.internal; | ||
|
||
import org.glassfish.jersey.client.ClientProperties; | ||
import org.glassfish.jersey.client.ClientRequest; | ||
import org.glassfish.jersey.client.RequestEntityProcessing; | ||
|
||
import java.io.IOException; | ||
import java.net.HttpURLConnection; | ||
import java.net.ProtocolException; | ||
|
||
class HttpUrlExpect100ContinueConnectorExtension | ||
implements ConnectorExtension<HttpURLConnection, IOException> { | ||
|
||
private static final String EXCEPTION_MESSAGE = "Server rejected operation"; | ||
|
||
@Override | ||
public void invoke(ClientRequest request, HttpURLConnection uc) { | ||
|
||
final long length = request.getLengthLong(); | ||
final RequestEntityProcessing entityProcessing = request.resolveProperty( | ||
ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.class); | ||
|
||
final Boolean expectContinueActivated = request.resolveProperty( | ||
ClientProperties.EXPECT_100_CONTINUE, Boolean.class); | ||
final Long expectContinueSizeThreshold = request.resolveProperty( | ||
ClientProperties.EXPECT_100_CONTINUE_THRESHOLD_SIZE, | ||
ClientProperties.DEFAULT_EXPECT_100_CONTINUE_THRESHOLD_SIZE); | ||
|
||
final boolean allowStreaming = length > expectContinueSizeThreshold | ||
|| entityProcessing == RequestEntityProcessing.CHUNKED; | ||
|
||
if (!Boolean.TRUE.equals(expectContinueActivated) | ||
|| !("POST".equals(uc.getRequestMethod()) || "PUT".equals(uc.getRequestMethod())) | ||
|| !allowStreaming | ||
) { | ||
return; | ||
} | ||
uc.setRequestProperty("Expect", "100-Continue"); | ||
} | ||
|
||
@Override | ||
public void postConnectionProcessing(HttpURLConnection extensionParam) { | ||
//nothing here, we do not process post connection extension | ||
} | ||
|
||
@Override | ||
public boolean handleException(ClientRequest request, HttpURLConnection extensionParam, IOException ex) { | ||
|
||
final Boolean expectContinueActivated = request.resolveProperty( | ||
ClientProperties.EXPECT_100_CONTINUE, Boolean.FALSE); | ||
|
||
return expectContinueActivated | ||
&& (ex instanceof ProtocolException && ex.getMessage().equals(EXCEPTION_MESSAGE)); | ||
} | ||
|
||
} |