Permalink
Browse files

Add back ability to customise OkHttp client

Summary:
Prior to 0a71f48, users could customise the OkHttp client used by React Native on Android by calling replaceOkHttpClient in OkHttpClientProvider.

This functionality has a variety of legitimate applications from changing connection timeouts or pool size to Stetho integration. The challenge is to add back support for replacing the client without causing a breaking change or reintroducing the problems olegbl sought to address in his original commit.

Introducing a client factory archives these aims, it adds a new, backwards compatible interface and is called each time a client is requested rather than re-using the same instance (unless you explicitly want this behaviour, in which case you could replicate it using a static class property inside your custom factory).

A number of PRs have been opened to add this functionality: #14675, #14068.

I don't have a lot of Java experience so I'm open to better/more idiomatic ways to achieve this :)

Create React Native application and set a custom factory in the constructor, e.g.  `OkHttpClientProvider.setOkHttpClientFactory(new CustomNetworkModule());`

Where a custom factory would look like:

```
class CustomNetworkModule implements OkHttpClientFactory {
    public OkHttpClient createNewNetworkModuleClient() {
        return new OkHttpClient.Builder().build();
    }
}
```

Remove the existing replace client method to prevent accident use and alert existing users that its functionality has changed: #16972

[Android] [Minor] [Networking] - | Provide interface for customising the OkHttp client used by React Native |
Closes #17237

Differential Revision: D6837734

Pulled By: hramos

fbshipit-source-id: 81e63df7716e6f9039ea12e99233f6336c6dd7ef
  • Loading branch information...
cdlewis authored and facebook-github-bot committed Jan 30, 2018
1 parent ef4214a commit 22efd95be1f0b236eeaaa8a8e6d01e89771c9543
@@ -0,0 +1,16 @@
/**
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* 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.network;
import okhttp3.OkHttpClient;
public interface OkHttpClientFactory {
OkHttpClient createNewNetworkModuleClient();
};
@@ -32,6 +32,13 @@
// Centralized OkHttpClient for all networking requests.
private static @Nullable OkHttpClient sClient;
// User-provided OkHttpClient factory
private static @Nullable OkHttpClientFactory sFactory;
public static void setOkHttpClientFactory(OkHttpClientFactory factory) {
sFactory = factory;
}
public static OkHttpClient getOkHttpClient() {
if (sClient == null) {
sClient = createClient();
@@ -46,6 +53,10 @@ public static void replaceOkHttpClient(OkHttpClient client) {
}
public static OkHttpClient createClient() {
if (sFactory != null) {
return sFactory.createNewNetworkModuleClient();
}
// No timeouts by default
OkHttpClient.Builder client = new OkHttpClient.Builder()
.connectTimeout(0, TimeUnit.MILLISECONDS)

0 comments on commit 22efd95

Please sign in to comment.