Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.net; | 5 package org.chromium.net; |
| 6 | 6 |
| 7 import android.util.Pair; | |
| 8 | |
| 7 import java.nio.ByteBuffer; | 9 import java.nio.ByteBuffer; |
| 10 import java.util.ArrayList; | |
| 8 import java.util.concurrent.Executor; | 11 import java.util.concurrent.Executor; |
| 9 | 12 |
| 10 /** | 13 /** |
| 11 * Controls an HTTP request (GET, PUT, POST etc). | 14 * Controls an HTTP request (GET, PUT, POST etc). |
| 12 * Created using {@link UrlRequestContext#createRequest UrlRequestContext.create Request()}. | 15 * Created using {@link CronetEngine#executeRequest CronetEngine.executeRequest( )}. |
| 13 * Note: All methods must be called on the {@link Executor} passed in during cre ation. | 16 * Note: All methods must be called on the {@link Executor} passed in during cre ation. |
| 14 */ | 17 */ |
| 15 public interface UrlRequest { | 18 public interface UrlRequest { |
| 16 /** | 19 /** |
| 20 * Builder for {@link UrlRequest}s. Allows configuring requests before const ructing them | |
| 21 * with {@link Builder#build}. | |
| 22 */ | |
| 23 public static final class Builder { | |
| 24 // All fields are temporary storage of UrlRequest configuration to be | |
| 25 // copied to built UrlRequests. | |
| 26 | |
| 27 // CronetEngine to execute request. | |
| 28 final CronetEngine mCronetEngine; | |
| 29 // URL to request. | |
| 30 final String mUrl; | |
| 31 // Listener to receive progress callbacks. | |
| 32 final UrlRequestListener mListener; | |
| 33 // Executor to call listener on. | |
| 34 final Executor mExecutor; | |
| 35 // HTTP method (e.g. GET, POST etc). | |
| 36 String mMethod; | |
| 37 // List of request headers, stored as header field name and value pairs. | |
| 38 final ArrayList<Pair<String, String>> mRequestHeaders = | |
| 39 new ArrayList<Pair<String, String>>(); | |
| 40 // Disable the cache for just this request. | |
| 41 boolean mDisableCache; | |
| 42 // Priority of request. | |
| 43 int mPriority = REQUEST_PRIORITY_MEDIUM; | |
| 44 // If request is an upload, this provides the request body data. | |
| 45 UploadDataProvider mUploadDataProvider; | |
| 46 // Executor to call upload data provider back on. | |
| 47 Executor mUploadDataProviderExecutor; | |
| 48 | |
| 49 /** | |
| 50 * Creates a builder for {@link UrlRequest} objects. All callbacks for | |
| 51 * generated {@link UrlRequest} objects will be called on | |
| 52 * {@code executor}'s thread. {@code executor} must not run tasks on the | |
| 53 * current thread to prevent blocking networking operations and causing | |
| 54 * exceptions during shutdown. | |
| 55 * | |
| 56 * @param url {@link java.net.URL} for the generated requests. | |
| 57 * @param listener callback class that gets called on different events. | |
| 58 * @param executor {@link Executor} on which all callbacks will be calle d. | |
| 59 * @param cronetEngine {@link CronetEngine} used to execute this request . | |
| 60 */ | |
| 61 public Builder(String url, UrlRequestListener listener, Executor executo r, | |
| 62 CronetEngine cronetEngine) { | |
| 63 if (url == null) { | |
| 64 throw new NullPointerException("URL is required."); | |
| 65 } | |
| 66 if (listener == null) { | |
| 67 throw new NullPointerException("Listener is required."); | |
| 68 } | |
| 69 if (executor == null) { | |
| 70 throw new NullPointerException("Executor is required."); | |
| 71 } | |
| 72 if (cronetEngine == null) { | |
| 73 throw new NullPointerException("CronetEngine is required."); | |
| 74 } | |
| 75 mUrl = url; | |
| 76 mListener = listener; | |
| 77 mExecutor = executor; | |
| 78 mCronetEngine = cronetEngine; | |
| 79 } | |
| 80 | |
| 81 /** | |
| 82 * Sets the HTTP method verb to use for this request. | |
| 83 * | |
| 84 * <p>The default when this method is not called is "GET" if the request has | |
| 85 * no body or "POST" if it does. | |
| 86 * | |
| 87 * @param method "GET", "HEAD", "DELETE", "POST" or "PUT". | |
| 88 */ | |
| 89 public void setHttpMethod(String method) { | |
|
mef
2015/10/02 16:02:27
should [set|add]Xyz methods return |this| to facil
pauljensen
2015/10/02 18:23:15
SGTM, done.
| |
| 90 if (method == null) { | |
| 91 throw new NullPointerException("Method is required."); | |
| 92 } | |
| 93 mMethod = method; | |
| 94 } | |
| 95 | |
| 96 /** | |
| 97 * Adds a request header. | |
| 98 * | |
| 99 * @param header header name. | |
| 100 * @param value header value. | |
| 101 */ | |
| 102 public void addHeader(String header, String value) { | |
| 103 if (header == null) { | |
| 104 throw new NullPointerException("Invalid header name."); | |
| 105 } | |
| 106 if (value == null) { | |
| 107 throw new NullPointerException("Invalid header value."); | |
| 108 } | |
| 109 mRequestHeaders.add(Pair.create(header, value)); | |
| 110 } | |
| 111 | |
| 112 /** | |
| 113 * Disables cache for the request. If context is not set up to use cache , | |
| 114 * this call has no effect. | |
| 115 */ | |
| 116 public void disableCache() { | |
| 117 mDisableCache = true; | |
| 118 } | |
| 119 | |
| 120 /** | |
| 121 * Lowest request priority. Passed to {@link #setPriority}. | |
| 122 */ | |
| 123 public static final int REQUEST_PRIORITY_IDLE = 0; | |
| 124 /** | |
| 125 * Very low request priority. Passed to {@link #setPriority}. | |
| 126 */ | |
| 127 public static final int REQUEST_PRIORITY_LOWEST = 1; | |
| 128 /** | |
| 129 * Low request priority. Passed to {@link #setPriority}. | |
| 130 */ | |
| 131 public static final int REQUEST_PRIORITY_LOW = 2; | |
| 132 /** | |
| 133 * Medium request priority. Passed to {@link #setPriority}. | |
| 134 */ | |
| 135 public static final int REQUEST_PRIORITY_MEDIUM = 3; | |
| 136 /** | |
| 137 * Highest request priority. Passed to {@link #setPriority}. | |
| 138 */ | |
| 139 public static final int REQUEST_PRIORITY_HIGHEST = 4; | |
| 140 | |
| 141 /** | |
| 142 * Sets priority of the request which should be one of the | |
| 143 * {@link #REQUEST_PRIORITY_IDLE REQUEST_PRIORITY_*} values. | |
| 144 * Defaults to {@link #REQUEST_PRIORITY_MEDIUM} | |
| 145 * | |
| 146 * @param priority priority of the request which should be one of the | |
| 147 * {@link #REQUEST_PRIORITY_IDLE REQUEST_PRIORITY_*} values. | |
| 148 */ | |
| 149 public void setPriority(int priority) { | |
| 150 mPriority = priority; | |
| 151 } | |
| 152 | |
| 153 /** | |
| 154 * Sets upload data provider. Switches method to "POST" if not | |
| 155 * explicitly set. Starting the request will throw an exception if a | |
| 156 * Content-Type header is not set. | |
| 157 * | |
| 158 * @param uploadDataProvider responsible for providing the upload data. | |
| 159 * @param executor All {@code uploadDataProvider} methods will be called | |
| 160 * using this {@code Executor}. May optionally be the same | |
| 161 * {@code Executor} the request itself is using. | |
| 162 */ | |
| 163 public void setUploadDataProvider( | |
| 164 UploadDataProvider uploadDataProvider, Executor executor) { | |
| 165 if (uploadDataProvider == null) { | |
| 166 throw new NullPointerException("Invalid UploadDataProvider."); | |
| 167 } | |
| 168 if (executor == null) { | |
| 169 throw new NullPointerException("Invalid UploadDataProvider Execu tor."); | |
| 170 } | |
| 171 if (mMethod == null) { | |
| 172 mMethod = "POST"; | |
| 173 } | |
| 174 mUploadDataProvider = uploadDataProvider; | |
| 175 mUploadDataProviderExecutor = executor; | |
| 176 } | |
| 177 | |
| 178 /** | |
| 179 * Creates a {@link UrlRequest} using configuration within this | |
| 180 * {@link Builder}. The returned {@code UrlRequest} can then be started | |
| 181 * by calling {@link UrlRequest#start}. | |
| 182 * | |
| 183 * @return constructed {@link UrlRequest} using configuration within | |
| 184 * this {@link Builder}. | |
| 185 */ | |
| 186 public UrlRequest build() { | |
| 187 final UrlRequest request = | |
| 188 mCronetEngine.createRequest(mUrl, mListener, mExecutor, mPri ority); | |
| 189 if (mMethod != null) { | |
| 190 request.setHttpMethod(mMethod); | |
| 191 } | |
| 192 if (mDisableCache) { | |
| 193 request.disableCache(); | |
| 194 } | |
| 195 for (Pair<String, String> header : mRequestHeaders) { | |
| 196 request.addHeader(header.first, header.second); | |
| 197 } | |
| 198 if (mUploadDataProvider != null) { | |
| 199 request.setUploadDataProvider(mUploadDataProvider, mUploadDataPr oviderExecutor); | |
| 200 } | |
| 201 return request; | |
| 202 } | |
| 203 } | |
| 204 | |
| 205 /** | |
| 17 * Request status values returned by {@link #getStatus}. | 206 * Request status values returned by {@link #getStatus}. |
| 18 */ | 207 */ |
| 19 public static class Status { | 208 public static class Status { |
| 20 /** | 209 /** |
| 21 * This state indicates that the request is completed, canceled, or is n ot | 210 * This state indicates that the request is completed, canceled, or is n ot |
| 22 * started. | 211 * started. |
| 23 */ | 212 */ |
| 24 public static final int INVALID = -1; | 213 public static final int INVALID = -1; |
| 25 /** | 214 /** |
| 26 * This state corresponds to a resource load that has either not yet beg un | 215 * This state corresponds to a resource load that has either not yet beg un |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 189 /** | 378 /** |
| 190 * Called on {@link UrlRequest}'s {@link Executor}'s thread when request | 379 * Called on {@link UrlRequest}'s {@link Executor}'s thread when request |
| 191 * status is obtained. | 380 * status is obtained. |
| 192 * @param status integer representing the status of the request. It is | 381 * @param status integer representing the status of the request. It is |
| 193 * one of the values defined in {@link Status}. | 382 * one of the values defined in {@link Status}. |
| 194 */ | 383 */ |
| 195 public abstract void onStatus(int status); | 384 public abstract void onStatus(int status); |
| 196 } | 385 } |
| 197 | 386 |
| 198 /** | 387 /** |
| 199 * Lowest request priority. Passed to {@link UrlRequestContext#createRequest (String, | |
| 200 * UrlRequestListener, Executor, int) UrlRequestContext.createRequest()}. | |
| 201 */ | |
| 202 public static final int REQUEST_PRIORITY_IDLE = 0; | |
| 203 /** | |
| 204 * Very low request priority. Passed to {@link UrlRequestContext#createReque st(String, | |
| 205 * UrlRequestListener, Executor, int) UrlRequestContext.createRequest()}. | |
| 206 */ | |
| 207 public static final int REQUEST_PRIORITY_LOWEST = 1; | |
| 208 /** | |
| 209 * Low request priority. Passed to {@link UrlRequestContext#createRequest(St ring, | |
| 210 * UrlRequestListener, Executor, int) UrlRequestContext.createRequest()}. | |
| 211 */ | |
| 212 public static final int REQUEST_PRIORITY_LOW = 2; | |
| 213 /** | |
| 214 * Medium request priority. Passed to {@link UrlRequestContext#createRequest (String, | |
| 215 * UrlRequestListener, Executor, int) UrlRequestContext.createRequest()}. | |
| 216 */ | |
| 217 public static final int REQUEST_PRIORITY_MEDIUM = 3; | |
| 218 /** | |
| 219 * Highest request priority. Passed to {@link UrlRequestContext#createReques t(String, | |
| 220 * UrlRequestListener, Executor, int) UrlRequestContext.createRequest()}. | |
| 221 */ | |
| 222 public static final int REQUEST_PRIORITY_HIGHEST = 4; | |
| 223 | |
| 224 // More setters go here. They may only be called before start (Maybe | |
| 225 // also allow during redirects). Could optionally instead use arguments | |
| 226 // to URLRequestFactory when creating the request. | |
| 227 | |
| 228 /** | |
| 229 * Sets the HTTP method verb to use for this request. Must be done before | 388 * Sets the HTTP method verb to use for this request. Must be done before |
| 230 * request has started. | 389 * request has started. |
| 231 * | 390 * |
| 232 * <p>The default when this method is not called is "GET" if the request has | 391 * <p>The default when this method is not called is "GET" if the request has |
| 233 * no body or "POST" if it does. | 392 * no body or "POST" if it does. |
| 234 * | 393 * |
| 235 * @param method "GET", "HEAD", "DELETE", "POST" or "PUT". | 394 * @param method "GET", "HEAD", "DELETE", "POST" or "PUT". |
| 395 * @deprecated Use {@link Builder#setHttpMethod}. | |
| 236 */ | 396 */ |
| 237 public void setHttpMethod(String method); | 397 @Deprecated public void setHttpMethod(String method); |
| 238 | 398 |
| 239 /** | 399 /** |
| 240 * Adds a request header. Must be done before request has started. | 400 * Adds a request header. Must be done before request has started. |
| 241 * | 401 * |
| 242 * @param header header name. | 402 * @param header header name. |
| 243 * @param value header value. | 403 * @param value header value. |
| 404 * @deprecated Use {@link Builder#setPriority}. | |
| 244 */ | 405 */ |
| 245 public void addHeader(String header, String value); | 406 @Deprecated public void addHeader(String header, String value); |
| 246 | 407 |
| 247 /** | 408 /** |
| 248 * Sets upload data provider. Must be done before request has started. May o nly be | 409 * Sets upload data provider. Must be done before request has started. May o nly be |
| 249 * invoked once per request. Switches method to "POST" if not explicitly | 410 * invoked once per request. Switches method to "POST" if not explicitly |
| 250 * set. Starting the request will throw an exception if a Content-Type | 411 * set. Starting the request will throw an exception if a Content-Type |
| 251 * header is not set. | 412 * header is not set. |
| 252 * | 413 * |
| 253 * @param uploadDataProvider responsible for providing the upload data. | 414 * @param uploadDataProvider responsible for providing the upload data. |
| 254 * @param executor All {@code uploadDataProvider} methods will be called | 415 * @param executor All {@code uploadDataProvider} methods will be called |
| 255 * using this {@code Executor}. May optionally be the same | 416 * using this {@code Executor}. May optionally be the same |
| 256 * {@code Executor} the request itself is using. | 417 * {@code Executor} the request itself is using. |
| 418 * @deprecated Use {@link Builder#setUploadDataProvider}. | |
| 257 */ | 419 */ |
| 420 @Deprecated | |
| 258 public void setUploadDataProvider(UploadDataProvider uploadDataProvider, Exe cutor executor); | 421 public void setUploadDataProvider(UploadDataProvider uploadDataProvider, Exe cutor executor); |
| 259 | 422 |
| 260 /** | 423 /** |
| 261 * Starts the request, all callbacks go to listener. May only be called | 424 * Starts the request, all callbacks go to listener. May only be called |
| 262 * once. May not be called if {@link #cancel} has been called. | 425 * once. May not be called if {@link #cancel} has been called. |
| 263 */ | 426 */ |
| 264 public void start(); | 427 public void start(); |
| 265 | 428 |
| 266 /** | 429 /** |
| 267 * Follows a pending redirect. Must only be called at most once for each | 430 * Follows a pending redirect. Must only be called at most once for each |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 339 * Returns {@code true} if the request was successfully started and is now | 502 * Returns {@code true} if the request was successfully started and is now |
| 340 * done (completed, canceled, or failed). | 503 * done (completed, canceled, or failed). |
| 341 * @return {@code true} if the request was successfully started and is now | 504 * @return {@code true} if the request was successfully started and is now |
| 342 * done (completed, canceled, or failed). | 505 * done (completed, canceled, or failed). |
| 343 */ | 506 */ |
| 344 public boolean isDone(); | 507 public boolean isDone(); |
| 345 | 508 |
| 346 /** | 509 /** |
| 347 * Disables cache for the request. If context is not set up to use cache, | 510 * Disables cache for the request. If context is not set up to use cache, |
| 348 * this call has no effect. | 511 * this call has no effect. |
| 512 * @deprecated Use {@link Builder#disableCache}. | |
| 349 */ | 513 */ |
| 350 public void disableCache(); | 514 @Deprecated public void disableCache(); |
| 351 | 515 |
| 352 /** | 516 /** |
| 353 * Queries the status of the request. | 517 * Queries the status of the request. |
| 354 * @param listener a {@link StatusListener} that will be called back with | 518 * @param listener a {@link StatusListener} that will be called back with |
| 355 * the request's current status. {@code listener} will be called | 519 * the request's current status. {@code listener} will be called |
| 356 * back on the {@link Executor} passed in when the request was | 520 * back on the {@link Executor} passed in when the request was |
| 357 * created. | 521 * created. |
| 358 */ | 522 */ |
| 359 public void getStatus(final StatusListener listener); | 523 public void getStatus(final StatusListener listener); |
| 360 | 524 |
| 361 // Note: There are deliberately no accessors for the results of the request | 525 // Note: There are deliberately no accessors for the results of the request |
| 362 // here. Having none removes any ambiguity over when they are populated, | 526 // here. Having none removes any ambiguity over when they are populated, |
| 363 // particularly in the redirect case. | 527 // particularly in the redirect case. |
| 364 } | 528 } |
| 365 | 529 |
| OLD | NEW |