Skip to content

Commit 97078c3

Browse files
Add Request to the Scope. (#1270)
1 parent bdf6d51 commit 97078c3

File tree

8 files changed

+186
-4
lines changed

8 files changed

+186
-4
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
* Fix: Make the ANR Atomic flags immutable
1414
* Enchancement: Integration interface better compatibility with Kotlin null-safety
1515
* Enchancement: Simplify Sentry configuration in Spring integration (#1259)
16+
* Enchancement: Add Request to the Scope. #1270
1617
* Fix: Fix SentryTransaction#getStatus NPE (#1273)
1718
* Enchancement: Optimize SentryTracingFilter when hub is disabled.
1819
* Fix: SentryTransaction#finish should not clear another transaction from the scope (#1278)

sentry/api/sentry.api

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,7 @@ public final class io/sentry/Scope : java/lang/Cloneable {
436436
public synthetic fun clone ()Ljava/lang/Object;
437437
public fun getContexts ()Lio/sentry/protocol/Contexts;
438438
public fun getLevel ()Lio/sentry/SentryLevel;
439+
public fun getRequest ()Lio/sentry/protocol/Request;
439440
public fun getSpan ()Lio/sentry/ISpan;
440441
public fun getTransaction ()Lio/sentry/ITransaction;
441442
public fun getTransactionName ()Ljava/lang/String;
@@ -450,6 +451,7 @@ public final class io/sentry/Scope : java/lang/Cloneable {
450451
public fun setExtra (Ljava/lang/String;Ljava/lang/String;)V
451452
public fun setFingerprint (Ljava/util/List;)V
452453
public fun setLevel (Lio/sentry/SentryLevel;)V
454+
public fun setRequest (Lio/sentry/protocol/Request;)V
453455
public fun setTag (Ljava/lang/String;Ljava/lang/String;)V
454456
public fun setTransaction (Lio/sentry/ITransaction;)V
455457
public fun setTransaction (Ljava/lang/String;)V
@@ -1465,9 +1467,11 @@ public final class io/sentry/protocol/OperatingSystem : io/sentry/IUnknownProper
14651467
public fun setVersion (Ljava/lang/String;)V
14661468
}
14671469

1468-
public final class io/sentry/protocol/Request : io/sentry/IUnknownPropertiesConsumer {
1470+
public final class io/sentry/protocol/Request : io/sentry/IUnknownPropertiesConsumer, java/lang/Cloneable {
14691471
public fun <init> ()V
14701472
public fun acceptUnknownProperties (Ljava/util/Map;)V
1473+
public fun clone ()Lio/sentry/protocol/Request;
1474+
public synthetic fun clone ()Ljava/lang/Object;
14711475
public fun getCookies ()Ljava/lang/String;
14721476
public fun getData ()Ljava/lang/Object;
14731477
public fun getEnvs ()Ljava/util/Map;

sentry/src/main/java/io/sentry/Scope.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.sentry;
22

33
import io.sentry.protocol.Contexts;
4+
import io.sentry.protocol.Request;
45
import io.sentry.protocol.User;
56
import io.sentry.util.Objects;
67
import java.util.ArrayList;
@@ -29,6 +30,9 @@ public final class Scope implements Cloneable {
2930
/** Scope's user */
3031
private @Nullable User user;
3132

33+
/** Scope's request */
34+
private @Nullable Request request;
35+
3236
/** Scope's fingerprint */
3337
private @NotNull List<String> fingerprint = new ArrayList<>();
3438

@@ -163,6 +167,24 @@ public void setUser(final @Nullable User user) {
163167
}
164168
}
165169

170+
/**
171+
* Returns the Scope's request
172+
*
173+
* @return the request
174+
*/
175+
public @Nullable Request getRequest() {
176+
return request;
177+
}
178+
179+
/**
180+
* Sets the Scope's request
181+
*
182+
* @param request the request
183+
*/
184+
public void setRequest(final @Nullable Request request) {
185+
this.request = request;
186+
}
187+
166188
/**
167189
* Returns the Scope's fingerprint list
168190
*
@@ -287,6 +309,7 @@ public void clear() {
287309
level = null;
288310
transaction = null;
289311
user = null;
312+
request = null;
290313
fingerprint.clear();
291314
breadcrumbs.clear();
292315
tags.clear();
@@ -489,6 +512,9 @@ public void addAttachment(final @NotNull Attachment attachment) {
489512
final User userRef = user;
490513
clone.user = userRef != null ? userRef.clone() : null;
491514

515+
final Request requestRef = request;
516+
clone.request = requestRef != null ? requestRef.clone() : null;
517+
492518
clone.fingerprint = new ArrayList<>(fingerprint);
493519
clone.eventProcessors = new CopyOnWriteArrayList<>(eventProcessors);
494520

sentry/src/main/java/io/sentry/SentryClient.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,9 @@ public void captureSession(final @NotNull Session session, final @Nullable Objec
421421
if (event.getUser() == null) {
422422
event.setUser(scope.getUser());
423423
}
424+
if (event.getRequest() == null) {
425+
event.setRequest(scope.getRequest());
426+
}
424427
if (event.getFingerprints() == null) {
425428
event.setFingerprints(scope.getFingerprint());
426429
}

sentry/src/main/java/io/sentry/protocol/Request.java

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package io.sentry.protocol;
22

33
import io.sentry.IUnknownPropertiesConsumer;
4+
import io.sentry.util.CollectionUtils;
45
import java.util.Map;
56
import org.jetbrains.annotations.ApiStatus;
7+
import org.jetbrains.annotations.NotNull;
8+
import org.jetbrains.annotations.Nullable;
9+
import org.jetbrains.annotations.TestOnly;
610

711
/**
812
* Http request information.
@@ -40,7 +44,7 @@
4044
* csrftoken=u32t4o3tb3gg43; _gat=1;", "headers": { "content-type": "text/html" }, "env": {
4145
* "REMOTE_ADDR": "192.168.0.1" } } } ```
4246
*/
43-
public final class Request implements IUnknownPropertiesConsumer {
47+
public final class Request implements Cloneable, IUnknownPropertiesConsumer {
4448
/**
4549
* The URL of the request if available.
4650
*
@@ -159,9 +163,38 @@ public void setOthers(Map<String, String> other) {
159163
this.other = other;
160164
}
161165

166+
/**
167+
* the Request's unknown fields
168+
*
169+
* @return the unknown map
170+
*/
171+
@TestOnly
172+
@Nullable
173+
Map<String, Object> getUnknown() {
174+
return unknown;
175+
}
176+
162177
@ApiStatus.Internal
163178
@Override
164179
public void acceptUnknownProperties(Map<String, Object> unknown) {
165180
this.unknown = unknown;
166181
}
182+
183+
/**
184+
* Clones an User aka deep copy
185+
*
186+
* @return the cloned User
187+
* @throws CloneNotSupportedException if the User is not cloneable
188+
*/
189+
@Override
190+
public @NotNull Request clone() throws CloneNotSupportedException {
191+
final Request clone = (Request) super.clone();
192+
193+
clone.headers = CollectionUtils.shallowCopy(headers);
194+
clone.env = CollectionUtils.shallowCopy(env);
195+
clone.other = CollectionUtils.shallowCopy(other);
196+
clone.unknown = CollectionUtils.shallowCopy(unknown);
197+
198+
return clone;
199+
}
167200
}

sentry/src/test/java/io/sentry/ScopeTest.kt

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.nhaarman.mockitokotlin2.eq
55
import com.nhaarman.mockitokotlin2.mock
66
import com.nhaarman.mockitokotlin2.never
77
import com.nhaarman.mockitokotlin2.verify
8+
import io.sentry.protocol.Request
89
import io.sentry.protocol.User
910
import io.sentry.test.callMethod
1011
import java.util.concurrent.CopyOnWriteArrayList
@@ -33,6 +34,18 @@ class ScopeTest {
3334

3435
scope.user = user
3536

37+
val request = Request()
38+
request.method = "post"
39+
request.cookies = "cookies"
40+
request.data = "cookies"
41+
request.envs = mapOf("env" to "value")
42+
request.headers = mapOf("header" to "value")
43+
request.others = mapOf("other" to "value")
44+
request.queryString = "?foo=bar"
45+
request.url = "http://localhost:8080/url"
46+
47+
scope.request = request
48+
3649
val fingerprints = mutableListOf("abc", "def")
3750
scope.fingerprint = fingerprints
3851

@@ -56,6 +69,7 @@ class ScopeTest {
5669
assertNotNull(clone)
5770
assertNotSame(scope, clone)
5871
assertNotSame(scope.user, clone.user)
72+
assertNotSame(scope.request, clone.request)
5973
assertNotSame(scope.contexts, clone.contexts)
6074
assertNotSame(scope.fingerprint, clone.fingerprint)
6175
assertNotSame(scope.breadcrumbs, clone.breadcrumbs)
@@ -73,9 +87,12 @@ class ScopeTest {
7387

7488
val user = User()
7589
user.id = "123"
76-
7790
scope.user = user
7891

92+
val request = Request()
93+
request.method = "get"
94+
scope.request = request
95+
7996
val fingerprints = mutableListOf("abc")
8097
scope.fingerprint = fingerprints
8198

@@ -98,6 +115,8 @@ class ScopeTest {
98115

99116
assertEquals("123", clone.user?.id)
100117

118+
assertEquals("get", clone.request?.method)
119+
101120
assertEquals("abc", clone.fingerprint.first())
102121

103122
assertEquals("message", clone.breadcrumbs.first().message)
@@ -123,9 +142,12 @@ class ScopeTest {
123142

124143
val user = User()
125144
user.id = "123"
126-
127145
scope.user = user
128146

147+
val request = Request()
148+
request.method = "get"
149+
scope.request = request
150+
129151
val fingerprints = mutableListOf("abc")
130152
scope.fingerprint = fingerprints
131153

@@ -146,6 +168,7 @@ class ScopeTest {
146168

147169
scope.level = SentryLevel.FATAL
148170
user.id = "456"
171+
request.method = "post"
149172

150173
scope.setTransaction(SentryTransaction("newTransaction", "op"))
151174

@@ -166,6 +189,8 @@ class ScopeTest {
166189

167190
assertEquals("123", clone.user?.id)
168191

192+
assertEquals("get", clone.request?.method)
193+
169194
assertEquals("abc", clone.fingerprint.first())
170195
assertEquals(1, clone.fingerprint.size)
171196

@@ -191,6 +216,7 @@ class ScopeTest {
191216
scope.level = SentryLevel.WARNING
192217
scope.setTransaction(SentryTransaction("", "op"))
193218
scope.user = User()
219+
scope.request = Request()
194220
scope.fingerprint = mutableListOf("finger")
195221
scope.addBreadcrumb(Breadcrumb())
196222
scope.setTag("some", "tag")
@@ -202,6 +228,8 @@ class ScopeTest {
202228

203229
assertNull(scope.level)
204230
assertNull(scope.transaction)
231+
assertNull(scope.user)
232+
assertNull(scope.request)
205233
assertEquals(0, scope.fingerprint.size)
206234
assertEquals(0, scope.breadcrumbs.size)
207235
assertEquals(0, scope.tags.size)

sentry/src/test/java/io/sentry/SentryClientTest.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,9 @@ class SentryClientTest {
262262
assertEquals("fp", event.fingerprints[0])
263263
assertEquals("id", event.user.id)
264264
assertEquals(SentryLevel.FATAL, event.level)
265+
assertNotNull(event.request) {
266+
assertEquals("post", it.method)
267+
}
265268
}
266269

267270
@Test
@@ -855,6 +858,9 @@ class SentryClientTest {
855858
user = User().apply {
856859
id = "id"
857860
}
861+
request = Request().apply {
862+
method = "post"
863+
}
858864
}
859865
}
860866

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package io.sentry.protocol
2+
3+
import kotlin.test.Test
4+
import kotlin.test.assertEquals
5+
import kotlin.test.assertNotNull
6+
import kotlin.test.assertNotSame
7+
import kotlin.test.assertNull
8+
9+
class RequestTest {
10+
@Test
11+
fun `cloning request wont have the same references`() {
12+
val request = createRequest()
13+
val clone = request.clone()
14+
15+
assertNotNull(clone)
16+
assertNotSame(request, clone)
17+
18+
assertNotSame(request.others, clone.others)
19+
20+
assertNotSame(request.unknown, clone.unknown)
21+
}
22+
23+
@Test
24+
fun `cloning request will have the same values`() {
25+
val request = createRequest()
26+
val clone = request.clone()
27+
28+
assertEquals("get", clone.method)
29+
assertEquals("http://localhost:8080", clone.url)
30+
assertEquals("?foo=bar", clone.queryString)
31+
assertEquals("envs", clone.envs!!["envs"])
32+
assertEquals("others", clone.others!!["others"])
33+
assertEquals("unknown", clone.unknown!!["unknown"])
34+
}
35+
36+
@Test
37+
fun `cloning request and changing the original values wont change the clone values`() {
38+
val request = createRequest()
39+
val clone = request.clone()
40+
41+
request.method = "post"
42+
request.url = "http://another-host:8081/"
43+
request.queryString = "?xxx=yyy"
44+
request.envs!!["envs"] = "newEnvs"
45+
request.others!!["others"] = "newOthers"
46+
request.others!!["anotherOne"] = "anotherOne"
47+
val newUnknown = mapOf(Pair("unknown", "newUnknown"), Pair("otherUnknown", "otherUnknown"))
48+
request.acceptUnknownProperties(newUnknown)
49+
50+
assertEquals("get", clone.method)
51+
assertEquals("http://localhost:8080", clone.url)
52+
assertEquals("?foo=bar", clone.queryString)
53+
assertEquals("envs", clone.envs!!["envs"])
54+
assertEquals(1, clone.envs!!.size)
55+
assertEquals("others", clone.others!!["others"])
56+
assertEquals(1, clone.others!!.size)
57+
assertEquals("unknown", clone.unknown!!["unknown"])
58+
assertEquals(1, clone.unknown!!.size)
59+
}
60+
61+
@Test
62+
fun `setting null others do not crash`() {
63+
val request = createRequest()
64+
request.others = null
65+
66+
assertNull(request.others)
67+
}
68+
69+
private fun createRequest(): Request {
70+
return Request().apply {
71+
method = "get"
72+
url = "http://localhost:8080"
73+
queryString = "?foo=bar"
74+
envs = mutableMapOf(Pair("envs", "envs"))
75+
val others = mutableMapOf(Pair("others", "others"))
76+
setOthers(others)
77+
val unknown = mapOf(Pair("unknown", "unknown"))
78+
acceptUnknownProperties(unknown)
79+
}
80+
}
81+
}

0 commit comments

Comments
 (0)