1 // Copyright 2023 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 5 package org.chromium.net.impl; 6 7 import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_API_LEVEL; 8 import static org.chromium.net.impl.HttpEngineNativeProvider.EXT_VERSION; 9 10 import android.net.http.HttpException; 11 12 import androidx.annotation.NonNull; 13 import androidx.annotation.Nullable; 14 15 import androidx.annotation.RequiresExtension; 16 import java.nio.ByteBuffer; 17 import java.util.Objects; 18 19 @RequiresExtension(extension = EXT_API_LEVEL, version = EXT_VERSION) 20 @SuppressWarnings("Override") 21 class AndroidUrlRequestCallbackWrapper implements android.net.http.UrlRequest.Callback { 22 private final org.chromium.net.UrlRequest.Callback mBackend; 23 AndroidUrlRequestCallbackWrapper(org.chromium.net.UrlRequest.Callback backend)24 public AndroidUrlRequestCallbackWrapper(org.chromium.net.UrlRequest.Callback backend) { 25 Objects.requireNonNull(backend, "Callback is required."); 26 this.mBackend = backend; 27 } 28 29 /** 30 * @see <a 31 * href="https://developer.android.com/training/basics/network-ops/reading-network-state#listening-events">Foo 32 * Bar</a> 33 */ 34 @Override onRedirectReceived( android.net.http.UrlRequest request, android.net.http.UrlResponseInfo info, String newLocationUrl)35 public void onRedirectReceived( 36 android.net.http.UrlRequest request, 37 android.net.http.UrlResponseInfo info, 38 String newLocationUrl) 39 throws Exception { 40 CronetExceptionTranslationUtils.executeTranslatingCronetExceptions( 41 () -> { 42 AndroidUrlResponseInfoWrapper specializedResponseInfo = 43 AndroidUrlResponseInfoWrapper.createForUrlRequest(info); 44 AndroidUrlRequestWrapper specializedRequest = 45 new AndroidUrlRequestWrapper(request); 46 mBackend.onRedirectReceived( 47 specializedRequest, specializedResponseInfo, newLocationUrl); 48 return null; 49 }, 50 Exception.class); 51 } 52 53 @Override onResponseStarted( android.net.http.UrlRequest request, android.net.http.UrlResponseInfo info)54 public void onResponseStarted( 55 android.net.http.UrlRequest request, android.net.http.UrlResponseInfo info) 56 throws Exception { 57 CronetExceptionTranslationUtils.executeTranslatingCronetExceptions( 58 () -> { 59 AndroidUrlResponseInfoWrapper specializedResponseInfo = 60 AndroidUrlResponseInfoWrapper.createForUrlRequest(info); 61 AndroidUrlRequestWrapper specializedRequest = 62 new AndroidUrlRequestWrapper(request); 63 mBackend.onResponseStarted(specializedRequest, specializedResponseInfo); 64 return null; 65 }, 66 Exception.class); 67 } 68 69 @Override onReadCompleted( android.net.http.UrlRequest request, android.net.http.UrlResponseInfo info, ByteBuffer byteBuffer)70 public void onReadCompleted( 71 android.net.http.UrlRequest request, 72 android.net.http.UrlResponseInfo info, 73 ByteBuffer byteBuffer) 74 throws Exception { 75 CronetExceptionTranslationUtils.executeTranslatingCronetExceptions( 76 () -> { 77 AndroidUrlResponseInfoWrapper specializedResponseInfo = 78 AndroidUrlResponseInfoWrapper.createForUrlRequest(info); 79 AndroidUrlRequestWrapper specializedRequest = 80 new AndroidUrlRequestWrapper(request); 81 mBackend.onReadCompleted( 82 specializedRequest, specializedResponseInfo, byteBuffer); 83 return null; 84 }, 85 Exception.class); 86 } 87 88 @Override onSucceeded( android.net.http.UrlRequest request, android.net.http.UrlResponseInfo info)89 public void onSucceeded( 90 android.net.http.UrlRequest request, android.net.http.UrlResponseInfo info) { 91 AndroidUrlResponseInfoWrapper specializedResponseInfo = 92 AndroidUrlResponseInfoWrapper.createForUrlRequest(info); 93 AndroidUrlRequestWrapper specializedRequest = new AndroidUrlRequestWrapper(request); 94 mBackend.onSucceeded(specializedRequest, specializedResponseInfo); 95 } 96 97 @Override onFailed( android.net.http.UrlRequest request, android.net.http.UrlResponseInfo info, HttpException error)98 public void onFailed( 99 android.net.http.UrlRequest request, 100 android.net.http.UrlResponseInfo info, 101 HttpException error) { 102 AndroidUrlResponseInfoWrapper specializedResponseInfo = 103 AndroidUrlResponseInfoWrapper.createForUrlRequest(info); 104 AndroidUrlRequestWrapper specializedRequest = new AndroidUrlRequestWrapper(request); 105 mBackend.onFailed( 106 specializedRequest, 107 specializedResponseInfo, 108 CronetExceptionTranslationUtils.translateCheckedAndroidCronetException(error)); 109 } 110 111 @Override onCanceled( @onNull android.net.http.UrlRequest request, @Nullable android.net.http.UrlResponseInfo info)112 public void onCanceled( 113 @NonNull android.net.http.UrlRequest request, 114 @Nullable android.net.http.UrlResponseInfo info) { 115 AndroidUrlResponseInfoWrapper specializedResponseInfo = 116 AndroidUrlResponseInfoWrapper.createForUrlRequest(info); 117 AndroidUrlRequestWrapper specializedRequest = new AndroidUrlRequestWrapper(request); 118 mBackend.onCanceled(specializedRequest, specializedResponseInfo); 119 } 120 } 121