Skip to content

Commit 1e7f10e

Browse files
committed
Add request to HttpResponseInfo.kt
1 parent 261867c commit 1e7f10e

11 files changed

Lines changed: 64 additions & 18 deletions

File tree

dd-sdk-android-core/api/apiSurface

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ interface com.datadog.android.api.instrumentation.network.HttpResponseInfo
177177
val headers: Map<String, List<String>>
178178
val contentType: String?
179179
val contentLength: Long?
180+
val request: HttpRequestInfo
180181
interface com.datadog.android.api.instrumentation.network.MutableHttpRequestInfo
181182
fun newBuilder(): HttpRequestInfoBuilder
182183
data class com.datadog.android.api.net.Request

dd-sdk-android-core/api/dd-sdk-android-core.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,7 @@ public abstract interface class com/datadog/android/api/instrumentation/network/
499499
public abstract fun getContentLength ()Ljava/lang/Long;
500500
public abstract fun getContentType ()Ljava/lang/String;
501501
public abstract fun getHeaders ()Ljava/util/Map;
502+
public abstract fun getRequest ()Lcom/datadog/android/api/instrumentation/network/HttpRequestInfo;
502503
public abstract fun getStatusCode ()I
503504
public abstract fun getUrl ()Ljava/lang/String;
504505
}

dd-sdk-android-core/src/main/kotlin/com/datadog/android/api/instrumentation/network/HttpResponseInfo.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,9 @@ interface HttpResponseInfo {
3838
*/
3939
@get:WorkerThread
4040
val contentLength: Long?
41+
42+
/**
43+
* Represents the HTTP request associated with the response.
44+
*/
45+
val request: HttpRequestInfo
4146
}

integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetHttpResponseInfo.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
*/
66
package com.datadog.android.cronet.internal
77

8+
import com.datadog.android.api.instrumentation.network.HttpRequestInfo
89
import com.datadog.android.api.instrumentation.network.HttpResponseInfo
910
import com.datadog.android.internal.network.HttpSpec
1011
import org.chromium.net.UrlResponseInfo
1112

1213
internal data class CronetHttpResponseInfo(
13-
private val response: UrlResponseInfo
14+
private val response: UrlResponseInfo,
15+
override val request: HttpRequestInfo
1416
) : HttpResponseInfo {
1517

1618
override val url: String get() = response.url
@@ -35,7 +37,7 @@ internal data class CronetHttpResponseInfo(
3537
get() {
3638
/*
3739
* Content-Length is expected to be declared once or in case of multiple repetitions should have same value.
38-
* Otherwise it's assumed that Content-Length is invalid
40+
* Otherwise, it's assumed that Content-Length is invalid
3941
* according to https://www.rfc-editor.org/rfc/rfc9110.pdf, page 63:
4042
*
4143
* Likewise, a sender forward a message with a Content-Length header field value that does not match the ABNF

integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetRequestCallback.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,13 @@ internal class CronetRequestCallback(
102102
) = delegate.onReadCompleted(request, info, byteBuffer)
103103

104104
private fun finishSuccessRequestTracing(response: UrlResponseInfo?) {
105-
val responseInfo = response?.let { CronetHttpResponseInfo(it) }
105+
val requestInfo = apmTracingStateHolder.get()?.createRequestInfo()
106+
?: distributedTracingStateHolder.get()?.createRequestInfo()
107+
val responseInfo = if (response != null && requestInfo != null) {
108+
CronetHttpResponseInfo(response, requestInfo)
109+
} else {
110+
null
111+
}
106112

107113
apmTracingStateHolder.getAndSet(null)?.let { apmTracingState ->
108114
if (responseInfo != null) {

integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetRequestFinishedInfoListener.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ internal class CronetRequestFinishedInfoListener(
5353
}
5454

5555
RequestFinishedInfo.SUCCEEDED -> {
56-
val responseInfo = finishedInfo.responseInfo?.let { CronetHttpResponseInfo(it) }
56+
val responseInfo = finishedInfo.responseInfo?.let { CronetHttpResponseInfo(it, requestInfo) }
5757

5858
if (responseInfo == null) {
5959
rumNetworkInstrumentation.stopResourceWithError(

integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetRequestCallbackTest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,7 @@ internal class CronetRequestCallbackTest {
388388
// Given
389389
val mockDistributedTracingState: RequestTracingState = mock()
390390
whenever(mockDistributedTracingInstrumentation.onRequest(fakeRequestInfo)) doReturn mockDistributedTracingState
391+
whenever(mockDistributedTracingState.createRequestInfo()) doReturn mockMutableRequestInfo
391392
testedCallback.onRequestStarted(fakeRequestInfo)
392393

393394
// When
@@ -476,6 +477,7 @@ internal class CronetRequestCallbackTest {
476477
// Given
477478
val mockDistributedTracingState: RequestTracingState = mock()
478479
whenever(mockDistributedTracingInstrumentation.onRequest(fakeRequestInfo)) doReturn mockDistributedTracingState
480+
whenever(mockDistributedTracingState.createRequestInfo()) doReturn mockMutableRequestInfo
479481
testedCallback.onRequestStarted(fakeRequestInfo)
480482

481483
// When

integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetRequestFinishedInfoListenerTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ internal class CronetRequestFinishedInfoListenerTest {
136136
// Then
137137
verify(mockRumNetworkInstrumentation).stopResource(
138138
requestInfo = fakeRequestInfo,
139-
responseInfo = CronetHttpResponseInfo(mockResponseInfo)
139+
responseInfo = CronetHttpResponseInfo(mockResponseInfo, fakeRequestInfo)
140140
)
141141
}
142142

integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetResponseInfoTest.kt

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
package com.datadog.android.cronet.internal
88

9-
import com.datadog.android.api.InternalLogger
9+
import com.datadog.android.api.instrumentation.network.HttpRequestInfo
1010
import com.datadog.android.internal.network.HttpSpec
1111
import com.datadog.android.utils.forge.Configurator
1212
import com.datadog.tools.unit.forge.exhaustiveAttributes
@@ -40,7 +40,7 @@ internal class CronetResponseInfoTest {
4040
lateinit var mockUrlResponseInfo: UrlResponseInfo
4141

4242
@Mock
43-
lateinit var mockInternalLogger: InternalLogger
43+
lateinit var mockRequestInfo: HttpRequestInfo
4444

4545
lateinit var fakeHeaders: Map<String, List<String>>
4646

@@ -55,7 +55,7 @@ internal class CronetResponseInfoTest {
5555
) {
5656
// Given
5757
whenever(mockUrlResponseInfo.url).thenReturn(fakeUrl)
58-
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo)
58+
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo)
5959

6060
// When
6161
val result = responseInfo.url
@@ -70,7 +70,7 @@ internal class CronetResponseInfoTest {
7070
) {
7171
// Given
7272
whenever(mockUrlResponseInfo.httpStatusCode).thenReturn(fakeStatusCode)
73-
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo)
73+
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo)
7474

7575
// When
7676
val result = responseInfo.statusCode
@@ -84,7 +84,7 @@ internal class CronetResponseInfoTest {
8484
// Given
8585

8686
whenever(mockUrlResponseInfo.allHeaders).thenReturn(fakeHeaders)
87-
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo)
87+
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo)
8888

8989
// When
9090
val result = responseInfo.headers
@@ -100,7 +100,7 @@ internal class CronetResponseInfoTest {
100100
// Given
101101
val fakeHeaders = fakeHeaders + mapOf(HttpSpec.Header.CONTENT_TYPE to listOf(fakeContentType))
102102
whenever(mockUrlResponseInfo.allHeaders).thenReturn(fakeHeaders)
103-
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo)
103+
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo)
104104

105105
// When
106106
val result = responseInfo.contentType
@@ -113,7 +113,7 @@ internal class CronetResponseInfoTest {
113113
fun `M return null W contentType property { no content type header }`() {
114114
// Given
115115
whenever(mockUrlResponseInfo.allHeaders).thenReturn(emptyMap())
116-
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo)
116+
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo)
117117

118118
// When
119119
val result = responseInfo.contentType
@@ -122,14 +122,26 @@ internal class CronetResponseInfoTest {
122122
assertThat(result).isNull()
123123
}
124124

125+
@Test
126+
fun `M return request W request property`() {
127+
// Given
128+
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo)
129+
130+
// When
131+
val result = responseInfo.request
132+
133+
// Then
134+
assertThat(result).isSameAs(mockRequestInfo)
135+
}
136+
125137
@Test
126138
fun `M return content length from header W computeContentLength() { header present }`(
127139
@LongForgery(min = 1) fakeContentLength: Long
128140
) {
129141
// Given
130142
val fakeHeaders = fakeHeaders + mapOf(HttpSpec.Header.CONTENT_LENGTH to listOf(fakeContentLength.toString()))
131143
whenever(mockUrlResponseInfo.allHeaders).thenReturn(fakeHeaders)
132-
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo)
144+
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo)
133145

134146
// When
135147
val result = responseInfo.contentLength
@@ -145,7 +157,7 @@ internal class CronetResponseInfoTest {
145157
// Given
146158
whenever(mockUrlResponseInfo.allHeaders).thenReturn(emptyMap())
147159
whenever(mockUrlResponseInfo.receivedByteCount).thenReturn(fakeByteCount)
148-
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo)
160+
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo)
149161

150162
// When
151163
val result = responseInfo.contentLength
@@ -159,7 +171,7 @@ internal class CronetResponseInfoTest {
159171
// Given
160172
whenever(mockUrlResponseInfo.allHeaders).thenReturn(emptyMap())
161173
whenever(mockUrlResponseInfo.receivedByteCount).thenReturn(0L)
162-
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo)
174+
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo)
163175

164176
// When
165177
val result = responseInfo.contentLength
@@ -173,7 +185,7 @@ internal class CronetResponseInfoTest {
173185
// Given
174186
whenever(mockUrlResponseInfo.allHeaders).thenReturn(emptyMap())
175187
whenever(mockUrlResponseInfo.receivedByteCount).thenReturn(-1L)
176-
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo)
188+
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo)
177189

178190
// When
179191
val result = responseInfo.contentLength
@@ -192,7 +204,7 @@ internal class CronetResponseInfoTest {
192204
)
193205
whenever(mockUrlResponseInfo.allHeaders).thenReturn(fakeHeaders)
194206
whenever(mockUrlResponseInfo.receivedByteCount).thenReturn(100L)
195-
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo)
207+
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo)
196208

197209
// When
198210
val result = responseInfo.contentLength
@@ -210,7 +222,7 @@ internal class CronetResponseInfoTest {
210222
val fakeHeaders = fakeHeaders + mapOf(HttpSpec.Header.CONTENT_LENGTH to listOf(fakeHeaderLength.toString()))
211223
whenever(mockUrlResponseInfo.allHeaders).thenReturn(fakeHeaders)
212224
whenever(mockUrlResponseInfo.receivedByteCount).thenReturn(fakeByteCount)
213-
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo)
225+
val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo)
214226

215227
// When
216228
val result = responseInfo.contentLength

integrations/dd-sdk-android-okhttp/src/main/kotlin/com/datadog/android/okhttp/internal/OkHttpResponseInfo.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package com.datadog.android.okhttp.internal
77

88
import androidx.annotation.WorkerThread
99
import com.datadog.android.api.InternalLogger
10+
import com.datadog.android.api.instrumentation.network.HttpRequestInfo
1011
import com.datadog.android.api.instrumentation.network.HttpResponseInfo
1112
import okhttp3.Response
1213
import okhttp3.ResponseBody
@@ -65,6 +66,8 @@ internal class OkHttpResponseInfo(
6566
null
6667
}
6768

69+
override val request: HttpRequestInfo get() = OkHttpRequestInfo(originalResponse.request)
70+
6871
internal companion object {
6972

7073
// We need to limit this value as the body will be loaded in memory

0 commit comments

Comments
 (0)