Skip to content

Commit c8b60ae

Browse files
committed
Revert "HTTPCLIENT-1482: added ExpectContinueTrigger, extended RequestConfig, and modified RequestExpectContinue so that Expect: 100-continue is emitted only when the underlying connection has already processed at least one request; default behaviour (ALWAYS) preserved, API remains binary-compatible. (#683)"
This reverts commit 97fd931
1 parent 8f3d3fc commit c8b60ae

File tree

4 files changed

+6
-187
lines changed

4 files changed

+6
-187
lines changed

httpclient5/src/main/java/org/apache/hc/client5/http/config/ExpectContinueTrigger.java

Lines changed: 0 additions & 50 deletions
This file was deleted.

httpclient5/src/main/java/org/apache/hc/client5/http/config/RequestConfig.java

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import org.apache.hc.core5.annotation.ThreadingBehavior;
3737
import org.apache.hc.core5.http.HttpHost;
3838
import org.apache.hc.core5.http2.priority.PriorityValue;
39-
import org.apache.hc.core5.util.Args;
4039
import org.apache.hc.core5.util.TimeValue;
4140
import org.apache.hc.core5.util.Timeout;
4241

@@ -68,9 +67,6 @@ public class RequestConfig implements Cloneable {
6867
private final boolean hardCancellationEnabled;
6968
private final boolean protocolUpgradeEnabled;
7069
private final Path unixDomainSocket;
71-
72-
private final ExpectContinueTrigger expectContinueTrigger;
73-
7470
/**
7571
* HTTP/2 Priority header value to emit when using H2+. Null means “don’t emit”.
7672
*/
@@ -82,7 +78,7 @@ public class RequestConfig implements Cloneable {
8278
protected RequestConfig() {
8379
this(false, null, null, false, false, 0, false, null, null,
8480
DEFAULT_CONNECTION_REQUEST_TIMEOUT, null, null, DEFAULT_CONN_KEEP_ALIVE, false, false, false, null,
85-
ExpectContinueTrigger.ALWAYS, null);
81+
null);
8682
}
8783

8884
RequestConfig(
@@ -103,7 +99,6 @@ protected RequestConfig() {
10399
final boolean hardCancellationEnabled,
104100
final boolean protocolUpgradeEnabled,
105101
final Path unixDomainSocket,
106-
final ExpectContinueTrigger expectContinueTrigger,
107102
final PriorityValue h2Priority) {
108103
super();
109104
this.expectContinueEnabled = expectContinueEnabled;
@@ -123,7 +118,6 @@ protected RequestConfig() {
123118
this.hardCancellationEnabled = hardCancellationEnabled;
124119
this.protocolUpgradeEnabled = protocolUpgradeEnabled;
125120
this.unixDomainSocket = unixDomainSocket;
126-
this.expectContinueTrigger = expectContinueTrigger;
127121
this.h2Priority = h2Priority;
128122
}
129123

@@ -249,10 +243,6 @@ public Path getUnixDomainSocket() {
249243
return unixDomainSocket;
250244
}
251245

252-
public ExpectContinueTrigger getExpectContinueTrigger() {
253-
return expectContinueTrigger;
254-
}
255-
256246
/**
257247
* Returns the HTTP/2+ priority preference for this request or {@code null} if unset.
258248
* @since 5.6
@@ -288,6 +278,7 @@ public String toString() {
288278
builder.append(", hardCancellationEnabled=").append(hardCancellationEnabled);
289279
builder.append(", protocolUpgradeEnabled=").append(protocolUpgradeEnabled);
290280
builder.append(", unixDomainSocket=").append(unixDomainSocket);
281+
builder.append(", h2Priority=").append(h2Priority);
291282
builder.append("]");
292283
return builder.toString();
293284
}
@@ -337,7 +328,6 @@ public static class Builder {
337328
private boolean hardCancellationEnabled;
338329
private boolean protocolUpgradeEnabled;
339330
private Path unixDomainSocket;
340-
private ExpectContinueTrigger expectContinueTrigger;
341331
private PriorityValue h2Priority;
342332

343333
Builder() {
@@ -349,7 +339,6 @@ public static class Builder {
349339
this.contentCompressionEnabled = true;
350340
this.hardCancellationEnabled = true;
351341
this.protocolUpgradeEnabled = true;
352-
this.expectContinueTrigger = ExpectContinueTrigger.ALWAYS;
353342
}
354343

355344
/**
@@ -697,20 +686,6 @@ public Builder setUnixDomainSocket(final Path unixDomainSocket) {
697686
return this;
698687
}
699688

700-
/**
701-
* Defines under which circumstances the client should add the
702-
* {@code Expect: 100-continue} header to entity-enclosing requests.
703-
*
704-
* @param trigger expectation-continue trigger strategy
705-
* @return this builder
706-
* @see ExpectContinueTrigger
707-
* @since 5.6
708-
*/
709-
public Builder setExpectContinueTrigger(final ExpectContinueTrigger trigger) {
710-
this.expectContinueTrigger = Args.notNull(trigger, "ExpectContinueTrigger");
711-
return this;
712-
}
713-
714689
/**
715690
* Sets HTTP/2+ request priority. If {@code null}, the header is not emitted.
716691
* @since 5.6
@@ -740,7 +715,6 @@ public RequestConfig build() {
740715
hardCancellationEnabled,
741716
protocolUpgradeEnabled,
742717
unixDomainSocket,
743-
expectContinueTrigger,
744718
h2Priority);
745719
}
746720

httpclient5/src/main/java/org/apache/hc/client5/http/protocol/RequestExpectContinue.java

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,9 @@
2929

3030
import java.io.IOException;
3131

32-
import org.apache.hc.client5.http.config.ExpectContinueTrigger;
3332
import org.apache.hc.client5.http.config.RequestConfig;
3433
import org.apache.hc.core5.annotation.Contract;
3534
import org.apache.hc.core5.annotation.ThreadingBehavior;
36-
import org.apache.hc.core5.http.EndpointDetails;
3735
import org.apache.hc.core5.http.EntityDetails;
3836
import org.apache.hc.core5.http.HeaderElements;
3937
import org.apache.hc.core5.http.HttpException;
@@ -43,7 +41,6 @@
4341
import org.apache.hc.core5.http.HttpVersion;
4442
import org.apache.hc.core5.http.ProtocolVersion;
4543
import org.apache.hc.core5.http.protocol.HttpContext;
46-
import org.apache.hc.core5.http.protocol.HttpCoreContext;
4744
import org.apache.hc.core5.util.Args;
4845

4946
/**
@@ -71,20 +68,13 @@ public void process(final HttpRequest request, final EntityDetails entity, final
7168
if (!request.containsHeader(HttpHeaders.EXPECT)) {
7269
final HttpClientContext clientContext = HttpClientContext.cast(context);
7370
final ProtocolVersion version = request.getVersion() != null ? request.getVersion() : clientContext.getProtocolVersion();
74-
final RequestConfig config = clientContext.getRequestConfigOrDefault();
75-
if (!config.isExpectContinueEnabled()) {
76-
return;
77-
}
78-
if (config.getExpectContinueTrigger() == ExpectContinueTrigger.IF_REUSED) {
79-
final EndpointDetails details = HttpCoreContext.cast(context).getEndpointDetails();
80-
if (details != null && details.getRequestCount() == 0) {
81-
return;
82-
}
83-
}
8471
// Do not send the expect header if request body is known to be empty
8572
if (entity != null
8673
&& entity.getContentLength() != 0 && !version.lessEquals(HttpVersion.HTTP_1_0)) {
87-
request.addHeader(HttpHeaders.EXPECT, HeaderElements.CONTINUE);
74+
final RequestConfig config = clientContext.getRequestConfigOrDefault();
75+
if (config.isExpectContinueEnabled()) {
76+
request.addHeader(HttpHeaders.EXPECT, HeaderElements.CONTINUE);
77+
}
8878
}
8979
}
9080
}

httpclient5/src/test/java/org/apache/hc/client5/http/protocol/TestRequestExpectContinue.java

Lines changed: 0 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,16 @@
2727

2828
package org.apache.hc.client5.http.protocol;
2929

30-
import java.net.InetSocketAddress;
3130
import java.nio.charset.StandardCharsets;
3231

33-
import org.apache.hc.client5.http.config.ExpectContinueTrigger;
3432
import org.apache.hc.client5.http.config.RequestConfig;
3533
import org.apache.hc.core5.http.ClassicHttpRequest;
3634
import org.apache.hc.core5.http.Header;
3735
import org.apache.hc.core5.http.HeaderElements;
38-
import org.apache.hc.core5.http.HttpConnectionMetrics;
3936
import org.apache.hc.core5.http.HttpHeaders;
4037
import org.apache.hc.core5.http.HttpVersion;
41-
import org.apache.hc.core5.http.impl.BasicEndpointDetails;
4238
import org.apache.hc.core5.http.io.entity.StringEntity;
4339
import org.apache.hc.core5.http.message.BasicClassicHttpRequest;
44-
import org.apache.hc.core5.util.Timeout;
4540
import org.junit.jupiter.api.Assertions;
4641
import org.junit.jupiter.api.Test;
4742

@@ -124,94 +119,4 @@ void testRequestExpectContinueIgnoreNonenclosingRequests() throws Exception {
124119
Assertions.assertEquals(0, request.getHeaders().length);
125120
}
126121

127-
128-
@Test
129-
void testRequestExpectContinueIfReused() throws Exception {
130-
final HttpClientContext context = HttpClientContext.create();
131-
final RequestConfig config = RequestConfig.custom()
132-
.setExpectContinueEnabled(true)
133-
.setExpectContinueTrigger(ExpectContinueTrigger.IF_REUSED)
134-
.build();
135-
context.setRequestConfig(config);
136-
137-
final HttpConnectionMetrics metrics = new HttpConnectionMetrics() {
138-
@Override
139-
public long getRequestCount() {
140-
return 1;
141-
}
142-
143-
@Override
144-
public long getResponseCount() {
145-
return 0;
146-
}
147-
148-
@Override
149-
public long getSentBytesCount() {
150-
return 0;
151-
}
152-
153-
@Override
154-
public long getReceivedBytesCount() {
155-
return 0;
156-
}
157-
};
158-
159-
final BasicEndpointDetails reused = new BasicEndpointDetails(
160-
new InetSocketAddress("localhost", 0),
161-
new InetSocketAddress("localhost", 80),
162-
metrics,
163-
Timeout.ofSeconds(30));
164-
context.setEndpointDetails(reused);
165-
166-
final ClassicHttpRequest request = new BasicClassicHttpRequest("POST", "/");
167-
request.setEntity(new StringEntity("data", StandardCharsets.US_ASCII));
168-
169-
new RequestExpectContinue().process(request, request.getEntity(), context);
170-
171-
final Header header = request.getFirstHeader(HttpHeaders.EXPECT);
172-
Assertions.assertNotNull(header);
173-
Assertions.assertEquals(HeaderElements.CONTINUE, header.getValue());
174-
}
175-
176-
@Test
177-
void testNoExpectContinueFreshConnectionWithIfReused() throws Exception {
178-
final HttpClientContext context = HttpClientContext.create();
179-
final RequestConfig cfg = RequestConfig.custom()
180-
.setExpectContinueEnabled(true)
181-
.setExpectContinueTrigger(ExpectContinueTrigger.IF_REUSED)
182-
.build();
183-
context.setRequestConfig(cfg);
184-
185-
// fresh endpoint: requestCount == 0
186-
context.setEndpointDetails(new BasicEndpointDetails(
187-
new InetSocketAddress("localhost", 0),
188-
new InetSocketAddress("localhost", 80),
189-
null,
190-
Timeout.ofSeconds(30)));
191-
192-
final ClassicHttpRequest req = new BasicClassicHttpRequest("POST", "/");
193-
req.setEntity(new StringEntity("data", StandardCharsets.US_ASCII));
194-
195-
new RequestExpectContinue().process(req, req.getEntity(), context);
196-
197-
Assertions.assertNull(req.getFirstHeader(HttpHeaders.EXPECT));
198-
}
199-
200-
@Test
201-
void testHeaderAlreadyPresentIsNotDuplicated() throws Exception {
202-
final HttpClientContext context = HttpClientContext.create();
203-
final RequestConfig cfg = RequestConfig.custom()
204-
.setExpectContinueEnabled(true)
205-
.build(); // default trigger = ALWAYS
206-
context.setRequestConfig(cfg);
207-
208-
final ClassicHttpRequest req = new BasicClassicHttpRequest("POST", "/");
209-
req.setEntity(new StringEntity("data", StandardCharsets.US_ASCII));
210-
req.addHeader(HttpHeaders.EXPECT, HeaderElements.CONTINUE); // pre-existing
211-
212-
new RequestExpectContinue().process(req, req.getEntity(), context);
213-
214-
final Header[] headers = req.getHeaders(HttpHeaders.EXPECT);
215-
Assertions.assertEquals(1, headers.length); // no duplicates
216-
}
217122
}

0 commit comments

Comments
 (0)