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

Immutable HttpFields and MetaData #4777

Merged
merged 45 commits into from
Apr 28, 2020
Merged
Show file tree
Hide file tree
Changes from 36 commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
e37a34c
Immutable version of HttpFields
gregw Apr 15, 2020
75df043
Immutable version of HttpFields
gregw Apr 15, 2020
753e02c
Immutable version of HttpFields
gregw Apr 15, 2020
53bf5a5
Immutable version of HttpFields
gregw Apr 15, 2020
d9837d9
Immutable MetaData
gregw Apr 16, 2020
f2f08e5
Immutable MetaData
gregw Apr 16, 2020
8d5b036
Immutable MetaData
gregw Apr 17, 2020
8de4fb6
Immutable MetaData
gregw Apr 17, 2020
c1010f3
Immutable MetaData
gregw Apr 17, 2020
1bb6ba4
Merge remote-tracking branch 'origin/jetty-10.0.x' into jetty-10.0.x-…
gregw Apr 18, 2020
c0b98a3
Immutable MetaData
gregw Apr 18, 2020
4c334e8
Immutable MetaData
gregw Apr 18, 2020
23bcdd2
Immutable MetaData
gregw Apr 19, 2020
a953f42
Immutable MetaData WIP
gregw Apr 19, 2020
fb81db1
Immutable MetaData WIP
gregw Apr 20, 2020
372455a
Immutable MetaData WIP
gregw Apr 20, 2020
58e458c
Immutable MetaData WIP
gregw Apr 20, 2020
0215268
Immutable MetaData WIP
gregw Apr 20, 2020
90aae8b
Merge branch 'jetty-10.0.x' into jetty-10.0.x-ImmutableMetaData
gregw Apr 20, 2020
c23ea62
Immutable MetaData WIP
gregw Apr 20, 2020
cf6df85
Immutable MetaData WIP
gregw Apr 20, 2020
e8617da
Immutable MetaData WIP
gregw Apr 20, 2020
a2d05a1
Immutable MetaData WIP
gregw Apr 20, 2020
f6387a0
Immutable MetaData WIP
gregw Apr 21, 2020
d1b62c7
Immutable MetaData WIP
gregw Apr 21, 2020
79c453b
Immutable MetaData WIP
gregw Apr 21, 2020
8943b9b
Immutable MetaData WIP
gregw Apr 21, 2020
89aa969
Immutable MetaData WIP
gregw Apr 21, 2020
0ac9421
Merge remote-tracking branch 'origin/jetty-10.0.x' into jetty-10.0.x-…
gregw Apr 22, 2020
915f324
Immutable MetaData WIP
gregw Apr 22, 2020
3de51af
Immutable MetaData WIP
gregw Apr 22, 2020
dd154dd
Immutable Metadata
gregw Apr 22, 2020
3c5e8b6
Merge branch 'jetty-10.0.x' into jetty-10.0.x-ImmutableMetaData
gregw Apr 22, 2020
3749a5c
Immutable MetaData WIP
gregw Apr 22, 2020
5971476
Merge remote-tracking branch 'origin/jetty-10.0.x' into jetty-10.0.x-…
gregw Apr 23, 2020
fa86645
Immutable MetaData WIP
gregw Apr 23, 2020
c71cb54
Immutable MetaData WIP
gregw Apr 23, 2020
1fe4169
Immutable MetaData WIP
gregw Apr 23, 2020
9e9274f
Immutable MetaData WIP
gregw Apr 24, 2020
1abe2c7
Immutable MetaData
gregw Apr 24, 2020
ad82672
Immutable MetaData
gregw Apr 24, 2020
ec9224d
Immutable MetaData
gregw Apr 24, 2020
5817a1a
private
gregw Apr 27, 2020
ac3cb3c
Merge remote-tracking branch 'origin/jetty-10.0.x' into jetty-10.0.x-…
gregw Apr 27, 2020
79bb9f7
Merge branch 'jetty-10.0.x' into jetty-10.0.x-ImmutableMetaData
gregw Apr 28, 2020
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 @@ -74,9 +74,8 @@ public void testConscryptHTTP2Client() throws Exception
client.connect(sslContextFactory, new InetSocketAddress(host, port), new Session.Listener.Adapter(), sessionPromise);
Session session = sessionPromise.get(15, TimeUnit.SECONDS);

HttpFields requestFields = new HttpFields();
requestFields.put("User-Agent", client.getClass().getName() + "/" + Jetty.VERSION);
MetaData.Request metaData = new MetaData.Request("GET", new HttpURI("https://" + host + ":" + port + "/"), HttpVersion.HTTP_2, requestFields);
HttpFields requestFields = HttpFields.build().put("User-Agent", client.getClass().getName() + "/" + Jetty.VERSION);
MetaData.Request metaData = new MetaData.Request("GET", HttpURI.from("https://" + host + ":" + port + "/"), HttpVersion.HTTP_2, requestFields);
HeadersFrame headersFrame = new HeadersFrame(metaData, null, true);
CountDownLatch latch = new CountDownLatch(1);
session.newStream(headersFrame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,9 @@ public void testJDK9HTTP2Client() throws Exception
client.connect(sslContextFactory, new InetSocketAddress(host, port), new Session.Listener.Adapter(), sessionPromise);
Session session = sessionPromise.get(15, TimeUnit.SECONDS);

HttpFields requestFields = new HttpFields();
HttpFields.Mutable requestFields = HttpFields.build();
requestFields.put("User-Agent", client.getClass().getName() + "/" + Jetty.VERSION);
MetaData.Request metaData = new MetaData.Request("GET", new HttpURI("https://" + host + ":" + port + "/"), HttpVersion.HTTP_2, requestFields);
MetaData.Request metaData = new MetaData.Request("GET", HttpURI.from("https://" + host + ":" + port + "/"), HttpVersion.HTTP_2, requestFields);
HeadersFrame headersFrame = new HeadersFrame(metaData, null, true);
CountDownLatch latch = new CountDownLatch(1);
session.newStream(headersFrame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,7 @@ private void copyIfAbsent(HttpRequest oldRequest, Request newRequest, HttpHeader
{
HttpField field = oldRequest.getHeaders().getField(header);
if (field != null && !newRequest.getHeaders().contains(header))
newRequest.getHeaders().put(field);
newRequest.put(field);
}

private void forwardSuccessComplete(HttpRequest request, Response response)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import org.eclipse.jetty.client.api.Request;
import org.eclipse.jetty.client.api.Response;
import org.eclipse.jetty.client.util.BytesRequestContent;
import org.eclipse.jetty.http.HttpField;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.HttpVersion;
Expand Down Expand Up @@ -151,8 +152,8 @@ protected void normalizeRequest(Request request)
HttpFields headers = request.getHeaders();
if (version.getVersion() <= 11)
{
if (!headers.containsKey(HttpHeader.HOST.asString()))
headers.put(getHttpDestination().getHostField());
if (!headers.contains(HttpHeader.HOST))
request.put(getHttpDestination().getHostField());
}

// Add content headers
Expand All @@ -163,25 +164,25 @@ protected void normalizeRequest(Request request)
}
else
{
if (!headers.containsKey(HttpHeader.CONTENT_TYPE.asString()))
if (!headers.contains(HttpHeader.CONTENT_TYPE))
{
String contentType = content.getContentType();
if (contentType != null)
{
headers.put(HttpHeader.CONTENT_TYPE, contentType);
request.put(new HttpField(HttpHeader.CONTENT_TYPE, contentType));
}
else
{
contentType = getHttpClient().getDefaultRequestContentType();
if (contentType != null)
headers.put(HttpHeader.CONTENT_TYPE, contentType);
request.put(new HttpField(HttpHeader.CONTENT_TYPE, contentType));
}
}
long contentLength = content.getLength();
if (contentLength >= 0)
{
if (!headers.containsKey(HttpHeader.CONTENT_LENGTH.asString()))
headers.put(HttpHeader.CONTENT_LENGTH, String.valueOf(contentLength));
if (!headers.contains(HttpHeader.CONTENT_LENGTH))
request.put(new HttpField.LongValueHttpField(HttpHeader.CONTENT_LENGTH, contentLength));
}
}

Expand All @@ -194,7 +195,7 @@ protected void normalizeRequest(Request request)
cookies = convertCookies(HttpCookieStore.matchPath(uri, cookieStore.get(uri)), null);
cookies = convertCookies(request.getCookies(), cookies);
if (cookies != null)
request.header(HttpHeader.COOKIE.asString(), cookies.toString());
request.header(HttpHeader.COOKIE, cookies.toString());
}

// Authentication
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ protected boolean responseHeader(HttpExchange exchange, HttpField field)
boolean process = notifier.notifyHeader(exchange.getConversation().getResponseListeners(), response, field);
if (process)
{
response.getHeaders().add(field);
response.getHeadersBuilder().add(field);
HttpHeader fieldHeader = field.getHeader();
if (fieldHeader != null)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public class HttpRequest implements Request
{
private static final URI NULL_URI = URI.create("null:0");

private final HttpFields headers = new HttpFields();
private final HttpFields.Mutable headers = HttpFields.build();
private final Fields params = new Fields(true);
private final List<Response.ResponseListener> responseListeners = new ArrayList<>();
private final AtomicReference<Throwable> aborted = new AtomicReference<>();
Expand Down Expand Up @@ -289,6 +289,34 @@ public Request accept(String... accepts)
return this;
}

@Override
public Request set(HttpFields fields)
{
headers.clear().add(fields);
return this;
}

@Override
public Request remove(HttpHeader header)
{
headers.remove(header);
return this;
}

@Override
public Request put(HttpField field)
{
headers.put(field);
return this;
}

@Override
public Request add(HttpField field)
{
headers.add(field);
return this;
}

@Override
public Request header(String name, String value)
{
Expand Down Expand Up @@ -353,7 +381,7 @@ public Map<String, Object> getAttributes()
}

@Override
public HttpFields getHeaders()
public HttpFields.Mutable getHeaders()
gregw marked this conversation as resolved.
Show resolved Hide resolved
{
return headers;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,13 @@

public class HttpResponse implements Response
{
private final HttpFields headers = new HttpFields();
private final HttpFields.Mutable headers = HttpFields.build();
private final Request request;
private final List<ResponseListener> listeners;
private HttpVersion version;
private int status;
private String reason;
private HttpFields trailers;
private HttpFields.Mutable trailers;

public HttpResponse(Request request, List<ResponseListener> listeners)
{
Expand Down Expand Up @@ -87,6 +87,11 @@ public HttpResponse reason(String reason)

@Override
public HttpFields getHeaders()
{
return headers.asImmutable();
}

public HttpFields.Mutable getHeadersBuilder()
{
return headers;
}
Expand All @@ -103,15 +108,15 @@ public <T extends ResponseListener> List<T> getListeners(Class<T> type)
return result;
}

public HttpFields getTrailers()
public HttpFields.Mutable getTrailers()
gregw marked this conversation as resolved.
Show resolved Hide resolved
{
return trailers;
}

public HttpResponse trailer(HttpField trailer)
{
if (trailers == null)
trailers = new HttpFields();
trailers = HttpFields.build();
trailers.add(trailer);
return this;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@

import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.client.util.InputStreamResponseListener;
import org.eclipse.jetty.http.HttpField;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.HttpMethod;
Expand Down Expand Up @@ -152,6 +153,32 @@ public interface Request
*/
HttpFields getHeaders();

/** Set the headers, clearing any existing headers
* @param fields The fields to set
* @return this request object
*/
Request set(HttpFields fields);

/**
* @param header the header to remove
* @return this request object
*/
Request remove(HttpHeader header);

/**
* @param field the field to add
* @return this request object
* @see #header(HttpHeader, String)
*/
Request add(HttpField field);

/**
* @param field the field to put
* @return this request object
* @see #header(HttpHeader, String)
*/
Request put(HttpField field);

gregw marked this conversation as resolved.
Show resolved Hide resolved
/**
* @param name the name of the header
* @param value the value of the header
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,7 @@ protected void sendHeaders(HttpExchange exchange, ByteBuffer contentBuffer, bool
String query = request.getQuery();
if (query != null)
path += "?" + query;
metaData = new MetaData.Request(request.getMethod(), new HttpURI(path), request.getVersion(), request.getHeaders(), contentLength);
metaData.setTrailerSupplier(request.getTrailers());
metaData = new MetaData.Request(request.getMethod(), HttpURI.from(path), request.getVersion(), request.getHeaders(), contentLength, request.getTrailers());
if (LOG.isDebugEnabled())
LOG.debug("Sending headers with content {} last={} for {}", BufferUtil.toDetailString(contentBuffer), lastContent, exchange.getRequest());
headersCallback.iterate();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public void onHeaders(Response response)

Request request = response.getRequest();
HttpFields headers = response.getHeaders();
long length = headers.getLongField(HttpHeader.CONTENT_LENGTH.asString());
long length = headers.getLongField(HttpHeader.CONTENT_LENGTH);
if (HttpMethod.HEAD.is(request.getMethod()))
length = 0;
if (length > maxLength)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ public void fail(Throwable failure)
* @param content the part content
* @param fields the headers associated with this part
*/
public void addFieldPart(String name, Request.Content content, HttpFields fields)
public void addFieldPart(String name, Request.Content content, HttpFields.Mutable fields)
gregw marked this conversation as resolved.
Show resolved Hide resolved
{
addPart(new Part(name, null, content, fields));
}
Expand All @@ -164,7 +164,7 @@ public void addFieldPart(String name, Request.Content content, HttpFields fields
* @param content the part content
* @param fields the headers associated with this part
*/
public void addFilePart(String name, String fileName, Request.Content content, HttpFields fields)
public void addFilePart(String name, String fileName, Request.Content content, HttpFields.Mutable fields)
gregw marked this conversation as resolved.
Show resolved Hide resolved
{
addPart(new Part(name, fileName, content, fields));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -249,8 +249,7 @@ public void handle(String target, Request baseRequest, HttpServletRequest reques
DuplexConnectionPool connectionPool = (DuplexConnectionPool)destination.getConnectionPool();
HttpConnectionOverHTTP connection = (HttpConnectionOverHTTP)connectionPool.getActiveConnections().iterator().next();
assertFalse(connection.getEndPoint().isOutputShutdown());
})
.onResponseHeaders(r -> r.getHeaders().remove(HttpHeader.CONNECTION));
gregw marked this conversation as resolved.
Show resolved Hide resolved
});
ContentResponse response = request.send();

assertEquals(HttpStatus.OK_200, response.getStatus());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ public void test303(Scenario scenario) throws Exception
.send();
assertNotNull(response);
assertEquals(200, response.getStatus());
assertFalse(response.getHeaders().containsKey(HttpHeader.LOCATION.asString()));
assertFalse(response.getHeaders().contains(HttpHeader.LOCATION.asString()));
gregw marked this conversation as resolved.
Show resolved Hide resolved
}

@ParameterizedTest
Expand All @@ -86,7 +86,7 @@ public void test303302(Scenario scenario) throws Exception
.send();
assertNotNull(response);
assertEquals(200, response.getStatus());
assertFalse(response.getHeaders().containsKey(HttpHeader.LOCATION.asString()));
assertFalse(response.getHeaders().contains(HttpHeader.LOCATION.asString()));
}

@ParameterizedTest
Expand All @@ -102,7 +102,7 @@ public void test303302OnDifferentDestinations(Scenario scenario) throws Exceptio
.send();
assertNotNull(response);
assertEquals(200, response.getStatus());
assertFalse(response.getHeaders().containsKey(HttpHeader.LOCATION.asString()));
assertFalse(response.getHeaders().contains(HttpHeader.LOCATION.asString()));
}

@ParameterizedTest
Expand All @@ -119,7 +119,7 @@ public void test301(Scenario scenario) throws Exception
.send();
assertNotNull(response);
assertEquals(200, response.getStatus());
assertFalse(response.getHeaders().containsKey(HttpHeader.LOCATION.asString()));
assertFalse(response.getHeaders().contains(HttpHeader.LOCATION.asString()));
}

@ParameterizedTest
Expand All @@ -139,7 +139,7 @@ public void test301WithWrongMethod(Scenario scenario) throws Exception
Response response = xx.getResponse();
assertNotNull(response);
assertEquals(301, response.getStatus());
assertTrue(response.getHeaders().containsKey(HttpHeader.LOCATION.asString()));
assertTrue(response.getHeaders().contains(HttpHeader.LOCATION.asString()));
}

@ParameterizedTest
Expand All @@ -158,7 +158,7 @@ public void test307WithRequestContent(Scenario scenario) throws Exception
.send();
assertNotNull(response);
assertEquals(200, response.getStatus());
assertFalse(response.getHeaders().containsKey(HttpHeader.LOCATION.asString()));
assertFalse(response.getHeaders().contains(HttpHeader.LOCATION.asString()));
assertArrayEquals(data, response.getContent());
}

Expand All @@ -179,7 +179,7 @@ public void testMaxRedirections(Scenario scenario) throws Exception
Response response = xx.getResponse();
assertNotNull(response);
assertEquals(302, response.getStatus());
assertTrue(response.getHeaders().containsKey(HttpHeader.LOCATION.asString()));
assertTrue(response.getHeaders().contains(HttpHeader.LOCATION.asString()));
}

@ParameterizedTest
Expand All @@ -195,7 +195,7 @@ public void test303WithConnectionCloseWithBigRequest(Scenario scenario) throws E
.send();
assertNotNull(response);
assertEquals(200, response.getStatus());
assertFalse(response.getHeaders().containsKey(HttpHeader.LOCATION.asString()));
assertFalse(response.getHeaders().contains(HttpHeader.LOCATION.asString()));
}

@ParameterizedTest
Expand All @@ -212,7 +212,7 @@ public void testDontFollowRedirects(Scenario scenario) throws Exception
.send();
assertNotNull(response);
assertEquals(303, response.getStatus());
assertTrue(response.getHeaders().containsKey(HttpHeader.LOCATION.asString()));
assertTrue(response.getHeaders().contains(HttpHeader.LOCATION.asString()));
}

@ParameterizedTest
Expand All @@ -228,7 +228,7 @@ public void testRelativeLocation(Scenario scenario) throws Exception
.send();
assertNotNull(response);
assertEquals(200, response.getStatus());
assertFalse(response.getHeaders().containsKey(HttpHeader.LOCATION.asString()));
assertFalse(response.getHeaders().contains(HttpHeader.LOCATION.asString()));
}

@ParameterizedTest
Expand All @@ -244,7 +244,7 @@ public void testAbsoluteURIPathWithSpaces(Scenario scenario) throws Exception
.send();
assertNotNull(response);
assertEquals(200, response.getStatus());
assertFalse(response.getHeaders().containsKey(HttpHeader.LOCATION.asString()));
assertFalse(response.getHeaders().contains(HttpHeader.LOCATION.asString()));
}

@ParameterizedTest
Expand All @@ -260,7 +260,7 @@ public void testRelativeURIPathWithSpaces(Scenario scenario) throws Exception
.send();
assertNotNull(response);
assertEquals(200, response.getStatus());
assertFalse(response.getHeaders().containsKey(HttpHeader.LOCATION.asString()));
assertFalse(response.getHeaders().contains(HttpHeader.LOCATION.asString()));
}

@ParameterizedTest
Expand Down
Loading