Skip to content

Commit 5f57b05

Browse files
committed
feat(network-details): Add response details capture
1 parent 7328b7f commit 5f57b05

1 file changed

Lines changed: 53 additions & 5 deletions

File tree

Sources/Sentry/SentryNetworkTracker.m

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -598,10 +598,59 @@ - (void)captureResponseDetails:(NSData *)data
598598
request:(NSURLRequest *)request
599599
task:(NSURLSessionTask *)task
600600
{
601-
// TODO: Implementation
602-
// 2. Create SentryNetworkBody from response data
603-
// 3. Store in appropriate location for session replay
604-
// 4. Handle size limits and truncation if needed
601+
NSString *url = request.URL ? request.URL.absoluteString : @"<no URL>";
602+
if (![self isNetworkDetailCaptureEnabledFor:url options:SentrySDK.startOption]) {
603+
return;
604+
}
605+
606+
SentryOptions *options = SentrySDK.startOption;
607+
if (![self isNetworkDetailCaptureEnabledFor:url options:options]) {
608+
return;
609+
}
610+
611+
SentryNetworkRequestData *requestData
612+
= objc_getAssociatedObject(task, &SentryNetworkRequestDataKey);
613+
if (!requestData) {
614+
SENTRY_LOG_DEBUG(@"[NetworkCapture] No SentryNetworkRequestData found for %@ - "
615+
@"skipping response capture",
616+
url);
617+
return;
618+
}
619+
620+
// Create response SentryReplayNetworkRequestOrResponse with headers and body
621+
NSDictionary *responseHeaders = nil;
622+
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
623+
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
624+
responseHeaders = [SentryReplayNetworkRequestOrResponse
625+
extractHeaders:httpResponse.allHeaderFields
626+
configuredHeaders:options.sessionReplay.networkResponseHeaders];
627+
}
628+
629+
SentryNetworkBody *responseBody = nil;
630+
if (data && data.length > 0) {
631+
NSString *contentType = nil;
632+
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
633+
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
634+
contentType = httpResponse.allHeaderFields[@"Content-Type"];
635+
}
636+
responseBody = [[SentryNetworkBody alloc] initWithData:data contentType:contentType];
637+
}
638+
639+
NSUInteger dataLength = data ? data.length : 0;
640+
SentryReplayNetworkRequestOrResponse *responseData =
641+
[[SentryReplayNetworkRequestOrResponse alloc]
642+
initWithSize:@(dataLength)
643+
body:responseBody
644+
allHeaders:([response isKindOfClass:[NSHTTPURLResponse class]]
645+
? ((NSHTTPURLResponse *)response).allHeaderFields
646+
: nil)configuredHeaders
647+
:options.sessionReplay.networkResponseHeaders];
648+
649+
NSInteger statusCode = 0;
650+
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
651+
statusCode = ((NSHTTPURLResponse *)response).statusCode;
652+
}
653+
[requestData setResponseDetails:statusCode responseData:responseData];
605654
}
606655

607656
- (void)captureRequestDetails:(NSURLSessionTask *)sessionTask
@@ -620,7 +669,6 @@ - (void)captureRequestDetails:(NSURLSessionTask *)sessionTask
620669
}
621670

622671
NSURLRequest *request = sessionTask.currentRequest;
623-
NSString *url = request.URL ? request.URL.absoluteString : nil;
624672

625673
SentryNetworkRequestData *requestData =
626674
[[SentryNetworkRequestData alloc] initWithMethod:request.HTTPMethod ?: @"GET"];

0 commit comments

Comments
 (0)