Skip to content

Commit bde55d3

Browse files
authored
[Android] Change default okHttpInstrumentation to PROXY (instead of OVERWRITE) (#891)
1 parent def8d40 commit bde55d3

File tree

8 files changed

+91
-14
lines changed

8 files changed

+91
-14
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
**Changed**
2727

2828
- Bump `androidx.metrics:metrics-performance` dep to 1.0.0
29+
- io.bitdrift.capture-plugin: `automaticOkHttpInstrumentation` now defaults to `PROXY` mode instead of `OVERWRITE`, preserving any custom `EventListener.Factory` on the `OkHttpClient`.
2930

3031
**Fixed**
3132

platform/jvm/capture-plugin/src/main/kotlin/io/bitdrift/capture/extension/InstrumentationExtension.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ open class InstrumentationExtension
4747
objects
4848
.property(
4949
OkHttpInstrumentationType::class.java,
50-
).convention(OkHttpInstrumentationType.OVERWRITE)
50+
).convention(OkHttpInstrumentationType.PROXY)
5151

5252
enum class OkHttpInstrumentationType {
5353
PROXY,

platform/jvm/gradle-test-app/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ plugins {
33
alias(libs.plugins.apollo.graphql)
44
alias(libs.plugins.kotlin.android)
55
alias(libs.plugins.compose.compiler)
6+
// TODO(Fran): BIT-7448. Update to 0.22.8 once release is completed
67
id("io.bitdrift.capture-plugin") version "0.22.7"
78
}
89

@@ -172,5 +173,6 @@ bitdrift {
172173
instrumentation {
173174
automaticOkHttpInstrumentation = true
174175
automaticWebViewInstrumentation = true
176+
// Comment out to change the default type. e.g. okHttpInstrumentationType = OVERWRITE
175177
}
176178
}

platform/jvm/gradle-test-app/src/main/java/io/bitdrift/gradletestapp/data/model/Actions.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ sealed class DiagnosticsAction : AppAction {
5151
}
5252

5353
sealed class NetworkTestAction : AppAction {
54-
object PerformOkHttpRequest : NetworkTestAction()
54+
object PerformOkHttpRequestManual : NetworkTestAction()
55+
56+
object PerformOkHttpRequestAutomatic : NetworkTestAction()
5557

5658
object PerformGraphQlRequest : NetworkTestAction()
5759

platform/jvm/gradle-test-app/src/main/java/io/bitdrift/gradletestapp/data/repository/NetworkTestingRepository.kt

Lines changed: 58 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,23 +23,28 @@ import kotlinx.coroutines.MainScope
2323
import kotlinx.coroutines.launch
2424
import okhttp3.Call
2525
import okhttp3.Callback
26+
import okhttp3.Connection
27+
import okhttp3.EventListener
2628
import okhttp3.HttpUrl
2729
import okhttp3.OkHttpClient
30+
import okhttp3.Protocol
2831
import okhttp3.Request
2932
import okhttp3.RequestBody.Companion.toRequestBody
3033
import okhttp3.Response
3134
import retrofit2.Retrofit
3235
import retrofit2.converter.gson.GsonConverterFactory
3336
import timber.log.Timber
3437
import java.io.IOException
38+
import java.net.InetSocketAddress
39+
import java.net.Proxy
3540
import kotlin.random.Random
3641

3742
/**
3843
* Performs OkHttp/GraphQL requests
3944
*/
4045
class NetworkTestingRepository {
41-
// Initialize network clients
42-
private val okHttpClient: OkHttpClient =
46+
// Manual integration: explicit CaptureOkHttpEventListenerFactory with custom field providers
47+
private val okHttpClientManual: OkHttpClient =
4348
OkHttpClient
4449
.Builder()
4550
.eventListenerFactory(
@@ -48,16 +53,24 @@ class NetworkTestingRepository {
4853
responseFieldProvider = CustomResponseFieldProvider(),
4954
),
5055
).build()
56+
57+
// Automatic integration: relies on Gradle plugin instrumentation (tests PROXY vs OVERWRITE)
58+
private val okHttpClientAutomatic: OkHttpClient =
59+
OkHttpClient
60+
.Builder()
61+
.eventListenerFactory { TimberOkHttpEventListener() }
62+
.build()
63+
5164
private val apolloClient: ApolloClient =
5265
ApolloClient
5366
.Builder()
5467
.serverUrl("https://apollo-fullstack-tutorial.herokuapp.com/graphql")
55-
.okHttpClient(okHttpClient)
68+
.okHttpClient(okHttpClientManual)
5669
.addInterceptor(CaptureApolloInterceptor())
5770
.build()
5871
private val retrofitService = Retrofit.Builder()
5972
.baseUrl("https://binaryjazz.us")
60-
.client(okHttpClient)
73+
.client(okHttpClientManual)
6174
.addConverterFactory(GsonConverterFactory.create())
6275
.build()
6376
.create(BinaryJazzRetrofitService::class.java)
@@ -104,8 +117,16 @@ class NetworkTestingRepository {
104117
}
105118

106119
fun performOkHttpRequest() {
120+
performOkHttpRequestWithClient(okHttpClientManual, "Manual")
121+
}
122+
123+
fun performOkHttpRequestAutomatic() {
124+
performOkHttpRequestWithClient(okHttpClientAutomatic, "Automatic")
125+
}
126+
127+
private fun performOkHttpRequestWithClient(okHttpClient: OkHttpClient, label: String) {
107128
val requestDef = requestDefinitions.random()
108-
Timber.i("Performing OkHttp Network Request: $requestDef")
129+
Timber.i("Performing OkHttp Network Request ($label): $requestDef")
109130

110131
val url =
111132
HttpUrl
@@ -136,14 +157,14 @@ class NetworkTestingRepository {
136157
response.use {
137158
it.body!!.string()
138159
}
139-
Timber.v("OkHttp request completed with status code=${response.code} and body=$body")
160+
Timber.v("OkHttp request ($label) completed with status code=${response.code} and body=$body")
140161
}
141162

142163
override fun onFailure(
143164
call: Call,
144165
e: IOException,
145166
) {
146-
Timber.v("OkHttp request failed with exception=$e")
167+
Timber.v("OkHttp request ($label) failed with exception=$e")
147168
}
148169
},
149170
)
@@ -177,6 +198,36 @@ class NetworkTestingRepository {
177198
}
178199
}
179200

201+
/**
202+
* Logs OkHttp events via Timber. Used with auto-instrumentation to test PROXY vs OVERWRITE.
203+
*/
204+
private class TimberOkHttpEventListener : EventListener() {
205+
override fun callStart(call: Call) {
206+
Timber.d("[TimberOkHttpEventListener] callStart: ${call.request().url}")
207+
}
208+
209+
override fun callEnd(call: Call) {
210+
Timber.d("[TimberOkHttpEventListener] callEnd: ${call.request().url}")
211+
}
212+
213+
override fun connectStart(call: Call, inetSocketAddress: InetSocketAddress, proxy: Proxy) {
214+
Timber.d("[TimberOkHttpEventListener] connectStart")
215+
}
216+
217+
override fun connectEnd(
218+
call: Call,
219+
inetSocketAddress: InetSocketAddress,
220+
proxy: Proxy,
221+
protocol: Protocol?
222+
) {
223+
Timber.d("[TimberOkHttpEventListener] connectEnd")
224+
}
225+
226+
override fun connectionAcquired(call: Call, connection: Connection) {
227+
Timber.d("[TimberOkHttpEventListener] connectionAcquired")
228+
}
229+
}
230+
180231
private class CustomRequestFieldProvider : OkHttpRequestFieldProvider {
181232
override fun provideExtraFields(request: Request): Map<String, String> =
182233
mapOf("additional_network_request_host_field" to request.url.host)

platform/jvm/gradle-test-app/src/main/java/io/bitdrift/gradletestapp/ui/compose/MainScreen.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,8 @@ private fun SdkApisTabContent(
317317
}
318318
item {
319319
NetworkTestingCard(
320-
onOkHttpRequest = { onAction(NetworkTestAction.PerformOkHttpRequest) },
320+
onOkHttpManualRequest = { onAction(NetworkTestAction.PerformOkHttpRequestManual) },
321+
onOkHttpAutoRequest = { onAction(NetworkTestAction.PerformOkHttpRequestAutomatic) },
321322
onGraphQlRequest = { onAction(NetworkTestAction.PerformGraphQlRequest) },
322323
onRetrofitRequest = { onAction(NetworkTestAction.PerformRetrofitRequest) },
323324
)

platform/jvm/gradle-test-app/src/main/java/io/bitdrift/gradletestapp/ui/compose/components/NetworkTestingCard.kt

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ import io.bitdrift.gradletestapp.ui.theme.BitdriftColors
2020
*/
2121
@Composable
2222
fun NetworkTestingCard(
23-
onOkHttpRequest: () -> Unit,
23+
onOkHttpManualRequest: () -> Unit,
24+
onOkHttpAutoRequest: () -> Unit,
2425
onGraphQlRequest: () -> Unit,
2526
onRetrofitRequest: () -> Unit,
2627
modifier: Modifier = Modifier,
@@ -54,16 +55,32 @@ fun NetworkTestingCard(
5455
horizontalArrangement = Arrangement.spacedBy(8.dp),
5556
) {
5657
OutlinedButton(
57-
onClick = onOkHttpRequest,
58+
onClick = onOkHttpManualRequest,
5859
modifier = Modifier.weight(1f),
5960
colors =
6061
ButtonDefaults.outlinedButtonColors(
6162
contentColor = BitdriftColors.TextPrimary,
6263
),
6364
) {
64-
Text("OkHttp", maxLines = 1, softWrap = false)
65+
Text("OkHttp (Manual)", maxLines = 1, softWrap = false)
6566
}
6667

68+
OutlinedButton(
69+
onClick = onOkHttpAutoRequest,
70+
modifier = Modifier.weight(1f),
71+
colors =
72+
ButtonDefaults.outlinedButtonColors(
73+
contentColor = BitdriftColors.TextPrimary,
74+
),
75+
) {
76+
Text("OkHttp (Auto)", maxLines = 1, softWrap = false)
77+
}
78+
}
79+
80+
Row(
81+
modifier = Modifier.fillMaxWidth(),
82+
horizontalArrangement = Arrangement.spacedBy(8.dp),
83+
) {
6784
OutlinedButton(
6885
onClick = onGraphQlRequest,
6986
modifier = Modifier.weight(1f),

platform/jvm/gradle-test-app/src/main/java/io/bitdrift/gradletestapp/ui/viewmodel/MainViewModel.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,12 @@ class MainViewModel(
113113
is DiagnosticsAction.ForceAppExit -> forceAppExit()
114114
is DiagnosticsAction.UpdateAppExitReason -> updateAppExitReason(action.reason)
115115

116-
is NetworkTestAction.PerformOkHttpRequest -> {
116+
is NetworkTestAction.PerformOkHttpRequestManual -> {
117117
networkTestingRepository.performOkHttpRequest()
118118
}
119+
is NetworkTestAction.PerformOkHttpRequestAutomatic -> {
120+
networkTestingRepository.performOkHttpRequestAutomatic()
121+
}
119122
is NetworkTestAction.PerformGraphQlRequest -> {
120123
networkTestingRepository.performGraphQlRequest()
121124
}

0 commit comments

Comments
 (0)