1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.client;
20
21 import java.util.List;
22
23 import org.eclipse.jetty.client.api.Request;
24 import org.eclipse.jetty.client.api.Response;
25 import org.eclipse.jetty.client.api.Result;
26 import org.eclipse.jetty.client.util.BufferingResponseListener;
27 import org.eclipse.jetty.http.HttpHeader;
28 import org.eclipse.jetty.http.HttpHeaderValue;
29
30
31
32
33 public class ContinueProtocolHandler implements ProtocolHandler
34 {
35 public static final String NAME = "continue";
36 private static final String ATTRIBUTE = ContinueProtocolHandler.class.getName() + ".100continue";
37
38 private final ResponseNotifier notifier;
39
40 public ContinueProtocolHandler()
41 {
42 this.notifier = new ResponseNotifier();
43 }
44
45 @Override
46 public String getName()
47 {
48 return NAME;
49 }
50
51 @Override
52 public boolean accept(Request request, Response response)
53 {
54 boolean expect100 = request.getHeaders().contains(HttpHeader.EXPECT, HttpHeaderValue.CONTINUE.asString());
55 HttpConversation conversation = ((HttpRequest)request).getConversation();
56 boolean handled100 = conversation.getAttribute(ATTRIBUTE) != null;
57 return expect100 && !handled100;
58 }
59
60 @Override
61 public Response.Listener getResponseListener()
62 {
63
64 return new ContinueListener();
65 }
66
67 protected void onContinue(Request request)
68 {
69 }
70
71 protected class ContinueListener extends BufferingResponseListener
72 {
73 @Override
74 public void onSuccess(Response response)
75 {
76
77
78
79 Request request = response.getRequest();
80 HttpConversation conversation = ((HttpRequest)request).getConversation();
81
82 conversation.setAttribute(ATTRIBUTE, Boolean.TRUE);
83
84
85 conversation.updateResponseListeners(null);
86
87 HttpExchange exchange = conversation.getExchanges().peekLast();
88 assert exchange.getResponse() == response;
89 switch (response.getStatus())
90 {
91 case 100:
92 {
93
94 exchange.resetResponse();
95 exchange.proceed(null);
96 onContinue(request);
97 break;
98 }
99 default:
100 {
101
102
103
104 List<Response.ResponseListener> listeners = exchange.getResponseListeners();
105 HttpContentResponse contentResponse = new HttpContentResponse(response, getContent(), getMediaType(), getEncoding());
106 notifier.forwardSuccess(listeners, contentResponse);
107 exchange.proceed(new HttpRequestException("Expectation failed", request));
108 break;
109 }
110 }
111 }
112
113 @Override
114 public void onFailure(Response response, Throwable failure)
115 {
116 HttpConversation conversation = ((HttpRequest)response.getRequest()).getConversation();
117
118 conversation.setAttribute(ATTRIBUTE, Boolean.TRUE);
119
120 conversation.updateResponseListeners(null);
121
122 HttpExchange exchange = conversation.getExchanges().peekLast();
123 assert exchange.getResponse() == response;
124 List<Response.ResponseListener> listeners = exchange.getResponseListeners();
125 HttpContentResponse contentResponse = new HttpContentResponse(response, getContent(), getMediaType(), getEncoding());
126 notifier.forwardFailureComplete(listeners, exchange.getRequest(), exchange.getRequestFailure(), contentResponse, failure);
127 }
128
129 @Override
130 public void onComplete(Result result)
131 {
132 }
133 }
134 }