mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Android: Support HTTP headers for source prop on <Image> components
Summary: A copy of https://github.com/facebook/react-native/pull/7791 because of our very imperfect tools that mirror the changes from pull requests in the fb monorepo. The internal Phabricator revision for #7791 is in an 'abandoned' state (by foghina probably because of changing teams) and Phabricator doesn't allow me to claim that revision and merge it. Therefore I'm creating a new one. (It's not foghina's fault, no one probably knew about this "abandoned Phabricator revision" edge case, don't remember we hit it before.) Will try to keep attribution (git blame) to rigdern when merging. Closes https://github.com/facebook/react-native/pull/12448 Differential Revision: D4584743 Pulled By: mkonicek fbshipit-source-id: 66e5b88134fca1980adc4cd8a2ff17c42e10022c
This commit is contained in:
committed by
Facebook Github Bot
parent
c7f2c53fbf
commit
8c0e6ecfc0
@@ -28,6 +28,8 @@ import com.facebook.react.modules.common.ModuleDataCleaner;
|
||||
import com.facebook.react.modules.network.OkHttpClientProvider;
|
||||
import com.facebook.soloader.SoLoader;
|
||||
|
||||
import okhttp3.OkHttpClient;
|
||||
|
||||
/**
|
||||
* Module to initialize the Fresco library.
|
||||
*
|
||||
@@ -124,8 +126,10 @@ public class FrescoModule extends ReactContextBaseJavaModule implements
|
||||
HashSet<RequestListener> requestListeners = new HashSet<>();
|
||||
requestListeners.add(new SystraceRequestListener());
|
||||
|
||||
OkHttpClient okHttpClient = OkHttpClientProvider.getOkHttpClient();
|
||||
return OkHttpImagePipelineConfigFactory
|
||||
.newBuilder(context.getApplicationContext(), OkHttpClientProvider.getOkHttpClient())
|
||||
.newBuilder(context.getApplicationContext(), okHttpClient)
|
||||
.setNetworkFetcher(new ReactOkHttpNetworkFetcher(okHttpClient))
|
||||
.setDownsampleEnabled(false)
|
||||
.setRequestListeners(requestListeners);
|
||||
}
|
||||
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
* <p/>
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*/
|
||||
|
||||
package com.facebook.react.modules.fresco;
|
||||
|
||||
import com.facebook.imagepipeline.request.ImageRequest;
|
||||
import com.facebook.imagepipeline.request.ImageRequestBuilder;
|
||||
import com.facebook.react.bridge.ReadableMap;
|
||||
|
||||
/** Extended ImageRequest with request headers */
|
||||
public class ReactNetworkImageRequest extends ImageRequest {
|
||||
|
||||
/** Headers for the request */
|
||||
private final ReadableMap mHeaders;
|
||||
|
||||
public static ReactNetworkImageRequest fromBuilderWithHeaders(ImageRequestBuilder builder,
|
||||
ReadableMap headers) {
|
||||
return new ReactNetworkImageRequest(builder, headers);
|
||||
}
|
||||
|
||||
protected ReactNetworkImageRequest(ImageRequestBuilder builder, ReadableMap headers) {
|
||||
super(builder);
|
||||
this.mHeaders = headers;
|
||||
}
|
||||
|
||||
public ReadableMap getHeaders() {
|
||||
return mHeaders;
|
||||
}
|
||||
}
|
||||
+81
@@ -0,0 +1,81 @@
|
||||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
* <p/>
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*/
|
||||
|
||||
package com.facebook.react.modules.fresco;
|
||||
|
||||
import android.net.Uri;
|
||||
import android.os.SystemClock;
|
||||
|
||||
import com.facebook.imagepipeline.backends.okhttp3.OkHttpNetworkFetcher;
|
||||
import com.facebook.react.bridge.ReadableMap;
|
||||
import com.facebook.react.bridge.ReadableMapKeySetIterator;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import okhttp3.CacheControl;
|
||||
import okhttp3.Headers;
|
||||
import okhttp3.OkHttpClient;
|
||||
import okhttp3.Request;
|
||||
|
||||
class ReactOkHttpNetworkFetcher extends OkHttpNetworkFetcher {
|
||||
|
||||
private static final String TAG = "ReactOkHttpNetworkFetcher";
|
||||
|
||||
private final OkHttpClient mOkHttpClient;
|
||||
private final Executor mCancellationExecutor;
|
||||
|
||||
/**
|
||||
* @param okHttpClient client to use
|
||||
*/
|
||||
public ReactOkHttpNetworkFetcher(OkHttpClient okHttpClient) {
|
||||
super(okHttpClient);
|
||||
mOkHttpClient = okHttpClient;
|
||||
mCancellationExecutor = okHttpClient.dispatcher().executorService();
|
||||
}
|
||||
|
||||
private Map<String, String> getHeaders(ReadableMap readableMap) {
|
||||
if (readableMap == null) {
|
||||
return null;
|
||||
}
|
||||
ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
|
||||
Map<String, String> map = new HashMap<>();
|
||||
while (iterator.hasNextKey()) {
|
||||
String key = iterator.nextKey();
|
||||
String value = readableMap.getString(key);
|
||||
map.put(key, value);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fetch(final OkHttpNetworkFetchState fetchState, final Callback callback) {
|
||||
fetchState.submitTime = SystemClock.elapsedRealtime();
|
||||
final Uri uri = fetchState.getUri();
|
||||
Map<String, String> requestHeaders = null;
|
||||
if (fetchState.getContext().getImageRequest() instanceof ReactNetworkImageRequest) {
|
||||
ReactNetworkImageRequest networkImageRequest = (ReactNetworkImageRequest)
|
||||
fetchState.getContext().getImageRequest();
|
||||
requestHeaders = getHeaders(networkImageRequest.getHeaders());
|
||||
}
|
||||
if (requestHeaders == null) {
|
||||
requestHeaders = Collections.emptyMap();
|
||||
}
|
||||
final Request request = new Request.Builder()
|
||||
.cacheControl(new CacheControl.Builder().noStore().build())
|
||||
.url(uri.toString())
|
||||
.headers(Headers.of(requestHeaders))
|
||||
.get()
|
||||
.build();
|
||||
|
||||
fetchWithRequest(fetchState, callback, request);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user