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.nio.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.EntityDetails;
34 import org.apache.hc.core5.http.Header;
35 import org.apache.hc.core5.http.HeaderElements;
36 import org.apache.hc.core5.http.HttpException;
37 import org.apache.hc.core5.http.HttpHeaders;
38 import org.apache.hc.core5.http.HttpRequest;
39 import org.apache.hc.core5.http.HttpResponse;
40 import org.apache.hc.core5.http.HttpStatus;
41 import org.apache.hc.core5.http.message.BasicHttpResponse;
42 import org.apache.hc.core5.http.nio.AsyncDataConsumer;
43 import org.apache.hc.core5.http.nio.AsyncEntityProducer;
44 import org.apache.hc.core5.http.nio.AsyncFilterChain;
45 import org.apache.hc.core5.http.nio.AsyncFilterHandler;
46 import org.apache.hc.core5.http.protocol.HttpContext;
47
48
49
50
51 @Contract(threading = ThreadingBehavior.STATELESS)
52 public class AsyncServerExpectationFilter implements AsyncFilterHandler {
53
54 protected boolean verify(final HttpRequest request, final HttpContext context) throws HttpException {
55 return true;
56 }
57
58 protected AsyncEntityProducer generateResponseContent(final HttpResponse expectationFailed) throws HttpException {
59 return null;
60 }
61
62 @Override
63 public final AsyncDataConsumer handle(
64 final HttpRequest request,
65 final EntityDetails entityDetails,
66 final HttpContext context,
67 final AsyncFilterChain.ResponseTrigger responseTrigger,
68 final AsyncFilterChain chain) throws HttpException, IOException {
69 if (entityDetails != null) {
70 final Header h = request.getFirstHeader(HttpHeaders.EXPECT);
71 if (h != null && HeaderElements.CONTINUE.equalsIgnoreCase(h.getValue())) {
72 final boolean verified = verify(request, context);
73 if (verified) {
74 responseTrigger.sendInformation(new BasicHttpResponse(HttpStatus.SC_CONTINUE));
75 } else {
76 final HttpResponse expectationFailed = new BasicHttpResponse(HttpStatus.SC_EXPECTATION_FAILED);
77 final AsyncEntityProducer responseContentProducer = generateResponseContent(expectationFailed);
78 responseTrigger.submitResponse(expectationFailed, responseContentProducer);
79 return null;
80 }
81 }
82 }
83 return chain.proceed(request, entityDetails, context, responseTrigger);
84 }
85
86 }