Skip to content

Commit 1c830ad

Browse files
fix(http): pass original url as query param on the proxy url (#7527) (#7604)
Co-authored-by: Michael Wolz <[email protected]>
1 parent bb23779 commit 1c830ad

File tree

7 files changed

+27
-63
lines changed

7 files changed

+27
-63
lines changed

android/capacitor/src/main/assets/native-bridge.js

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -144,23 +144,19 @@ var nativeBridge = (function (exports) {
144144
return { data: body, type: 'json' };
145145
};
146146
const CAPACITOR_HTTP_INTERCEPTOR = '/_capacitor_http_interceptor_';
147-
const CAPACITOR_HTTPS_INTERCEPTOR = '/_capacitor_https_interceptor_';
147+
const CAPACITOR_HTTP_INTERCEPTOR_URL_PARAM = 'u';
148148
// TODO: export as Cap function
149149
const isRelativeOrProxyUrl = (url) => !url ||
150150
!(url.startsWith('http:') || url.startsWith('https:')) ||
151-
url.indexOf(CAPACITOR_HTTP_INTERCEPTOR) > -1 ||
152-
url.indexOf(CAPACITOR_HTTPS_INTERCEPTOR) > -1;
151+
url.indexOf(CAPACITOR_HTTP_INTERCEPTOR) > -1;
153152
// TODO: export as Cap function
154153
const createProxyUrl = (url, win) => {
155154
var _a, _b;
156155
if (isRelativeOrProxyUrl(url))
157156
return url;
158-
const proxyUrl = new URL(url);
159157
const bridgeUrl = new URL((_b = (_a = win.Capacitor) === null || _a === void 0 ? void 0 : _a.getServerUrl()) !== null && _b !== void 0 ? _b : '');
160-
const isHttps = proxyUrl.protocol === 'https:';
161-
bridgeUrl.search = proxyUrl.search;
162-
bridgeUrl.hash = proxyUrl.hash;
163-
bridgeUrl.pathname = `${isHttps ? CAPACITOR_HTTPS_INTERCEPTOR : CAPACITOR_HTTP_INTERCEPTOR}/${encodeURIComponent(proxyUrl.host)}${proxyUrl.pathname}`;
158+
bridgeUrl.pathname = CAPACITOR_HTTP_INTERCEPTOR;
159+
bridgeUrl.searchParams.append(CAPACITOR_HTTP_INTERCEPTOR_URL_PARAM, url);
164160
return bridgeUrl.toString();
165161
};
166162
const initBridge = (w) => {

android/capacitor/src/main/java/com/getcapacitor/Bridge.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,13 @@ public class Bridge {
8989
public static final String CAPACITOR_FILE_START = "/_capacitor_file_";
9090
public static final String CAPACITOR_CONTENT_START = "/_capacitor_content_";
9191
public static final String CAPACITOR_HTTP_INTERCEPTOR_START = "/_capacitor_http_interceptor_";
92+
93+
/** @deprecated CAPACITOR_HTTPS_INTERCEPTOR_START is no longer required. All proxied requests are handled via CAPACITOR_HTTP_INTERCEPTOR_START instead */
94+
@Deprecated
9295
public static final String CAPACITOR_HTTPS_INTERCEPTOR_START = "/_capacitor_https_interceptor_";
9396

97+
public static final String CAPACITOR_HTTP_INTERCEPTOR_URL_PARAM = "u";
98+
9499
public static final int DEFAULT_ANDROID_WEBVIEW_VERSION = 60;
95100
public static final int MINIMUM_ANDROID_WEBVIEW_VERSION = 55;
96101
public static final int DEFAULT_HUAWEI_WEBVIEW_VERSION = 10;

android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import java.net.HttpURLConnection;
3131
import java.net.URL;
3232
import java.net.URLConnection;
33-
import java.net.URLDecoder;
3433
import java.nio.charset.StandardCharsets;
3534
import java.util.ArrayList;
3635
import java.util.HashMap;
@@ -172,13 +171,7 @@ private static Uri parseAndVerifyUrl(String url) {
172171
public WebResourceResponse shouldInterceptRequest(WebResourceRequest request) {
173172
Uri loadingUrl = request.getUrl();
174173

175-
if (
176-
null != loadingUrl.getPath() &&
177-
(
178-
loadingUrl.getPath().startsWith(Bridge.CAPACITOR_HTTP_INTERCEPTOR_START) ||
179-
loadingUrl.getPath().startsWith(Bridge.CAPACITOR_HTTPS_INTERCEPTOR_START)
180-
)
181-
) {
174+
if (null != loadingUrl.getPath() && loadingUrl.getPath().startsWith(Bridge.CAPACITOR_HTTP_INTERCEPTOR_START)) {
182175
Logger.debug("Handling CapacitorHttp request: " + loadingUrl);
183176
try {
184177
return handleCapacitorHttpRequest(request);
@@ -259,16 +252,7 @@ private String getReasonPhraseFromResponseCode(int code) {
259252
}
260253

261254
private WebResourceResponse handleCapacitorHttpRequest(WebResourceRequest request) throws IOException {
262-
boolean isHttps =
263-
request.getUrl().getPath() != null && request.getUrl().getPath().startsWith(Bridge.CAPACITOR_HTTPS_INTERCEPTOR_START);
264-
265-
String urlString = request
266-
.getUrl()
267-
.toString()
268-
.replace(bridge.getLocalUrl(), isHttps ? "https:/" : "http:/")
269-
.replace(Bridge.CAPACITOR_HTTP_INTERCEPTOR_START, "")
270-
.replace(Bridge.CAPACITOR_HTTPS_INTERCEPTOR_START, "");
271-
urlString = URLDecoder.decode(urlString, "UTF-8");
255+
String urlString = request.getUrl().getQueryParameter(Bridge.CAPACITOR_HTTP_INTERCEPTOR_URL_PARAM);
272256
URL url = new URL(urlString);
273257
JSObject headers = new JSObject();
274258

core/native-bridge.ts

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -130,27 +130,21 @@ const convertBody = async (
130130
};
131131

132132
const CAPACITOR_HTTP_INTERCEPTOR = '/_capacitor_http_interceptor_';
133-
const CAPACITOR_HTTPS_INTERCEPTOR = '/_capacitor_https_interceptor_';
133+
const CAPACITOR_HTTP_INTERCEPTOR_URL_PARAM = 'u';
134134

135135
// TODO: export as Cap function
136136
const isRelativeOrProxyUrl = (url: string | undefined): boolean =>
137137
!url ||
138138
!(url.startsWith('http:') || url.startsWith('https:')) ||
139-
url.indexOf(CAPACITOR_HTTP_INTERCEPTOR) > -1 ||
140-
url.indexOf(CAPACITOR_HTTPS_INTERCEPTOR) > -1;
139+
url.indexOf(CAPACITOR_HTTP_INTERCEPTOR) > -1;
141140

142141
// TODO: export as Cap function
143142
const createProxyUrl = (url: string, win: WindowCapacitor): string => {
144143
if (isRelativeOrProxyUrl(url)) return url;
145-
146-
const proxyUrl = new URL(url);
147144
const bridgeUrl = new URL(win.Capacitor?.getServerUrl() ?? '');
148-
const isHttps = proxyUrl.protocol === 'https:';
149-
bridgeUrl.search = proxyUrl.search;
150-
bridgeUrl.hash = proxyUrl.hash;
151-
bridgeUrl.pathname = `${
152-
isHttps ? CAPACITOR_HTTPS_INTERCEPTOR : CAPACITOR_HTTP_INTERCEPTOR
153-
}/${encodeURIComponent(proxyUrl.host)}${proxyUrl.pathname}`;
145+
bridgeUrl.pathname = CAPACITOR_HTTP_INTERCEPTOR;
146+
bridgeUrl.searchParams.append(CAPACITOR_HTTP_INTERCEPTOR_URL_PARAM, url);
147+
154148
return bridgeUrl.toString();
155149
};
156150

ios/Capacitor/Capacitor/CapacitorBridge.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,9 @@ internal class CapacitorBridge: NSObject, CAPBridgeProtocol {
9191
public static let capacitorSite = "https://capacitorjs.com/"
9292
public static let fileStartIdentifier = "/_capacitor_file_"
9393
public static let httpInterceptorStartIdentifier = "/_capacitor_http_interceptor_"
94+
@available(*, deprecated, message: "`httpsInterceptorStartIdentifier` is no longer required. All proxied requests are handled via `httpInterceptorStartIdentifier` instead")
9495
public static let httpsInterceptorStartIdentifier = "/_capacitor_https_interceptor_"
96+
public static let httpInterceptorUrlParam = "u"
9597
public static let defaultScheme = "capacitor"
9698

9799
var webViewAssetHandler: WebViewAssetHandler

ios/Capacitor/Capacitor/WebViewAssetHandler.swift

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,6 @@ internal class WebViewAssetHandler: NSObject, WKURLSchemeHandler {
3535
return
3636
}
3737

38-
if url.path.starts(with: CapacitorBridge.httpsInterceptorStartIdentifier) {
39-
handleCapacitorHttpRequest(urlSchemeTask, localUrl, true)
40-
return
41-
}
42-
4338
if stringToLoad.starts(with: CapacitorBridge.fileStartIdentifier) {
4439
startPath = stringToLoad.replacingOccurrences(of: CapacitorBridge.fileStartIdentifier, with: "")
4540
} else {
@@ -138,21 +133,13 @@ internal class WebViewAssetHandler: NSObject, WKURLSchemeHandler {
138133
func handleCapacitorHttpRequest(_ urlSchemeTask: WKURLSchemeTask, _ localUrl: URL, _ isHttpsRequest: Bool) {
139134
var urlRequest = urlSchemeTask.request
140135
guard let url = urlRequest.url else { return }
141-
var targetUrl = url.absoluteString
142-
.replacingOccurrences(of: CapacitorBridge.httpInterceptorStartIdentifier, with: "")
143-
.replacingOccurrences(of: CapacitorBridge.httpsInterceptorStartIdentifier, with: "")
144-
// Only replace first occurrence of the scheme
145-
if let range = targetUrl.range(of: localUrl.scheme ?? InstanceDescriptorDefaults.scheme) {
146-
targetUrl = targetUrl.replacingCharacters(in: range, with: isHttpsRequest ? "https" : "http")
136+
137+
let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false)
138+
if let targetUrl = urlComponents?.queryItems?.first(where: { $0.name == CapacitorBridge.httpInterceptorUrlParam })?.value,
139+
!targetUrl.isEmpty {
140+
urlRequest.url = URL(string: targetUrl)
147141
}
148142

149-
// Only replace first occurrence of the hostname
150-
if let range = targetUrl.range(of: (localUrl.host ?? InstanceDescriptorDefaults.hostname) + "/") {
151-
targetUrl = targetUrl.replacingCharacters(in: range, with: "")
152-
}
153-
154-
urlRequest.url = URL(string: targetUrl.removingPercentEncoding ?? targetUrl)
155-
156143
let urlSession = URLSession.shared
157144
let task = urlSession.dataTask(with: urlRequest) { (data, response, error) in
158145
DispatchQueue.main.async {

ios/Capacitor/Capacitor/assets/native-bridge.js

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -144,23 +144,19 @@ var nativeBridge = (function (exports) {
144144
return { data: body, type: 'json' };
145145
};
146146
const CAPACITOR_HTTP_INTERCEPTOR = '/_capacitor_http_interceptor_';
147-
const CAPACITOR_HTTPS_INTERCEPTOR = '/_capacitor_https_interceptor_';
147+
const CAPACITOR_HTTP_INTERCEPTOR_URL_PARAM = 'u';
148148
// TODO: export as Cap function
149149
const isRelativeOrProxyUrl = (url) => !url ||
150150
!(url.startsWith('http:') || url.startsWith('https:')) ||
151-
url.indexOf(CAPACITOR_HTTP_INTERCEPTOR) > -1 ||
152-
url.indexOf(CAPACITOR_HTTPS_INTERCEPTOR) > -1;
151+
url.indexOf(CAPACITOR_HTTP_INTERCEPTOR) > -1;
153152
// TODO: export as Cap function
154153
const createProxyUrl = (url, win) => {
155154
var _a, _b;
156155
if (isRelativeOrProxyUrl(url))
157156
return url;
158-
const proxyUrl = new URL(url);
159157
const bridgeUrl = new URL((_b = (_a = win.Capacitor) === null || _a === void 0 ? void 0 : _a.getServerUrl()) !== null && _b !== void 0 ? _b : '');
160-
const isHttps = proxyUrl.protocol === 'https:';
161-
bridgeUrl.search = proxyUrl.search;
162-
bridgeUrl.hash = proxyUrl.hash;
163-
bridgeUrl.pathname = `${isHttps ? CAPACITOR_HTTPS_INTERCEPTOR : CAPACITOR_HTTP_INTERCEPTOR}/${encodeURIComponent(proxyUrl.host)}${proxyUrl.pathname}`;
158+
bridgeUrl.pathname = CAPACITOR_HTTP_INTERCEPTOR;
159+
bridgeUrl.searchParams.append(CAPACITOR_HTTP_INTERCEPTOR_URL_PARAM, url);
164160
return bridgeUrl.toString();
165161
};
166162
const initBridge = (w) => {

0 commit comments

Comments
 (0)