mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/47628 `serverBaseUrl` is currently documented as: > The base URL to the dev server, as addressible from the local developer machine This is problematic in general because `dev-middleware` on a server doesn't necessarily know about where clients might be reaching it from, how tunnels or port-forwards are set up, etc., and this can change over the lifetime of the server and vary between clients. Indeed, our own use of `serverBaseUrl` from both `community-cli-plugin` and internally simply sets it to the host and port the dev server is listening on - ie it's the address of the dev server accessible *from the server*. This PR changes the docs, redefining `serverBaseUrl`, to match the way we currently specify it. One usage where we *do* want the previously documented behaviour is in responses to `/json/list` (`getPageDescriptions`) where the URLs in the response should be reachable by a browser requesting `/json/list`. Here, we use the request (host header, etc.) to attempt to get working base URL. History: It should be mentioned that this is the latest in a series of changes like this: - https://github.com/facebook/react-native/pull/39394 - https://github.com/facebook/react-native/pull/39456 Learning from those: - This change does *not* break Android emulators, which routes `10.0.2.2` to localhost, or other routed devices, because `/open-debugger` still uses server-relative URLs, and now formally delegates to `BrowserLauncher` to decide what to do with those URLs (internally, VSCode / `xdg-open` handles port forwarding) - Middleware configuration is no longer required to specify how it is reachable from clients. This sets up some subsequent changes for more robust handling of tunnelled connections. Changelog: [General][Breaking] dev-middleware: Frameworks should specify `serverBaseUrl` relative to the middleware host. Reviewed By: huntie Differential Revision: D65974487 fbshipit-source-id: 1face8fc7715df387f75b329e80932d8543ee419
50 lines
1.4 KiB
JavaScript
50 lines
1.4 KiB
JavaScript
/**
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @flow strict-local
|
|
* @format
|
|
* @oncall react_native
|
|
*/
|
|
|
|
import getBaseUrlFromRequest from '../utils/getBaseUrlFromRequest';
|
|
|
|
test('returns a base url based on req.headers.host', () => {
|
|
expect(
|
|
getBaseUrlFromRequest(makeRequest('localhost:8081', false))?.href,
|
|
).toEqual('http://localhost:8081/');
|
|
});
|
|
|
|
test('identifies https using socket.encrypted', () => {
|
|
expect(
|
|
getBaseUrlFromRequest(makeRequest('secure.net:8443', true))?.href,
|
|
).toEqual('https://secure.net:8443/');
|
|
});
|
|
|
|
test('works with ipv6 hosts', () => {
|
|
expect(getBaseUrlFromRequest(makeRequest('[::1]:8081', false))?.href).toEqual(
|
|
'http://[::1]:8081/',
|
|
);
|
|
});
|
|
|
|
test('returns null on an invalid host header', () => {
|
|
expect(getBaseUrlFromRequest(makeRequest('local[]host', false))).toBeNull();
|
|
});
|
|
|
|
test('returns null on an empty host header', () => {
|
|
expect(getBaseUrlFromRequest(makeRequest(null, false))).toBeNull();
|
|
});
|
|
|
|
function makeRequest(
|
|
host: ?string,
|
|
encrypted: boolean,
|
|
): http$IncomingMessage<> | http$IncomingMessage<tls$TLSSocket> {
|
|
// $FlowIgnore[incompatible-return] Partial mock of request
|
|
return {
|
|
socket: encrypted ? {encrypted: true} : {},
|
|
headers: host != null ? {host} : {},
|
|
};
|
|
}
|