From 3081db28a728298e2bb938abdcea246534904690 Mon Sep 17 00:00:00 2001 From: Amy Nichol Date: Wed, 28 Jul 2021 11:11:17 -0700 Subject: [PATCH] Refactor DevServerHelper to separate checking if packager running Summary: Changelog: [Internal] Separate the functionality of the isPackagerRunning() function into a new class PackagerStatusCheck with the intention of being able to use this without needing a DevServerHelper Reviewed By: makovkastar, ShikaSD Differential Revision: D29933318 fbshipit-source-id: d708bb987b08634015d6ee6b6c8989faba416c5a --- .../react/devsupport/DevServerHelper.java | 67 ++---------- .../react/devsupport/PackagerStatusCheck.java | 100 ++++++++++++++++++ 2 files changed, 109 insertions(+), 58 deletions(-) create mode 100644 ReactAndroid/src/main/java/com/facebook/react/devsupport/PackagerStatusCheck.java diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevServerHelper.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevServerHelper.java index 88bb1764b90d13..121a4bd7b47456 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevServerHelper.java +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevServerHelper.java @@ -41,7 +41,6 @@ import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; -import okhttp3.ResponseBody; import okio.Okio; import okio.Sink; import org.json.JSONArray; @@ -63,8 +62,6 @@ public class DevServerHelper { public static final String RELOAD_APP_EXTRA_JS_PROXY = "jsproxy"; - private static final String PACKAGER_OK_STATUS = "packager-status:running"; - private static final int HTTP_CONNECT_TIMEOUT_MS = 5000; private static final String DEBUGGER_MSG_DISABLE = "{ \"id\":1,\"method\":\"Debugger.disable\" }"; @@ -113,6 +110,7 @@ public String typeID() { private final DevInternalSettings mSettings; private final OkHttpClient mClient; private final BundleDownloader mBundleDownloader; + private final PackagerStatusCheck mPackagerStatusCheck; private final String mPackageName; private @Nullable JSPackagerClient mPackagerClient; @@ -132,7 +130,7 @@ public DevServerHelper( .writeTimeout(0, TimeUnit.MILLISECONDS) .build(); mBundleDownloader = new BundleDownloader(mClient); - + mPackagerStatusCheck = new PackagerStatusCheck(mClient); mPackageName = packageName; } @@ -477,60 +475,13 @@ public String getDevServerSplitBundleURL(String jsModulePath) { } public void isPackagerRunning(final PackagerStatusCallback callback) { - String statusURL = - createPackagerStatusURL(mSettings.getPackagerConnectionSettings().getDebugServerHost()); - Request request = new Request.Builder().url(statusURL).build(); - - mClient - .newCall(request) - .enqueue( - new Callback() { - @Override - public void onFailure(Call call, IOException e) { - FLog.w( - ReactConstants.TAG, - "The packager does not seem to be running as we got an IOException requesting " - + "its status: " - + e.getMessage()); - callback.onPackagerStatusFetched(false); - } - - @Override - public void onResponse(Call call, Response response) throws IOException { - if (!response.isSuccessful()) { - FLog.e( - ReactConstants.TAG, - "Got non-success http code from packager when requesting status: " - + response.code()); - callback.onPackagerStatusFetched(false); - return; - } - ResponseBody body = response.body(); - if (body == null) { - FLog.e( - ReactConstants.TAG, - "Got null body response from packager when requesting status"); - callback.onPackagerStatusFetched(false); - return; - } - String bodyString = - body.string(); // cannot call body.string() twice, stored it into variable. - // https://github.com/square/okhttp/issues/1240#issuecomment-68142603 - if (!PACKAGER_OK_STATUS.equals(bodyString)) { - FLog.e( - ReactConstants.TAG, - "Got unexpected response from packager when requesting status: " - + bodyString); - callback.onPackagerStatusFetched(false); - return; - } - callback.onPackagerStatusFetched(true); - } - }); - } - - private static String createPackagerStatusURL(String host) { - return String.format(Locale.US, "http://%s/status", host); + String host = mSettings.getPackagerConnectionSettings().getDebugServerHost(); + if (host == null) { + FLog.w(ReactConstants.TAG, "No packager host configured."); + callback.onPackagerStatusFetched(false); + } else { + mPackagerStatusCheck.run(host, callback); + } } private String createLaunchJSDevtoolsCommandUrl() { diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/PackagerStatusCheck.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/PackagerStatusCheck.java new file mode 100644 index 00000000000000..b83ca3ece7f545 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/PackagerStatusCheck.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.devsupport; + +import com.facebook.common.logging.FLog; +import com.facebook.react.common.ReactConstants; +import com.facebook.react.devsupport.interfaces.PackagerStatusCallback; +import java.io.IOException; +import java.util.Locale; +import java.util.concurrent.TimeUnit; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.ResponseBody; + +/** Use this class to check if the JavaScript packager is running on the provided host. */ +public class PackagerStatusCheck { + + private static final String PACKAGER_OK_STATUS = "packager-status:running"; + private static final int HTTP_CONNECT_TIMEOUT_MS = 5000; + private static final String PACKAGER_STATUS_URL_TEMPLATE = "http://%s/status"; + + private final OkHttpClient mClient; + + public PackagerStatusCheck() { + mClient = + new OkHttpClient.Builder() + .connectTimeout(HTTP_CONNECT_TIMEOUT_MS, TimeUnit.MILLISECONDS) + .readTimeout(0, TimeUnit.MILLISECONDS) + .writeTimeout(0, TimeUnit.MILLISECONDS) + .build(); + } + + public PackagerStatusCheck(OkHttpClient client) { + mClient = client; + } + + public void run(String host, final PackagerStatusCallback callback) { + String statusURL = createPackagerStatusURL(host); + Request request = new Request.Builder().url(statusURL).build(); + + mClient + .newCall(request) + .enqueue( + new Callback() { + @Override + public void onFailure(Call call, IOException e) { + FLog.w( + ReactConstants.TAG, + "The packager does not seem to be running as we got an IOException requesting " + + "its status: " + + e.getMessage()); + callback.onPackagerStatusFetched(false); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + if (!response.isSuccessful()) { + FLog.e( + ReactConstants.TAG, + "Got non-success http code from packager when requesting status: " + + response.code()); + callback.onPackagerStatusFetched(false); + return; + } + ResponseBody body = response.body(); + if (body == null) { + FLog.e( + ReactConstants.TAG, + "Got null body response from packager when requesting status"); + callback.onPackagerStatusFetched(false); + return; + } + String bodyString = + body.string(); // cannot call body.string() twice, stored it into variable. + // https://github.com/square/okhttp/issues/1240#issuecomment-68142603 + if (!PACKAGER_OK_STATUS.equals(bodyString)) { + FLog.e( + ReactConstants.TAG, + "Got unexpected response from packager when requesting status: " + + bodyString); + callback.onPackagerStatusFetched(false); + return; + } + callback.onPackagerStatusFetched(true); + } + }); + } + + private static String createPackagerStatusURL(String host) { + return String.format(Locale.US, PACKAGER_STATUS_URL_TEMPLATE, host); + } +}