| 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.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; |
| 11 import org.chromium.base.JNINamespace; | 11 import org.chromium.base.JNINamespace; |
| 12 import org.chromium.base.NativeClassQualifiedName; |
| 12 | 13 |
| 13 import java.nio.ByteBuffer; | 14 import java.nio.ByteBuffer; |
| 14 import java.util.ArrayList; | 15 import java.util.ArrayList; |
| 15 import java.util.Collections; | 16 import java.util.Collections; |
| 16 import java.util.List; | 17 import java.util.List; |
| 17 import java.util.Map; | 18 import java.util.Map; |
| 18 import java.util.TreeMap; | 19 import java.util.TreeMap; |
| 19 import java.util.concurrent.Executor; | 20 import java.util.concurrent.Executor; |
| 20 | 21 |
| 21 /** | 22 /** |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 } | 93 } |
| 93 mListener.onDataReceived(CronetUrlRequest.this, | 94 mListener.onDataReceived(CronetUrlRequest.this, |
| 94 mResponseInfo, mByteBuffer); | 95 mResponseInfo, mByteBuffer); |
| 95 mByteBuffer = null; | 96 mByteBuffer = null; |
| 96 synchronized (mUrlRequestAdapterLock) { | 97 synchronized (mUrlRequestAdapterLock) { |
| 97 mInOnDataReceived = false; | 98 mInOnDataReceived = false; |
| 98 if (isCanceled()) { | 99 if (isCanceled()) { |
| 99 destroyRequestAdapter(); | 100 destroyRequestAdapter(); |
| 100 return; | 101 return; |
| 101 } | 102 } |
| 102 nativeReceiveData(mUrlRequestAdapter); | 103 nativeReadData(mUrlRequestAdapter); |
| 103 } | 104 } |
| 104 } catch (Exception e) { | 105 } catch (Exception e) { |
| 105 synchronized (mUrlRequestAdapterLock) { | 106 synchronized (mUrlRequestAdapterLock) { |
| 106 mInOnDataReceived = false; | 107 mInOnDataReceived = false; |
| 107 if (isCanceled()) { | 108 if (isCanceled()) { |
| 108 destroyRequestAdapter(); | 109 destroyRequestAdapter(); |
| 109 } | 110 } |
| 110 } | 111 } |
| 111 onListenerException(e); | 112 onListenerException(e); |
| 112 } | 113 } |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 throw new IllegalArgumentException("Invalid http method
" + mInitialMethod); | 285 throw new IllegalArgumentException("Invalid http method
" + mInitialMethod); |
| 285 } | 286 } |
| 286 } | 287 } |
| 287 | 288 |
| 288 boolean hasContentType = false; | 289 boolean hasContentType = false; |
| 289 for (Pair<String, String> header : mRequestHeaders) { | 290 for (Pair<String, String> header : mRequestHeaders) { |
| 290 if (header.first.equalsIgnoreCase("Content-Type") | 291 if (header.first.equalsIgnoreCase("Content-Type") |
| 291 && !header.second.isEmpty()) { | 292 && !header.second.isEmpty()) { |
| 292 hasContentType = true; | 293 hasContentType = true; |
| 293 } | 294 } |
| 294 if (!nativeAddHeader(mUrlRequestAdapter, header.first, heade
r.second)) { | 295 if (!nativeAddRequestHeader(mUrlRequestAdapter, header.first
, header.second)) { |
| 295 destroyRequestAdapter(); | 296 destroyRequestAdapter(); |
| 296 throw new IllegalArgumentException( | 297 throw new IllegalArgumentException( |
| 297 "Invalid header " + header.first + "=" + header.
second); | 298 "Invalid header " + header.first + "=" + header.
second); |
| 298 } | 299 } |
| 299 } | 300 } |
| 300 if (mUploadDataStream != null) { | 301 if (mUploadDataStream != null) { |
| 301 if (!hasContentType) { | 302 if (!hasContentType) { |
| 302 throw new IllegalArgumentException( | 303 throw new IllegalArgumentException( |
| 303 "Requests with upload data must have a Content-T
ype."); | 304 "Requests with upload data must have a Content-T
ype."); |
| 304 } | 305 } |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 416 throw new IllegalStateException("Request is already started."); | 417 throw new IllegalStateException("Request is already started."); |
| 417 } | 418 } |
| 418 } | 419 } |
| 419 } | 420 } |
| 420 | 421 |
| 421 private void destroyRequestAdapter() { | 422 private void destroyRequestAdapter() { |
| 422 synchronized (mUrlRequestAdapterLock) { | 423 synchronized (mUrlRequestAdapterLock) { |
| 423 if (mUrlRequestAdapter == 0) { | 424 if (mUrlRequestAdapter == 0) { |
| 424 return; | 425 return; |
| 425 } | 426 } |
| 426 nativeDestroyRequestAdapter(mUrlRequestAdapter); | 427 nativeDestroy(mUrlRequestAdapter); |
| 427 mRequestContext.onRequestDestroyed(this); | 428 mRequestContext.onRequestDestroyed(this); |
| 428 mUrlRequestAdapter = 0; | 429 mUrlRequestAdapter = 0; |
| 429 } | 430 } |
| 430 } | 431 } |
| 431 | 432 |
| 432 /** | 433 /** |
| 433 * If listener method throws an exception, request gets canceled | 434 * If listener method throws an exception, request gets canceled |
| 434 * and exception is reported via onFailed listener callback. | 435 * and exception is reported via onFailed listener callback. |
| 435 * Only called on the Executor. | 436 * Only called on the Executor. |
| 436 */ | 437 */ |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 533 if (isCanceled()) { | 534 if (isCanceled()) { |
| 534 return; | 535 return; |
| 535 } | 536 } |
| 536 try { | 537 try { |
| 537 mListener.onResponseStarted(CronetUrlRequest.this, | 538 mListener.onResponseStarted(CronetUrlRequest.this, |
| 538 mResponseInfo); | 539 mResponseInfo); |
| 539 synchronized (mUrlRequestAdapterLock) { | 540 synchronized (mUrlRequestAdapterLock) { |
| 540 if (isCanceled()) { | 541 if (isCanceled()) { |
| 541 return; | 542 return; |
| 542 } | 543 } |
| 543 nativeReceiveData(mUrlRequestAdapter); | 544 nativeReadData(mUrlRequestAdapter); |
| 544 } | 545 } |
| 545 } catch (Exception e) { | 546 } catch (Exception e) { |
| 546 onListenerException(e); | 547 onListenerException(e); |
| 547 } | 548 } |
| 548 } | 549 } |
| 549 }; | 550 }; |
| 550 postTaskToExecutor(task); | 551 postTaskToExecutor(task); |
| 551 } | 552 } |
| 552 | 553 |
| 553 /** | 554 /** |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 650 private void onAppendResponseHeader(HeadersList headersList, | 651 private void onAppendResponseHeader(HeadersList headersList, |
| 651 String name, String value) { | 652 String name, String value) { |
| 652 headersList.add(Pair.create(name, value)); | 653 headersList.add(Pair.create(name, value)); |
| 653 } | 654 } |
| 654 | 655 |
| 655 // Native methods are implemented in cronet_url_request.cc. | 656 // Native methods are implemented in cronet_url_request.cc. |
| 656 | 657 |
| 657 private native long nativeCreateRequestAdapter( | 658 private native long nativeCreateRequestAdapter( |
| 658 long urlRequestContextAdapter, String url, int priority); | 659 long urlRequestContextAdapter, String url, int priority); |
| 659 | 660 |
| 660 private native boolean nativeAddHeader(long urlRequestAdapter, String name, | 661 @NativeClassQualifiedName("CronetURLRequestAdapter") |
| 661 String value); | 662 private native boolean nativeSetHttpMethod(long nativePtr, String method); |
| 662 | 663 |
| 663 private native boolean nativeSetHttpMethod(long urlRequestAdapter, | 664 @NativeClassQualifiedName("CronetURLRequestAdapter") |
| 664 String method); | 665 private native boolean nativeAddRequestHeader(long nativePtr, String name, S
tring value); |
| 665 | 666 |
| 666 private native void nativeStart(long urlRequestAdapter); | 667 @NativeClassQualifiedName("CronetURLRequestAdapter") |
| 668 private native void nativeDisableCache(long nativePtr); |
| 667 | 669 |
| 668 private native void nativeDestroyRequestAdapter(long urlRequestAdapter); | 670 @NativeClassQualifiedName("CronetURLRequestAdapter") |
| 671 private native void nativeStart(long nativePtr); |
| 669 | 672 |
| 670 private native void nativeFollowDeferredRedirect(long urlRequestAdapter); | 673 @NativeClassQualifiedName("CronetURLRequestAdapter") |
| 674 private native void nativeFollowDeferredRedirect(long nativePtr); |
| 671 | 675 |
| 672 private native void nativeReceiveData(long urlRequestAdapter); | 676 @NativeClassQualifiedName("CronetURLRequestAdapter") |
| 677 private native void nativeReadData(long nativePtr); |
| 673 | 678 |
| 674 private native void nativePopulateResponseHeaders(long urlRequestAdapter, | 679 @NativeClassQualifiedName("CronetURLRequestAdapter") |
| 675 HeadersList headers); | 680 private native void nativeDestroy(long nativePtr); |
| 676 | 681 |
| 677 private native String nativeGetNegotiatedProtocol(long urlRequestAdapter); | 682 @NativeClassQualifiedName("CronetURLRequestAdapter") |
| 683 private native void nativePopulateResponseHeaders(long nativePtr, HeadersLis
t headers); |
| 678 | 684 |
| 679 private native String nativeGetHttpStatusText(long urlRequestAdapter); | 685 @NativeClassQualifiedName("CronetURLRequestAdapter") |
| 686 private native String nativeGetHttpStatusText(long nativePtr); |
| 680 | 687 |
| 681 private native boolean nativeGetWasCached(long urlRequestAdapter); | 688 @NativeClassQualifiedName("CronetURLRequestAdapter") |
| 689 private native String nativeGetNegotiatedProtocol(long nativePtr); |
| 682 | 690 |
| 683 private native long nativeGetTotalReceivedBytes(long urlRequestAdapter); | 691 @NativeClassQualifiedName("CronetURLRequestAdapter") |
| 692 private native boolean nativeGetWasCached(long nativePtr); |
| 684 | 693 |
| 685 private native void nativeDisableCache(long urlRequestAdapter); | 694 @NativeClassQualifiedName("CronetURLRequestAdapter") |
| 695 private native long nativeGetTotalReceivedBytes(long nativePtr); |
| 686 } | 696 } |
| OLD | NEW |