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.nio.ByteBuffer;
22 import java.util.Iterator;
23 import java.util.List;
24
25 import org.eclipse.jetty.client.api.ContentResponse;
26 import org.eclipse.jetty.client.api.Request;
27 import org.eclipse.jetty.client.api.Response;
28 import org.eclipse.jetty.client.api.Result;
29 import org.eclipse.jetty.http.HttpField;
30 import org.eclipse.jetty.util.log.Log;
31 import org.eclipse.jetty.util.log.Logger;
32
33 public class ResponseNotifier
34 {
35 private static final Logger LOG = Log.getLogger(ResponseNotifier.class);
36 private final HttpClient client;
37
38 public ResponseNotifier(HttpClient client)
39 {
40 this.client = client;
41 }
42
43 public void notifyBegin(List<Response.ResponseListener> listeners, Response response)
44 {
45
46 for (int i = 0; i < listeners.size(); ++i)
47 {
48 Response.ResponseListener listener = listeners.get(i);
49 if (listener instanceof Response.BeginListener)
50 notifyBegin((Response.BeginListener)listener, response);
51 }
52 }
53
54 private void notifyBegin(Response.BeginListener listener, Response response)
55 {
56 try
57 {
58 listener.onBegin(response);
59 }
60 catch (Exception x)
61 {
62 LOG.info("Exception while notifying listener " + listener, x);
63 }
64 }
65
66 public boolean notifyHeader(List<Response.ResponseListener> listeners, Response response, HttpField field)
67 {
68 boolean result = true;
69
70 for (int i = 0; i < listeners.size(); ++i)
71 {
72 Response.ResponseListener listener = listeners.get(i);
73 if (listener instanceof Response.HeaderListener)
74 result &= notifyHeader((Response.HeaderListener)listener, response, field);
75 }
76 return result;
77 }
78
79 private boolean notifyHeader(Response.HeaderListener listener, Response response, HttpField field)
80 {
81 try
82 {
83 return listener.onHeader(response, field);
84 }
85 catch (Exception x)
86 {
87 LOG.info("Exception while notifying listener " + listener, x);
88 return false;
89 }
90 }
91
92 public void notifyHeaders(List<Response.ResponseListener> listeners, Response response)
93 {
94
95 for (int i = 0; i < listeners.size(); ++i)
96 {
97 Response.ResponseListener listener = listeners.get(i);
98 if (listener instanceof Response.HeadersListener)
99 notifyHeaders((Response.HeadersListener)listener, response);
100 }
101 }
102
103 private void notifyHeaders(Response.HeadersListener listener, Response response)
104 {
105 try
106 {
107 listener.onHeaders(response);
108 }
109 catch (Exception x)
110 {
111 LOG.info("Exception while notifying listener " + listener, x);
112 }
113 }
114
115 public void notifyContent(List<Response.ResponseListener> listeners, Response response, ByteBuffer buffer)
116 {
117
118 for (int i = 0; i < listeners.size(); ++i)
119 {
120 Response.ResponseListener listener = listeners.get(i);
121 if (listener instanceof Response.ContentListener)
122 notifyContent((Response.ContentListener)listener, response, buffer);
123 }
124 }
125
126 private void notifyContent(Response.ContentListener listener, Response response, ByteBuffer buffer)
127 {
128 try
129 {
130 listener.onContent(response, buffer);
131 }
132 catch (Exception x)
133 {
134 LOG.info("Exception while notifying listener " + listener, x);
135 }
136 }
137
138 public void notifySuccess(List<Response.ResponseListener> listeners, Response response)
139 {
140
141 for (int i = 0; i < listeners.size(); ++i)
142 {
143 Response.ResponseListener listener = listeners.get(i);
144 if (listener instanceof Response.SuccessListener)
145 notifySuccess((Response.SuccessListener)listener, response);
146 }
147 }
148
149 private void notifySuccess(Response.SuccessListener listener, Response response)
150 {
151 try
152 {
153 listener.onSuccess(response);
154 }
155 catch (Exception x)
156 {
157 LOG.info("Exception while notifying listener " + listener, x);
158 }
159 }
160
161 public void notifyFailure(List<Response.ResponseListener> listeners, Response response, Throwable failure)
162 {
163
164 for (int i = 0; i < listeners.size(); ++i)
165 {
166 Response.ResponseListener listener = listeners.get(i);
167 if (listener instanceof Response.FailureListener)
168 notifyFailure((Response.FailureListener)listener, response, failure);
169 }
170 }
171
172 private void notifyFailure(Response.FailureListener listener, Response response, Throwable failure)
173 {
174 try
175 {
176 listener.onFailure(response, failure);
177 }
178 catch (Exception x)
179 {
180 LOG.info("Exception while notifying listener " + listener, x);
181 }
182 }
183
184 public void notifyComplete(List<Response.ResponseListener> listeners, Result result)
185 {
186
187 for (int i = 0; i < listeners.size(); ++i)
188 {
189 Response.ResponseListener listener = listeners.get(i);
190 if (listener instanceof Response.CompleteListener)
191 notifyComplete((Response.CompleteListener)listener, result);
192 }
193 }
194
195 private void notifyComplete(Response.CompleteListener listener, Result result)
196 {
197 try
198 {
199 listener.onComplete(result);
200 }
201 catch (Exception x)
202 {
203 LOG.info("Exception while notifying listener " + listener, x);
204 }
205 }
206
207 public void forwardSuccess(List<Response.ResponseListener> listeners, Response response)
208 {
209 notifyBegin(listeners, response);
210 for (Iterator<HttpField> iterator = response.getHeaders().iterator(); iterator.hasNext();)
211 {
212 HttpField field = iterator.next();
213 if (!notifyHeader(listeners, response, field))
214 iterator.remove();
215 }
216 notifyHeaders(listeners, response);
217 if (response instanceof ContentResponse)
218 notifyContent(listeners, response, ByteBuffer.wrap(((ContentResponse)response).getContent()));
219 notifySuccess(listeners, response);
220 }
221
222 public void forwardSuccessComplete(List<Response.ResponseListener> listeners, Request request, Response response)
223 {
224 HttpConversation conversation = client.getConversation(request.getConversationID(), false);
225 forwardSuccess(listeners, response);
226 conversation.complete();
227 notifyComplete(listeners, new Result(request, response));
228 }
229
230 public void forwardFailure(List<Response.ResponseListener> listeners, Response response, Throwable failure)
231 {
232 notifyBegin(listeners, response);
233 for (Iterator<HttpField> iterator = response.getHeaders().iterator(); iterator.hasNext();)
234 {
235 HttpField field = iterator.next();
236 if (!notifyHeader(listeners, response, field))
237 iterator.remove();
238 }
239 notifyHeaders(listeners, response);
240 if (response instanceof ContentResponse)
241 notifyContent(listeners, response, ByteBuffer.wrap(((ContentResponse)response).getContent()));
242 notifyFailure(listeners, response, failure);
243 }
244
245 public void forwardFailureComplete(List<Response.ResponseListener> listeners, Request request, Throwable requestFailure, Response response, Throwable responseFailure)
246 {
247 HttpConversation conversation = client.getConversation(request.getConversationID(), false);
248 forwardFailure(listeners, response, responseFailure);
249 conversation.complete();
250 notifyComplete(listeners, new Result(request, requestFailure, response, responseFailure));
251 }
252 }