Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow for using HeaderDelegateProvider service #4276

Merged
merged 2 commits into from
Oct 29, 2019
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -456,7 +456,7 @@ private static URI getProxyUri(final Object proxy) {
@Override
public ClientResponse apply(final ClientRequest clientRequest) throws ProcessingException {
final HttpUriRequest request = getUriHttpRequest(clientRequest);
final Map<String, String> clientHeadersSnapshot = writeOutBoundHeaders(clientRequest.getHeaders(), request);
final Map<String, String> clientHeadersSnapshot = writeOutBoundHeaders(clientRequest, request);

try {
final CloseableHttpResponse response;
Expand All @@ -476,7 +476,8 @@ public ClientResponse apply(final ClientRequest clientRequest) throws Processing
}

response = client.execute(getHost(request), request, context);
HeaderUtils.checkHeaderChanges(clientHeadersSnapshot, clientRequest.getHeaders(), this.getClass().getName());
HeaderUtils.checkHeaderChanges(clientHeadersSnapshot, clientRequest.getHeaders(),
this.getClass().getName(), clientRequest.getConfiguration());

final Response.StatusType status = response.getStatusLine().getReasonPhrase() == null
? Statuses.from(response.getStatusLine().getStatusCode())
Expand Down Expand Up @@ -643,9 +644,10 @@ public boolean isStreaming() {
}
}

private static Map<String, String> writeOutBoundHeaders(final MultivaluedMap<String, Object> headers,
private static Map<String, String> writeOutBoundHeaders(final ClientRequest clientRequest,
final HttpUriRequest request) {
final Map<String, String> stringHeaders = HeaderUtils.asStringHeadersSingleValue(headers);
final Map<String, String> stringHeaders =
HeaderUtils.asStringHeadersSingleValue(clientRequest.getHeaders(), clientRequest.getConfiguration());

for (final Map.Entry<String, String> e : stringHeaders.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
import javax.ws.rs.ProcessingException;
import javax.ws.rs.client.Client;
import javax.ws.rs.core.Configuration;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;

import org.glassfish.jersey.client.ClientProperties;
Expand Down Expand Up @@ -178,7 +177,7 @@ public AsyncHttpClient getGrizzlyClient() {
@Override
public ClientResponse apply(final ClientRequest request) {
final Request connectorRequest = translate(request);
final Map<String, String> clientHeadersSnapshot = writeOutBoundHeaders(request.getHeaders(), connectorRequest);
final Map<String, String> clientHeadersSnapshot = writeOutBoundHeaders(request, connectorRequest);

final CompletableFuture<ClientResponse> responseFuture = new CompletableFuture<>();
final ByteBufferInputStream entityStream = new ByteBufferInputStream();
Expand All @@ -201,7 +200,8 @@ public STATE onHeadersReceived(HttpResponseHeaders headers) throws Exception {
}

HeaderUtils.checkHeaderChanges(clientHeadersSnapshot, request.getHeaders(),
GrizzlyConnector.this.getClass().getName());
GrizzlyConnector.this.getClass().getName(),
request.getConfiguration());

responseFuture.complete(translate(request, this.status, headers, entityStream));
return STATE.CONTINUE;
Expand Down Expand Up @@ -242,7 +242,7 @@ public void onThrowable(Throwable t) {
@Override
public Future<?> apply(final ClientRequest request, final AsyncConnectorCallback callback) {
final Request connectorRequest = translate(request);
final Map<String, String> clientHeadersSnapshot = writeOutBoundHeaders(request.getHeaders(), connectorRequest);
final Map<String, String> clientHeadersSnapshot = writeOutBoundHeaders(request, connectorRequest);
final ByteBufferInputStream entityStream = new ByteBufferInputStream();
final AtomicBoolean callbackInvoked = new AtomicBoolean(false);

Expand All @@ -264,7 +264,7 @@ public STATE onHeadersReceived(HttpResponseHeaders headers) throws Exception {
}

HeaderUtils.checkHeaderChanges(clientHeadersSnapshot, request.getHeaders(),
GrizzlyConnector.this.getClass().getName());
GrizzlyConnector.this.getClass().getName(), request.getConfiguration());
// hand-off to grizzly's application thread pool for response processing
processResponse(new Runnable() {
@Override
Expand Down Expand Up @@ -462,9 +462,10 @@ public OutputStream getOutputStream(int contentLength) throws IOException {
return baos.toByteArray();
}

private static Map<String, String> writeOutBoundHeaders(final MultivaluedMap<String, Object> headers,
private static Map<String, String> writeOutBoundHeaders(final ClientRequest clientRequest,
final com.ning.http.client.Request request) {
Map<String, String> stringHeaders = HeaderUtils.asStringHeadersSingleValue(headers);
Map<String, String> stringHeaders =
HeaderUtils.asStringHeadersSingleValue(clientRequest.getHeaders(), clientRequest.getConfiguration());

for (Map.Entry<String, String> e : stringHeaders.entrySet()) {
request.getHeaders().add(e.getKey(), e.getValue());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ class JettyConnector implements Connector {

private final HttpClient client;
private final CookieStore cookieStore;
private final Configuration configuration;

/**
* Create the new Jetty client connector.
Expand All @@ -137,6 +138,7 @@ class JettyConnector implements Connector {
* @param config client configuration.
*/
JettyConnector(final Client jaxrsClient, final Configuration config) {
this.configuration = config;
HttpClient httpClient = null;
if (config.isRegistered(JettyHttpClientSupplier.class)) {
Optional<Object> contract = config.getInstances().stream()
Expand Down Expand Up @@ -248,7 +250,7 @@ public ClientResponse apply(final ClientRequest jerseyRequest) throws Processing
try {
final ContentResponse jettyResponse = jettyRequest.send();
HeaderUtils.checkHeaderChanges(clientHeadersSnapshot, jerseyRequest.getHeaders(),
JettyConnector.this.getClass().getName());
JettyConnector.this.getClass().getName(), jerseyRequest.getConfiguration());

final javax.ws.rs.core.Response.StatusType status = jettyResponse.getReason() == null
? Statuses.from(jettyResponse.getStatus())
Expand Down Expand Up @@ -306,8 +308,8 @@ private Request translateRequest(final ClientRequest clientRequest) {
return request;
}

private static Map<String, String> writeOutBoundHeaders(final MultivaluedMap<String, Object> headers, final Request request) {
final Map<String, String> stringHeaders = HeaderUtils.asStringHeadersSingleValue(headers);
private Map<String, String> writeOutBoundHeaders(final MultivaluedMap<String, Object> headers, final Request request) {
final Map<String, String> stringHeaders = HeaderUtils.asStringHeadersSingleValue(headers, configuration);

// remove User-agent header set by Jetty; Jersey already sets this in its request (incl. Jetty version)
request.getHeaders().remove(HttpHeader.USER_AGENT);
Expand Down Expand Up @@ -396,7 +398,7 @@ public Future<?> apply(final ClientRequest jerseyRequest, final AsyncConnectorCa
@Override
public void onHeaders(final Response jettyResponse) {
HeaderUtils.checkHeaderChanges(clientHeadersSnapshot, jerseyRequest.getHeaders(),
JettyConnector.this.getClass().getName());
JettyConnector.this.getClass().getName(), jerseyRequest.getConfiguration());

if (responseFuture.isDone()) {
if (!callbackInvoked.compareAndSet(false, true)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -338,8 +338,11 @@ public void service(final Request request, final Response response) {
URI baseUri = getBaseUri(request);
URI requestUri = getRequestUri(request);
final ContainerRequest requestContext = new ContainerRequest(baseUri,
requestUri, request.getMethod().getMethodString(),
getSecurityContext(request), new GrizzlyRequestPropertiesDelegate(request));
requestUri,
request.getMethod().getMethodString(),
getSecurityContext(request),
new GrizzlyRequestPropertiesDelegate(request),
appHandler.getConfiguration());
requestContext.setEntityStream(request.getInputStream());
for (final String headerName : request.getHeaderNames()) {
requestContext.headers(headerName, request.getHeaders(headerName));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ public void handle(final HttpExchange exchange) throws IOException {
final ResponseWriter responseWriter = new ResponseWriter(exchange);
final ContainerRequest requestContext = new ContainerRequest(baseUri, requestUri,
exchange.getRequestMethod(), getSecurityContext(exchange.getPrincipal(), isSecure),
new MapPropertiesDelegate());
new MapPropertiesDelegate(), appHandler.getConfiguration());
requestContext.setEntityStream(exchange.getRequestBody());
requestContext.getHeaders().putAll(exchange.getRequestHeaders());
requestContext.setWriter(responseWriter);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -385,7 +385,9 @@ public Integer get() {

try {
final ContainerRequest requestContext = new ContainerRequest(baseUri, requestUri, servletRequest.getMethod(),
getSecurityContext(servletRequest), new ServletPropertiesDelegate(servletRequest));
getSecurityContext(servletRequest), new ServletPropertiesDelegate(servletRequest),
appHandler.getConfiguration()
);

initContainerRequest(requestContext, servletRequest, servletResponse, responseWriter);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,8 @@ public void handle(final String target, final Request request, final HttpServlet
requestUri,
request.getMethod(),
getSecurityContext(request),
new MapPropertiesDelegate());
new MapPropertiesDelegate(),
appHandler.getConfiguration());
requestContext.setEntityStream(request.getInputStream());
final Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import io.netty.handler.ssl.ApplicationProtocolNames;
import io.netty.handler.ssl.ApplicationProtocolNegotiationHandler;
import io.netty.handler.stream.ChunkedWriteHandler;
import org.glassfish.jersey.server.ResourceConfig;

/**
* Choose the handler implementation based on Http protocol.
Expand All @@ -34,26 +35,28 @@ class HttpVersionChooser extends ApplicationProtocolNegotiationHandler {

private final URI baseUri;
private final NettyHttpContainer container;
private final ResourceConfig resourceConfig;

HttpVersionChooser(URI baseUri, NettyHttpContainer container) {
HttpVersionChooser(URI baseUri, NettyHttpContainer container, ResourceConfig resourceConfig) {
super(ApplicationProtocolNames.HTTP_1_1);

this.baseUri = baseUri;
this.container = container;
this.resourceConfig = resourceConfig;
}

@Override
protected void configurePipeline(ChannelHandlerContext ctx, String protocol) throws Exception {
if (ApplicationProtocolNames.HTTP_2.equals(protocol)) {
ctx.pipeline().addLast(Http2MultiplexCodecBuilder.forServer(
new JerseyHttp2ServerHandler(baseUri, container)).build());
new JerseyHttp2ServerHandler(baseUri, container, resourceConfig)).build());
return;
}

if (ApplicationProtocolNames.HTTP_1_1.equals(protocol)) {
ctx.pipeline().addLast(new HttpServerCodec(),
new ChunkedWriteHandler(),
new JerseyServerHandler(baseUri, container));
new JerseyServerHandler(baseUri, container, resourceConfig));
return;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import org.glassfish.jersey.internal.PropertiesDelegate;
import org.glassfish.jersey.netty.connector.internal.NettyInputStream;
import org.glassfish.jersey.server.ContainerRequest;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.internal.ContainerUtils;

/**
Expand All @@ -56,16 +57,19 @@ class JerseyHttp2ServerHandler extends ChannelDuplexHandler {
private final URI baseUri;
private final LinkedBlockingDeque<InputStream> isList = new LinkedBlockingDeque<>();
private final NettyHttpContainer container;
private final ResourceConfig resourceConfig;

/**
* Constructor.
*
* @param baseUri base {@link URI} of the container (includes context path, if any).
* @param container Netty container implementation.
* @param baseUri base {@link URI} of the container (includes context path, if any).
* @param container Netty container implementation.
* @param resourceConfig the application {@link ResourceConfig}
*/
JerseyHttp2ServerHandler(URI baseUri, NettyHttpContainer container) {
JerseyHttp2ServerHandler(URI baseUri, NettyHttpContainer container, ResourceConfig resourceConfig) {
this.baseUri = baseUri;
this.container = container;
this.resourceConfig = resourceConfig;
}

@Override
Expand Down Expand Up @@ -151,7 +155,7 @@ public void setProperty(String name, Object object) {
public void removeProperty(String name) {
properties.remove(name);
}
});
}, resourceConfig);

// request entity handling.
if (!http2Headers.isEndStream()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,11 @@
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.security.Principal;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.LinkedBlockingDeque;

import javax.ws.rs.core.SecurityContext;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufInputStream;
import io.netty.channel.ChannelHandlerContext;
Expand All @@ -43,8 +40,8 @@
import io.netty.util.concurrent.GenericFutureListener;
import org.glassfish.jersey.internal.PropertiesDelegate;
import org.glassfish.jersey.netty.connector.internal.NettyInputStream;
import org.glassfish.jersey.netty.httpserver.NettySecurityContext;
import org.glassfish.jersey.server.ContainerRequest;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.internal.ContainerUtils;

/**
Expand All @@ -58,16 +55,19 @@ class JerseyServerHandler extends ChannelInboundHandlerAdapter {
private final URI baseUri;
private final LinkedBlockingDeque<InputStream> isList = new LinkedBlockingDeque<>();
private final NettyHttpContainer container;
private final ResourceConfig resourceConfig;

/**
* Constructor.
*
* @param baseUri base {@link URI} of the container (includes context path, if any).
* @param container Netty container implementation.
* @param resourceConfig the application {@link ResourceConfig}
*/
public JerseyServerHandler(URI baseUri, NettyHttpContainer container) {
public JerseyServerHandler(URI baseUri, NettyHttpContainer container, ResourceConfig resourceConfig) {
this.baseUri = baseUri;
this.container = container;
this.resourceConfig = resourceConfig;
}

@Override
Expand Down Expand Up @@ -146,7 +146,7 @@ public void setProperty(String name, Object object) {
public void removeProperty(String name) {
properties.remove(name);
}
});
}, resourceConfig);

// request entity handling.
if ((req.headers().contains(HttpHeaderNames.CONTENT_LENGTH) && HttpUtil.getContentLength(req) > 0)
Expand Down
Loading