| OLD | NEW |
| 1 # Quick Start Guide to Using Cronet | 1 # Quick Start Guide to Using Cronet |
| 2 Cronet is the networking stack of Chromium put into a library for use on | 2 Cronet is the networking stack of Chromium put into a library for use on |
| 3 mobile. This is the same networking stack that is used in the Chrome browser | 3 mobile. This is the same networking stack that is used in the Chrome browser |
| 4 by over a billion people. It offers an easy-to-use, high performance, | 4 by over a billion people. It offers an easy-to-use, high performance, |
| 5 standards-compliant, and secure way to perform HTTP requests. Cronet has support | 5 standards-compliant, and secure way to perform HTTP requests. Cronet has support |
| 6 for both Android and iOS. On Android, Cronet offers its own Java asynchronous | 6 for both Android and iOS. On Android, Cronet offers its own Java asynchronous |
| 7 API as well as support for the [java.net.HttpURLConnection] API. | 7 API as well as support for the [java.net.HttpURLConnection] API. |
| 8 This document gives a brief introduction to using these two Java APIs. | 8 This document gives a brief introduction to using these two Java APIs. |
| 9 | 9 |
| 10 ### Basics | 10 ### Basics |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 ResponseInfo responseInfo, UrlRequestException error) { | 61 ResponseInfo responseInfo, UrlRequestException error) { |
| 62 // Request has failed. responseInfo might be null. | 62 // Request has failed. responseInfo might be null. |
| 63 Log.e("MyListener", "Request failed. " + error.getMessage()); | 63 Log.e("MyListener", "Request failed. " + error.getMessage()); |
| 64 // Maybe handle error here. Typical errors include hostname | 64 // Maybe handle error here. Typical errors include hostname |
| 65 // not resolved, connection to server refused, etc. | 65 // not resolved, connection to server refused, etc. |
| 66 } | 66 } |
| 67 } | 67 } |
| 68 | 68 |
| 69 Make a request like this: | 69 Make a request like this: |
| 70 | 70 |
| 71 UrlRequestContextConfig myConfig = new UrlRequestContextConfig(); | 71 CronetEngine.Builder engineBuilder = new CronetEngine.Builder(); |
| 72 CronetUrlRequestContext myRequestContext = | 72 CronetEngine engine = engineBuilder.build(getContext()); |
| 73 new CronetUrlRequestContext(getContext(), myConfig); | |
| 74 Executor executor = Executors.newSingleThreadExecutor(); | 73 Executor executor = Executors.newSingleThreadExecutor(); |
| 75 MyListener listener = new MyListener(); | 74 MyListener listener = new MyListener(); |
| 76 UrlRequest request = myRequestContext.createRequest( | 75 UrlRequest.Builder requestBuilder = new UrlRequest.Builder( |
| 77 "https://www.example.com", listener, executor); | 76 "https://www.example.com", listener, executor); |
| 78 request.start(); | 77 UrlRequest request = engine.executeRequest(requestBuilder); |
| 79 | 78 |
| 80 In the above example, `MyListener` extends `UrlRequestListener`. The request | 79 In the above example, `MyListener` extends `UrlRequestListener`. The request |
| 81 is started asynchronously. When the response is ready (fully or partially), and | 80 is started asynchronously. When the response is ready (fully or partially), and |
| 82 in the event of failures or redirects, `listener`'s methods will be invoked on | 81 in the event of failures or redirects, `listener`'s methods will be invoked on |
| 83 `executor`'s thread to inform the client of the request state and/or response | 82 `executor`'s thread to inform the client of the request state and/or response |
| 84 information. | 83 information. |
| 85 | 84 |
| 86 ### Downloading Data | 85 ### Downloading Data |
| 87 When Cronet fetches response headers from the server or gets them from the | 86 When Cronet fetches response headers from the server or gets them from the |
| 88 cache, `UrlRequestListener.onResponseStarted` will be invoked. To read the | 87 cache, `UrlRequestListener.onResponseStarted` will be invoked. To read the |
| 89 response body, the client should call `UrlRequest.read` and supply a | 88 response body, the client should call `UrlRequest.read` and supply a |
| 90 [ByteBuffer] for Cronet to fill. Once a portion or all of | 89 [ByteBuffer] for Cronet to fill. Once a portion or all of |
| 91 the response body is read, `UrlRequestListener.onReadCompleted` will be invoked. | 90 the response body is read, `UrlRequestListener.onReadCompleted` will be invoked. |
| 92 The client may then read and consume the data within `byteBuffer`. | 91 The client may then read and consume the data within `byteBuffer`. |
| 93 Once the client is ready to consume more data, the client should call | 92 Once the client is ready to consume more data, the client should call |
| 94 `UrlRequest.read` again. The process continues until | 93 `UrlRequest.read` again. The process continues until |
| 95 `UrlRequestListener.onSucceeded` or `UrlRequestListener.onFailed` is invoked, | 94 `UrlRequestListener.onSucceeded` or `UrlRequestListener.onFailed` is invoked, |
| 96 which signals the completion of the request. | 95 which signals the completion of the request. |
| 97 | 96 |
| 98 ### Uploading Data | 97 ### Uploading Data |
| 99 MyUploadDataProvider myUploadDataProvider = new MyUploadDataProvider(); | 98 MyUploadDataProvider myUploadDataProvider = new MyUploadDataProvider(); |
| 100 request.setHttpMethod("POST"); | 99 requestBuilder.setHttpMethod("POST"); |
| 101 request.setUploadDataProvider(myUploadDataProvider, executor); | 100 requestBuilder.setUploadDataProvider(myUploadDataProvider, executor); |
| 102 request.start(); | |
| 103 | 101 |
| 104 In the above example, `MyUploadDataProvider` extends `UploadDataProvider`. | 102 In the above example, `MyUploadDataProvider` extends `UploadDataProvider`. |
| 105 When Cronet is ready to send the request body, | 103 When Cronet is ready to send the request body, |
| 106 `myUploadDataProvider.read(UploadDataSink uploadDataSink, | 104 `myUploadDataProvider.read(UploadDataSink uploadDataSink, |
| 107 ByteBuffer byteBuffer)` will be invoked. The client will need to write the | 105 ByteBuffer byteBuffer)` will be invoked. The client will need to write the |
| 108 request body into `byteBuffer`. Once the client is done writing into | 106 request body into `byteBuffer`. Once the client is done writing into |
| 109 `byteBuffer`, the client can let Cronet know by calling | 107 `byteBuffer`, the client can let Cronet know by calling |
| 110 `uploadDataSink.onReadSucceeded`. If the request body doesn't fit into | 108 `uploadDataSink.onReadSucceeded`. If the request body doesn't fit into |
| 111 `byteBuffer`, the client can continue writing when `UploadDataProvider.read` is | 109 `byteBuffer`, the client can continue writing when `UploadDataProvider.read` is |
| 112 invoked again. For more details, please see the API reference. | 110 invoked again. For more details, please see the API reference. |
| 113 | 111 |
| 114 ### <a id=configuring-cronet></a> Configuring Cronet | 112 ### <a id=configuring-cronet></a> Configuring Cronet |
| 115 Various configuration options are available via the `UrlRequestContextConfig` | 113 Various configuration options are available via the `CronetEngine.Builder` |
| 116 object. | 114 object. |
| 117 | 115 |
| 118 Enabling HTTP/2, QUIC, or SDCH: | 116 Enabling HTTP/2, QUIC, or SDCH: |
| 119 | 117 |
| 120 - For Example: | 118 - For Example: |
| 121 | 119 |
| 122 myConfig.enableSPDY(true).enableQUIC(true).enableSDCH(true); | 120 engineBuilder.enableSPDY(true).enableQUIC(true).enableSDCH(true); |
| 123 | 121 |
| 124 Controlling the cache: | 122 Controlling the cache: |
| 125 | 123 |
| 126 - Use a 100KiB in-memory cache: | 124 - Use a 100KiB in-memory cache: |
| 127 | 125 |
| 128 myConfig.enableHttpCache( | 126 engineBuilder.enableHttpCache( |
| 129 UrlRequestContextConfig.HttpCache.IN_MEMORY, 100 * 1024); | 127 CronetEngine.Builder.HttpCache.IN_MEMORY, 100 * 1024); |
| 130 | 128 |
| 131 - or use a 1MiB disk cache: | 129 - or use a 1MiB disk cache: |
| 132 | 130 |
| 133 myConfig.setStoragePath(storagePathString); | 131 engineBuilder.setStoragePath(storagePathString); |
| 134 myConfig.enableHttpCache(UrlRequestContextConfig.HttpCache.DISK, | 132 engineBuilder.enableHttpCache(CronetEngine.Builder.HttpCache.DISK, |
| 135 1024 * 1024); | 133 1024 * 1024); |
| 136 | 134 |
| 137 ### Debugging | 135 ### Debugging |
| 138 To get more information about how Cronet is processing network | 136 To get more information about how Cronet is processing network |
| 139 requests, you can start and stop **NetLog** logging by calling | 137 requests, you can start and stop **NetLog** logging by calling |
| 140 `UrlRequestContext.startNetLogToFile` and `UrlRequestContext.stopNetLog`. | 138 `CronetEngine.startNetLogToFile` and `CronetEngine.stopNetLog`. |
| 141 Bear in mind that logs may contain sensitive data. You may analyze the | 139 Bear in mind that logs may contain sensitive data. You may analyze the |
| 142 generated log by navigating to [chrome://net-internals#import] using a | 140 generated log by navigating to [chrome://net-internals#import] using a |
| 143 Chrome browser. | 141 Chrome browser. |
| 144 | 142 |
| 145 # Using the java.net.HttpURLConnection API | 143 # Using the java.net.HttpURLConnection API |
| 146 Cronet offers an implementation of the [java.net.HttpURLConnection] API to make | 144 Cronet offers an implementation of the [java.net.HttpURLConnection] API to make |
| 147 it easier for apps which rely on this API to use Cronet. | 145 it easier for apps which rely on this API to use Cronet. |
| 148 To use Cronet's implementation instead of the system's default implementation, | 146 To use Cronet's implementation instead of the system's default implementation, |
| 149 simply do the following: | 147 simply do the following: |
| 150 | 148 |
| 151 CronetURLStreamHandlerFactory streamHandlerFactory = | 149 CronetURLStreamHandlerFactory streamHandlerFactory = |
| 152 new CronetURLStreamHandlerFactory(getContext(), myConfig); | 150 new CronetURLStreamHandlerFactory(getContext(), engineBuilder); |
| 153 URL.setURLStreamHandlerFactory(streamHandlerFactory); | 151 URL.setURLStreamHandlerFactory(streamHandlerFactory); |
| 154 | 152 |
| 155 Cronet's | 153 Cronet's |
| 156 HttpURLConnection implementation has some limitations as compared to the system | 154 HttpURLConnection implementation has some limitations as compared to the system |
| 157 implementation, including not utilizing the default system HTTP cache (Please | 155 implementation, including not utilizing the default system HTTP cache (Please |
| 158 see {@link org.chromium.net.urlconnection.CronetURLStreamHandlerFactory} for | 156 see {@link org.chromium.net.urlconnection.CronetURLStreamHandlerFactory} for |
| 159 more information). | 157 more information). |
| 160 You can configure Cronet and control caching through the | 158 You can configure Cronet and control caching through the |
| 161 `UrlRequestContextConfig` instance, `myConfig` | 159 `CronetEngine.Builder` instance, `engineBuilder` |
| 162 (See [Configuring Cronet](#configuring-cronet) section), before you pass it | 160 (See [Configuring Cronet](#configuring-cronet) section), before you pass it |
| 163 into the `CronetURLStreamHandlerFactory` constructor. | 161 into the `CronetURLStreamHandlerFactory` constructor. |
| 164 | 162 |
| 165 [ByteBuffer]: https://developer.android.com/reference/java/nio/ByteBuffer.html | 163 [ByteBuffer]: https://developer.android.com/reference/java/nio/ByteBuffer.html |
| 166 [chrome://net-internals#import]: chrome://net-internals#import | 164 [chrome://net-internals#import]: chrome://net-internals#import |
| 167 [java.net.HttpURLConnection]: https://developer.android.com/reference/java/net/H
ttpURLConnection.html | 165 [java.net.HttpURLConnection]: https://developer.android.com/reference/java/net/H
ttpURLConnection.html |
| OLD | NEW |