From 31aa963bc0f3883d40c242d4b614e32a6e97c798 Mon Sep 17 00:00:00 2001 From: Luis Rhenals Date: Fri, 14 Jul 2023 15:13:52 -0500 Subject: [PATCH] (android, ios, web) add the ability to configure proxying http calls --- .../joinflux/flux/segment/SegmentPlugin.java | 21 ++++++++++++++++++- ios/Plugin/Segment.swift | 13 ++++++++++++ ios/Plugin/SegmentPlugin.swift | 3 ++- src/definitions.ts | 1 + src/web.ts | 5 +++-- 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/android/src/main/java/com/joinflux/flux/segment/SegmentPlugin.java b/android/src/main/java/com/joinflux/flux/segment/SegmentPlugin.java index 1f5dc9c..ec7a37e 100644 --- a/android/src/main/java/com/joinflux/flux/segment/SegmentPlugin.java +++ b/android/src/main/java/com/joinflux/flux/segment/SegmentPlugin.java @@ -32,7 +32,26 @@ public void initialize(PluginCall call) { } Context context = this.getContext(); - Builder builder = new Analytics.Builder(context, key); + + Builder builder; + String proxyHost = call.getString("proxyHost"); + + if (proxyHost == null) { + builder = new Analytics.Builder(context, key); + } else { + builder = + new Analytics.Builder(context, key) + .connectionFactory( + new ConnectionFactory() { + @Override + protected HttpURLConnection openConnection(String url) throws IOException { + String path = Uri.parse(url).getPath(); + return super.openConnection(proxyHost + path); + } + } + ); + } + boolean trackLifecycle = Boolean.TRUE.equals(call.getBoolean("trackLifecycle", false)); if (trackLifecycle) { builder.trackApplicationLifecycleEvents().experimentalUseNewLifecycleMethods(false); diff --git a/ios/Plugin/Segment.swift b/ios/Plugin/Segment.swift index 2db562c..1a26e9e 100644 --- a/ios/Plugin/Segment.swift +++ b/ios/Plugin/Segment.swift @@ -5,6 +5,19 @@ import Segment @objc public func initialize(key: String, trackLifecycle: Bool) { let config = AnalyticsConfiguration.init(writeKey: key) config.trackApplicationLifecycleEvents = trackLifecycle; + + if(!proxyHost.isEmpty) { + config.requestFactory = { (url: URL) -> NSMutableURLRequest in + var result = NSMutableURLRequest(url: url) + if var components = URLComponents(url: url, resolvingAgainstBaseURL: false) { + components.host = proxyHost + if let transformedURL = components.url { + result = NSMutableURLRequest(url: transformedURL) + } + } + return result + } + } Analytics.setup(with: config) print("CapacitorSegment: initialized") diff --git a/ios/Plugin/SegmentPlugin.swift b/ios/Plugin/SegmentPlugin.swift index 3f67312..d2596dd 100644 --- a/ios/Plugin/SegmentPlugin.swift +++ b/ios/Plugin/SegmentPlugin.swift @@ -20,7 +20,8 @@ public class SegmentPlugin: CAPPlugin { return } let trackLifecycle = call.getBool("trackLifecycle", false) - implementation.initialize(key: key, trackLifecycle: trackLifecycle) + let proxyHost = call.getString("proxyHost", "") + implementation.initialize(key: key, trackLifecycle: trackLifecycle, proxyHost: proxyHost) initialized = true call.resolve() } diff --git a/src/definitions.ts b/src/definitions.ts index 5091a80..5bd9acb 100644 --- a/src/definitions.ts +++ b/src/definitions.ts @@ -10,6 +10,7 @@ export type InitializeOptions = { key: string; trackLifecycle?: boolean; recordScreenViews?: boolean; + proxyHost?: string; }; export type Identity = { userId: string }; diff --git a/src/web.ts b/src/web.ts index f47c792..093117b 100644 --- a/src/web.ts +++ b/src/web.ts @@ -10,7 +10,8 @@ import type { const getSegmentScript = ( key: string, -) => `!function(){var analytics=window.analytics=window.analytics||[];if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error("Segment snippet included twice.");else{analytics.invoked=!0;analytics.methods=["trackSubmit","trackClick","trackLink","trackForm","pageview","identify","reset","group","track","ready","alias","debug","page","once","off","on","addSourceMiddleware","addIntegrationMiddleware","setAnonymousId","addDestinationMiddleware"];analytics.factory=function(e){return function(){var t=Array.prototype.slice.call(arguments);t.unshift(e);analytics.push(t);return analytics}};for(var e=0;e `!function(){var analytics=window.analytics=window.analytics||[];if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error("Segment snippet included twice.");else{analytics.invoked=!0;analytics.methods=["trackSubmit","trackClick","trackLink","trackForm","pageview","identify","reset","group","track","ready","alias","debug","page","once","off","on","addSourceMiddleware","addIntegrationMiddleware","setAnonymousId","addDestinationMiddleware"];analytics.factory=function(e){return function(){var t=Array.prototype.slice.call(arguments);t.unshift(e);analytics.push(t);return analytics}};for(var e=0;e { - await this.loadScript('segment', getSegmentScript(options.key)); + await this.loadScript('segment', getSegmentScript(options.key, options.proxyHost)); } async identify(options: IdentifyOptions): Promise {