1 //
2 // ========================================================================
3 // Copyright (c) 1995-2016 Mort Bay Consulting Pty. Ltd.
4 // ------------------------------------------------------------------------
5 // All rights reserved. This program and the accompanying materials
6 // are made available under the terms of the Eclipse Public License v1.0
7 // and Apache License v2.0 which accompanies this distribution.
8 //
9 // The Eclipse Public License is available at
10 // http://www.eclipse.org/legal/epl-v10.html
11 //
12 // The Apache License v2.0 is available at
13 // http://www.opensource.org/licenses/apache2.0.php
14 //
15 // You may elect to redistribute this code under either of these licenses.
16 // ========================================================================
17 //
18
19 package org.eclipse.jetty.client.api;
20
21 import java.nio.ByteBuffer;
22 import java.util.EventListener;
23 import java.util.List;
24
25 import org.eclipse.jetty.client.util.BufferingResponseListener;
26 import org.eclipse.jetty.http.HttpField;
27 import org.eclipse.jetty.http.HttpFields;
28 import org.eclipse.jetty.http.HttpVersion;
29 import org.eclipse.jetty.util.Callback;
30
31 /**
32 * <p>{@link Response} represents a HTTP response and offers methods to retrieve status code, HTTP version
33 * and headers.</p>
34 * <p>{@link Response} objects are passed as parameters to {@link Response.Listener} callbacks, or as
35 * future result of {@link Request#send()}.</p>
36 * <p>{@link Response} objects do not contain getters for the response content, because it may be too large
37 * to fit into memory.
38 * The response content should be retrieved via {@link Response.Listener#onContent(Response, ByteBuffer) content
39 * events}, or via utility classes such as {@link BufferingResponseListener}.</p>
40 */
41 public interface Response
42 {
43 /**
44 * @return the request associated with this response
45 */
46 Request getRequest();
47
48 /**
49 * @param listenerClass the listener class
50 * @return the response listener passed to {@link org.eclipse.jetty.client.api.Request#send(org.eclipse.jetty.client.api.Response.CompleteListener)}
51 * @param <T> the type of class
52 */
53 <T extends ResponseListener> List<T> getListeners(Class<T> listenerClass);
54
55 /**
56 * @return the HTTP version of this response, such as "HTTP/1.1"
57 */
58 HttpVersion getVersion();
59
60 /**
61 * @return the HTTP status code of this response, such as 200 or 404
62 */
63 int getStatus();
64
65 /**
66 * @return the HTTP reason associated to the {@link #getStatus}
67 */
68 String getReason();
69
70 /**
71 * @return the headers of this response
72 */
73 HttpFields getHeaders();
74
75 /**
76 * Attempts to abort the receive of this response.
77 *
78 * @param cause the abort cause, must not be null
79 * @return whether the abort succeeded
80 */
81 boolean abort(Throwable cause);
82
83 /**
84 * Common, empty, super-interface for response listeners
85 */
86 public interface ResponseListener extends EventListener
87 {
88 }
89
90 /**
91 * Listener for the response begin event.
92 */
93 public interface BeginListener extends ResponseListener
94 {
95 /**
96 * Callback method invoked when the response line containing HTTP version,
97 * HTTP status code and reason has been received and parsed.
98 * <p>
99 * This method is the best approximation to detect when the first bytes of the response arrived to the client.
100 *
101 * @param response the response containing the response line data
102 */
103 public void onBegin(Response response);
104 }
105
106 /**
107 * Listener for a response header event.
108 */
109 public interface HeaderListener extends ResponseListener
110 {
111 /**
112 * Callback method invoked when a response header has been received,
113 * returning whether the header should be processed or not.
114 *
115 * @param response the response containing the response line data and the headers so far
116 * @param field the header received
117 * @return true to process the header, false to skip processing of the header
118 */
119 public boolean onHeader(Response response, HttpField field);
120 }
121
122 /**
123 * Listener for the response headers event.
124 */
125 public interface HeadersListener extends ResponseListener
126 {
127 /**
128 * Callback method invoked when the response headers have been received and parsed.
129 *
130 * @param response the response containing the response line data and the headers
131 */
132 public void onHeaders(Response response);
133 }
134
135 /**
136 * Listener for the response content events.
137 */
138 public interface ContentListener extends ResponseListener
139 {
140 /**
141 * Callback method invoked when the response content has been received.
142 * This method may be invoked multiple times, and the {@code content} buffer must be consumed
143 * before returning from this method.
144 *
145 * @param response the response containing the response line data and the headers
146 * @param content the content bytes received
147 */
148 public void onContent(Response response, ByteBuffer content);
149 }
150
151 public interface AsyncContentListener extends ResponseListener
152 {
153 /**
154 * Callback method invoked asynchronously when the response content has been received.
155 *
156 * @param response the response containing the response line data and the headers
157 * @param content the content bytes received
158 * @param callback the callback to call when the content is consumed.
159 */
160 public void onContent(Response response, ByteBuffer content, Callback callback);
161 }
162
163 /**
164 * Listener for the response succeeded event.
165 */
166 public interface SuccessListener extends ResponseListener
167 {
168 /**
169 * Callback method invoked when the whole response has been successfully received.
170 *
171 * @param response the response containing the response line data and the headers
172 */
173 public void onSuccess(Response response);
174 }
175
176 /**
177 * Listener for the response failure event.
178 */
179 public interface FailureListener extends ResponseListener
180 {
181 /**
182 * Callback method invoked when the response has failed in the process of being received
183 *
184 * @param response the response containing data up to the point the failure happened
185 * @param failure the failure happened
186 */
187 public void onFailure(Response response, Throwable failure);
188 }
189
190 /**
191 * Listener for the request and response completed event.
192 */
193 public interface CompleteListener extends ResponseListener
194 {
195 /**
196 * Callback method invoked when the request <em><b>and</b></em> the response have been processed,
197 * either successfully or not.
198 * <p>
199 * The {@code result} parameter contains the request, the response, and eventual failures.
200 * <p>
201 * Requests may complete <em>after</em> response, for example in case of big uploads that are
202 * discarded or read asynchronously by the server.
203 * This method is always invoked <em>after</em> {@link SuccessListener#onSuccess(Response)} or
204 * {@link FailureListener#onFailure(Response, Throwable)}, and only when request indicates that
205 * it is completed.
206 *
207 * @param result the result of the request / response exchange
208 */
209 public void onComplete(Result result);
210 }
211
212 /**
213 * Listener for all response events.
214 */
215 public interface Listener extends BeginListener, HeaderListener, HeadersListener, ContentListener, AsyncContentListener, SuccessListener, FailureListener, CompleteListener
216 {
217 /**
218 * An empty implementation of {@link Listener}
219 */
220 public static class Adapter implements Listener
221 {
222 @Override
223 public void onBegin(Response response)
224 {
225 }
226
227 @Override
228 public boolean onHeader(Response response, HttpField field)
229 {
230 return true;
231 }
232
233 @Override
234 public void onHeaders(Response response)
235 {
236 }
237
238 @Override
239 public void onContent(Response response, ByteBuffer content)
240 {
241 }
242
243 @Override
244 public void onContent(Response response, ByteBuffer content, Callback callback)
245 {
246 try
247 {
248 onContent(response, content);
249 callback.succeeded();
250 }
251 catch (Throwable x)
252 {
253 callback.failed(x);
254 }
255 }
256
257 @Override
258 public void onSuccess(Response response)
259 {
260 }
261
262 @Override
263 public void onFailure(Response response, Throwable failure)
264 {
265 }
266
267 @Override
268 public void onComplete(Result result)
269 {
270 }
271 }
272 }
273 }