1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package org.apache.hc.core5.http.io.support;
28
29 import java.io.IOException;
30
31 import org.apache.hc.core5.annotation.Contract;
32 import org.apache.hc.core5.annotation.ThreadingBehavior;
33 import org.apache.hc.core5.http.ClassicHttpRequest;
34 import org.apache.hc.core5.http.ClassicHttpResponse;
35 import org.apache.hc.core5.http.HttpEntity;
36 import org.apache.hc.core5.http.HttpException;
37 import org.apache.hc.core5.http.HttpResponse;
38 import org.apache.hc.core5.http.HttpStatus;
39 import org.apache.hc.core5.http.io.HttpFilterChain;
40 import org.apache.hc.core5.http.io.HttpFilterHandler;
41 import org.apache.hc.core5.http.message.BasicClassicHttpResponse;
42 import org.apache.hc.core5.http.support.ExpectSupport;
43 import org.apache.hc.core5.http.support.Expectation;
44 import org.apache.hc.core5.http.protocol.HttpContext;
45
46
47
48
49
50
51
52 @Contract(threading = ThreadingBehavior.STATELESS)
53 public class HttpServerExpectationFilter implements HttpFilterHandler {
54
55
56
57
58
59
60
61
62
63 protected boolean verify(final ClassicHttpRequest request, final HttpContext context) throws HttpException {
64 return true;
65 }
66
67
68
69
70
71
72
73
74
75 protected HttpEntity generateResponseContent(final HttpResponse expectationFailed) throws HttpException {
76 return null;
77 }
78
79 @Override
80 public final void handle(
81 final ClassicHttpRequest request,
82 final HttpFilterChain.ResponseTrigger responseTrigger,
83 final HttpContext context,
84 final HttpFilterChain chain) throws HttpException, IOException {
85 final Expectation expectation = ExpectSupport.parse(request, request.getEntity());
86 if (expectation == Expectation.CONTINUE) {
87 final boolean verified = verify(request, context);
88 if (verified) {
89 responseTrigger.sendInformation(new BasicClassicHttpResponse(HttpStatus.SC_CONTINUE));
90 } else {
91 final ClassicHttpResponse expectationFailed = new BasicClassicHttpResponse(HttpStatus.SC_EXPECTATION_FAILED);
92 final HttpEntity responseContent = generateResponseContent(expectationFailed);
93 expectationFailed.setEntity(responseContent);
94 responseTrigger.submitResponse(expectationFailed);
95 return;
96 }
97 } else if (expectation == Expectation.UNKNOWN) {
98 final ClassicHttpResponse expectationFailed = new BasicClassicHttpResponse(HttpStatus.SC_EXPECTATION_FAILED);
99 final HttpEntity responseContent = generateResponseContent(expectationFailed);
100 expectationFailed.setEntity(responseContent);
101 responseTrigger.submitResponse(expectationFailed);
102 return;
103 }
104 chain.proceed(request, responseTrigger, context);
105 }
106 }