1 // Copyright 2016 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 package org.chromium.net.impl; 5 6 import androidx.annotation.IntDef; 7 8 import android.net.http.ExperimentalUrlRequest; 9 import android.net.http.UploadDataProvider; 10 import android.net.http.UrlRequest; 11 12 import java.lang.annotation.Retention; 13 import java.lang.annotation.RetentionPolicy; 14 import java.util.concurrent.Executor; 15 16 /** 17 * Base class for classes that implement {@link UrlRequest} including experimental 18 * features. 19 */ 20 public abstract class UrlRequestBase extends ExperimentalUrlRequest { 21 /** 22 * Sets the HTTP method verb to use for this request. Must be done before 23 * request has started. 24 * 25 * <p>The default when this method is not called is "GET" if the request has 26 * no body or "POST" if it does. 27 * 28 * @param method "GET", "HEAD", "DELETE", "POST" or "PUT". 29 */ setHttpMethod(String method)30 protected abstract void setHttpMethod(String method); 31 32 /** 33 * Sets upload data provider. Must be done before request has started. May only be 34 * invoked once per request. Switches method to "POST" if not explicitly 35 * set. Starting the request will throw an exception if a Content-Type 36 * header is not set. 37 * 38 * @param uploadDataProvider responsible for providing the upload data. 39 * @param executor All {@code uploadDataProvider} methods will be invoked 40 * using this {@code Executor}. May optionally be the same 41 * {@code Executor} the request itself is using. 42 */ setUploadDataProvider( UploadDataProvider uploadDataProvider, Executor executor)43 protected abstract void setUploadDataProvider( 44 UploadDataProvider uploadDataProvider, Executor executor); 45 46 /** 47 * Possible URL Request statuses. 48 */ 49 @IntDef({Status.INVALID, Status.IDLE, Status.WAITING_FOR_STALLED_SOCKET_POOL, 50 Status.WAITING_FOR_AVAILABLE_SOCKET, Status.WAITING_FOR_DELEGATE, 51 Status.WAITING_FOR_CACHE, Status.DOWNLOADING_PAC_FILE, Status.RESOLVING_PROXY_FOR_URL, 52 Status.RESOLVING_HOST_IN_PAC_FILE, Status.ESTABLISHING_PROXY_TUNNEL, 53 Status.RESOLVING_HOST, Status.CONNECTING, Status.SSL_HANDSHAKE, Status.SENDING_REQUEST, 54 Status.WAITING_FOR_RESPONSE, Status.READING_RESPONSE}) 55 @Retention(RetentionPolicy.SOURCE) 56 public @interface StatusValues {} 57 58 /** 59 * Convert a LoadState int to one of values listed above. 60 * @param loadState a LoadState to convert. 61 * @return static int Status. 62 */ 63 @StatusValues convertLoadState(int loadState)64 public static int convertLoadState(int loadState) { 65 assert loadState >= LoadState.IDLE && loadState <= LoadState.READING_RESPONSE; 66 switch (loadState) { 67 case (LoadState.IDLE): 68 return Status.IDLE; 69 70 case (LoadState.WAITING_FOR_STALLED_SOCKET_POOL): 71 return Status.WAITING_FOR_STALLED_SOCKET_POOL; 72 73 case (LoadState.WAITING_FOR_AVAILABLE_SOCKET): 74 return Status.WAITING_FOR_AVAILABLE_SOCKET; 75 76 case (LoadState.WAITING_FOR_DELEGATE): 77 return Status.WAITING_FOR_DELEGATE; 78 79 case (LoadState.WAITING_FOR_CACHE): 80 return Status.WAITING_FOR_CACHE; 81 82 case (LoadState.DOWNLOADING_PAC_FILE): 83 return Status.DOWNLOADING_PAC_FILE; 84 85 case (LoadState.RESOLVING_PROXY_FOR_URL): 86 return Status.RESOLVING_PROXY_FOR_URL; 87 88 case (LoadState.RESOLVING_HOST_IN_PAC_FILE): 89 return Status.RESOLVING_HOST_IN_PAC_FILE; 90 91 case (LoadState.ESTABLISHING_PROXY_TUNNEL): 92 return Status.ESTABLISHING_PROXY_TUNNEL; 93 94 case (LoadState.RESOLVING_HOST): 95 return Status.RESOLVING_HOST; 96 97 case (LoadState.CONNECTING): 98 return Status.CONNECTING; 99 100 case (LoadState.SSL_HANDSHAKE): 101 return Status.SSL_HANDSHAKE; 102 103 case (LoadState.SENDING_REQUEST): 104 return Status.SENDING_REQUEST; 105 106 case (LoadState.WAITING_FOR_RESPONSE): 107 return Status.WAITING_FOR_RESPONSE; 108 109 case (LoadState.READING_RESPONSE): 110 return Status.READING_RESPONSE; 111 112 default: 113 // A load state is retrieved but there is no corresponding 114 // request status. This most likely means that the mapping is 115 // incorrect. 116 throw new IllegalArgumentException("No request status found."); 117 } 118 } 119 } 120