Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Side by Side Diff: components/cronet/android/java/src/org/chromium/net/CronetUrlRequest.java

Issue 849903002: [Cronet] Upload support for async APIs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed Misha's comments Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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.Log; 7 import android.util.Log;
8 import android.util.Pair; 8 import android.util.Pair;
9 9
10 import org.chromium.base.CalledByNative; 10 import org.chromium.base.CalledByNative;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 * decided a redirect will be followed. 50 * decided a redirect will be followed.
51 */ 51 */
52 private final List<String> mUrlChain = new ArrayList<String>(); 52 private final List<String> mUrlChain = new ArrayList<String>();
53 53
54 private final UrlRequestListener mListener; 54 private final UrlRequestListener mListener;
55 private final String mInitialUrl; 55 private final String mInitialUrl;
56 private final int mPriority; 56 private final int mPriority;
57 private String mInitialMethod; 57 private String mInitialMethod;
58 private final HeadersList mRequestHeaders = new HeadersList(); 58 private final HeadersList mRequestHeaders = new HeadersList();
59 59
60 private CronetUploadDataStream mUploadDataStream;
61
60 private NativeResponseInfo mResponseInfo; 62 private NativeResponseInfo mResponseInfo;
61 63
62 /* 64 /*
63 * Listener callback is repeatedly called when data is received, so it is 65 * Listener callback is repeatedly called when data is received, so it is
64 * cached as member variable. 66 * cached as member variable.
65 */ 67 */
66 private OnDataReceivedRunnable mOnDataReceivedTask; 68 private OnDataReceivedRunnable mOnDataReceivedTask;
67 69
68 static final class HeadersList extends ArrayList<Pair<String, String>> { 70 static final class HeadersList extends ArrayList<Pair<String, String>> {
69 } 71 }
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 if (header == null) { 253 if (header == null) {
252 throw new NullPointerException("Invalid header name."); 254 throw new NullPointerException("Invalid header name.");
253 } 255 }
254 if (value == null) { 256 if (value == null) {
255 throw new NullPointerException("Invalid header value."); 257 throw new NullPointerException("Invalid header value.");
256 } 258 }
257 mRequestHeaders.add(Pair.create(header, value)); 259 mRequestHeaders.add(Pair.create(header, value));
258 } 260 }
259 261
260 @Override 262 @Override
263 public void setUploadDataProvider(UploadDataProvider uploadDataProvider, Exe cutor executor) {
264 if (uploadDataProvider == null) {
265 throw new NullPointerException("Invalid UploadDataProvider.");
266 }
267 if (mInitialMethod == null) {
268 mInitialMethod = "POST";
269 }
270 mUploadDataStream = new CronetUploadDataStream(uploadDataProvider, execu tor);
271 }
272
273 @Override
261 public void start() { 274 public void start() {
262 synchronized (mUrlRequestAdapterLock) { 275 synchronized (mUrlRequestAdapterLock) {
263 checkNotStarted(); 276 checkNotStarted();
264 mUrlRequestAdapter = nativeCreateRequestAdapter( 277
265 mRequestContext.getUrlRequestContextAdapter(), 278 try {
266 mInitialUrl, 279 mUrlRequestAdapter = nativeCreateRequestAdapter(
267 mPriority); 280 mRequestContext.getUrlRequestContextAdapter(), mInitialU rl, mPriority);
268 mRequestContext.onRequestStarted(this); 281 mRequestContext.onRequestStarted(this);
269 if (mInitialMethod != null) { 282 if (mInitialMethod != null) {
270 if (!nativeSetHttpMethod(mUrlRequestAdapter, mInitialMethod)) { 283 if (!nativeSetHttpMethod(mUrlRequestAdapter, mInitialMethod) ) {
271 destroyRequestAdapter(); 284 throw new IllegalArgumentException("Invalid http method " + mInitialMethod);
272 throw new IllegalArgumentException("Invalid http method " 285 }
273 + mInitialMethod);
274 } 286 }
275 } 287
276 for (Pair<String, String> header : mRequestHeaders) { 288 boolean hasContentType = false;
277 if (!nativeAddHeader(mUrlRequestAdapter, header.first, 289 for (Pair<String, String> header : mRequestHeaders) {
278 header.second)) { 290 if (header.first.equalsIgnoreCase("Content-Type")
279 destroyRequestAdapter(); 291 && !header.second.isEmpty()) {
280 throw new IllegalArgumentException("Invalid header " 292 hasContentType = true;
281 + header.first + "=" + header.second); 293 }
294 if (!nativeAddHeader(mUrlRequestAdapter, header.first, heade r.second)) {
295 destroyRequestAdapter();
296 throw new IllegalArgumentException(
297 "Invalid header " + header.first + "=" + header. second);
298 }
282 } 299 }
300 if (mUploadDataStream != null) {
301 if (!hasContentType) {
302 throw new IllegalArgumentException(
303 "Requests with upload data must have a Content-T ype.");
304 }
305 mUploadDataStream.attachToRequest(this, mUrlRequestAdapter);
306 }
307 } catch (RuntimeException e) {
308 // If there's an exception, cleanup and then throw the
309 // exception to the caller.
310 destroyRequestAdapter();
311 throw e;
283 } 312 }
284 if (mDisableCache) { 313 if (mDisableCache) {
285 nativeDisableCache(mUrlRequestAdapter); 314 nativeDisableCache(mUrlRequestAdapter);
286 } 315 }
287 mStarted = true; 316 mStarted = true;
288 nativeStart(mUrlRequestAdapter); 317 nativeStart(mUrlRequestAdapter);
289 } 318 }
290 } 319 }
291 320
292 @Override 321 @Override
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 cancel(); 447 cancel();
419 } 448 }
420 try { 449 try {
421 mListener.onFailed(this, mResponseInfo, requestError); 450 mListener.onFailed(this, mResponseInfo, requestError);
422 } catch (Exception failException) { 451 } catch (Exception failException) {
423 Log.e(CronetUrlRequestContext.LOG_TAG, 452 Log.e(CronetUrlRequestContext.LOG_TAG,
424 "Exception notifying of failed request", failException); 453 "Exception notifying of failed request", failException);
425 } 454 }
426 } 455 }
427 456
457 /**
458 * Called when UploadDataProvider encounters an error.
459 */
460 void onUploadException(Exception e) {
461 UrlRequestException uploadError =
462 new UrlRequestException("Exception received from UploadDataProvi der", e);
463 Log.e(CronetUrlRequestContext.LOG_TAG, "Exception in upload method", e);
464 // Do not call into listener if request is canceled.
465 synchronized (mUrlRequestAdapterLock) {
466 if (isCanceled()) {
467 return;
468 }
469 cancel();
470 }
471 try {
472 mListener.onFailed(this, mResponseInfo, uploadError);
473 } catch (Exception failException) {
474 Log.e(CronetUrlRequestContext.LOG_TAG, "Exception notifying of faile d upload",
475 failException);
476 }
477 }
478
428 //////////////////////////////////////////////// 479 ////////////////////////////////////////////////
429 // Private methods called by the native code. 480 // Private methods called by the native code.
430 // Always called on network thread. 481 // Always called on network thread.
431 //////////////////////////////////////////////// 482 ////////////////////////////////////////////////
432 483
433 /** 484 /**
434 * Called before following redirects. The redirect will automatically be 485 * Called before following redirects. The redirect will automatically be
435 * followed, unless the request is paused or canceled during this 486 * followed, unless the request is paused or canceled during this
436 * callback. If the redirect response has a body, it will be ignored. 487 * callback. If the redirect response has a body, it will be ignored.
437 * This will only be called between start and onResponseStarted. 488 * This will only be called between start and onResponseStarted.
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
626 private native String nativeGetNegotiatedProtocol(long urlRequestAdapter); 677 private native String nativeGetNegotiatedProtocol(long urlRequestAdapter);
627 678
628 private native String nativeGetHttpStatusText(long urlRequestAdapter); 679 private native String nativeGetHttpStatusText(long urlRequestAdapter);
629 680
630 private native boolean nativeGetWasCached(long urlRequestAdapter); 681 private native boolean nativeGetWasCached(long urlRequestAdapter);
631 682
632 private native long nativeGetTotalReceivedBytes(long urlRequestAdapter); 683 private native long nativeGetTotalReceivedBytes(long urlRequestAdapter);
633 684
634 private native void nativeDisableCache(long urlRequestAdapter); 685 private native void nativeDisableCache(long urlRequestAdapter);
635 } 686 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698