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 | 8 |
9 import org.apache.http.conn.ConnectTimeoutException; | 9 import org.apache.http.conn.ConnectTimeoutException; |
10 import org.chromium.base.CalledByNative; | 10 import org.chromium.base.CalledByNative; |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 /** | 207 /** |
208 * Sets data to upload as part of a POST or PUT request. | 208 * Sets data to upload as part of a POST or PUT request. |
209 * | 209 * |
210 * @param contentType MIME type of the upload content or null if this is not | 210 * @param contentType MIME type of the upload content or null if this is not |
211 * an upload. | 211 * an upload. |
212 * @param data The content that needs to be uploaded. | 212 * @param data The content that needs to be uploaded. |
213 */ | 213 */ |
214 public void setUploadData(String contentType, byte[] data) { | 214 public void setUploadData(String contentType, byte[] data) { |
215 synchronized (mLock) { | 215 synchronized (mLock) { |
216 validateNotStarted(); | 216 validateNotStarted(); |
| 217 validateContentType(contentType); |
217 mUploadContentType = contentType; | 218 mUploadContentType = contentType; |
218 mUploadData = data; | 219 mUploadData = data; |
219 mUploadChannel = null; | 220 mUploadChannel = null; |
220 mChunkedUpload = false; | 221 mChunkedUpload = false; |
221 } | 222 } |
222 } | 223 } |
223 | 224 |
224 /** | 225 /** |
225 * Sets a readable byte channel to upload as part of a POST or PUT request. | 226 * Sets a readable byte channel to upload as part of a POST or PUT request. |
226 * | 227 * |
227 * @param contentType MIME type of the upload content or null if this is not | 228 * @param contentType MIME type of the upload content or null if this is not |
228 * an upload request. | 229 * an upload request. |
229 * @param channel The channel to read to read upload data from if this is an | 230 * @param channel The channel to read to read upload data from if this is an |
230 * upload request. | 231 * upload request. |
231 * @param contentLength The length of data to upload. | 232 * @param contentLength The length of data to upload. |
232 */ | 233 */ |
233 public void setUploadChannel(String contentType, | 234 public void setUploadChannel(String contentType, |
234 ReadableByteChannel channel, long contentLength) { | 235 ReadableByteChannel channel, long contentLength) { |
235 synchronized (mLock) { | 236 synchronized (mLock) { |
236 validateNotStarted(); | 237 validateNotStarted(); |
| 238 validateContentType(contentType); |
237 mUploadContentType = contentType; | 239 mUploadContentType = contentType; |
238 mUploadChannel = channel; | 240 mUploadChannel = channel; |
239 mUploadContentLength = contentLength; | 241 mUploadContentLength = contentLength; |
240 mUploadData = null; | 242 mUploadData = null; |
241 mChunkedUpload = false; | 243 mChunkedUpload = false; |
242 } | 244 } |
243 } | 245 } |
244 | 246 |
245 /** | 247 /** |
246 * Sets this request up for chunked uploading. To upload data call | 248 * Sets this request up for chunked uploading. To upload data call |
247 * {@link #appendChunk(ByteBuffer, boolean)} after {@link #start()}. | 249 * {@link #appendChunk(ByteBuffer, boolean)} after {@link #start()}. |
248 * | 250 * |
249 * @param contentType MIME type of the post content or null if this is not a | 251 * @param contentType MIME type of the post content or null if this is not a |
250 * POST request. | 252 * POST request. |
251 */ | 253 */ |
252 public void setChunkedUpload(String contentType) { | 254 public void setChunkedUpload(String contentType) { |
253 synchronized (mLock) { | 255 synchronized (mLock) { |
254 validateNotStarted(); | 256 validateNotStarted(); |
| 257 validateContentType(contentType); |
255 mUploadContentType = contentType; | 258 mUploadContentType = contentType; |
256 mChunkedUpload = true; | 259 mChunkedUpload = true; |
257 mUploadData = null; | 260 mUploadData = null; |
258 mUploadChannel = null; | 261 mUploadChannel = null; |
259 } | 262 } |
260 } | 263 } |
261 | 264 |
262 /** | 265 /** |
263 * Uploads a new chunk. Must have called {@link #setChunkedUpload(String)} | 266 * Uploads a new chunk. Must have called {@link #setChunkedUpload(String)} |
264 * and {@link #start()}. | 267 * and {@link #start()}. |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
448 throw new IllegalStateException("Request already started"); | 451 throw new IllegalStateException("Request already started"); |
449 } | 452 } |
450 } | 453 } |
451 | 454 |
452 private void validateHeadersAvailable() { | 455 private void validateHeadersAvailable() { |
453 if (!mHeadersAvailable) { | 456 if (!mHeadersAvailable) { |
454 throw new IllegalStateException("Response headers not available"); | 457 throw new IllegalStateException("Response headers not available"); |
455 } | 458 } |
456 } | 459 } |
457 | 460 |
| 461 private void validateContentType(String contentType) { |
| 462 if (contentType == null) { |
| 463 throw new NullPointerException("contentType is required"); |
| 464 } |
| 465 } |
| 466 |
458 // Private methods called by native library. | 467 // Private methods called by native library. |
459 | 468 |
460 /** | 469 /** |
461 * If @CalledByNative method throws an exception, request gets cancelled | 470 * If @CalledByNative method throws an exception, request gets cancelled |
462 * and exception could be retrieved from request using getException(). | 471 * and exception could be retrieved from request using getException(). |
463 */ | 472 */ |
464 private void onCalledByNativeException(Exception e) { | 473 private void onCalledByNativeException(Exception e) { |
465 mSinkException = new IOException( | 474 mSinkException = new IOException( |
466 "CalledByNative method has thrown an exception", e); | 475 "CalledByNative method has thrown an exception", e); |
467 Log.e(ChromiumUrlRequestContext.LOG_TAG, | 476 Log.e(ChromiumUrlRequestContext.LOG_TAG, |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
675 | 684 |
676 private native String nativeGetHeader(long urlRequestAdapter, String name); | 685 private native String nativeGetHeader(long urlRequestAdapter, String name); |
677 | 686 |
678 private native void nativeGetAllHeaders(long urlRequestAdapter, | 687 private native void nativeGetAllHeaders(long urlRequestAdapter, |
679 ResponseHeadersMap headers); | 688 ResponseHeadersMap headers); |
680 | 689 |
681 // Explicit class to work around JNI-generator generics confusion. | 690 // Explicit class to work around JNI-generator generics confusion. |
682 private class ResponseHeadersMap extends HashMap<String, List<String>> { | 691 private class ResponseHeadersMap extends HashMap<String, List<String>> { |
683 } | 692 } |
684 } | 693 } |
OLD | NEW |