Skip to content
This repository was archived by the owner on Apr 20, 2024. It is now read-only.

Commit 5ea741d

Browse files
Merge pull request #54 from nodes-vapor/feature/improve-manual-reporting
Allow for easier manual reporting
2 parents b6ed121 + dcd2ecf commit 5ea741d

File tree

5 files changed

+52
-31
lines changed

5 files changed

+52
-31
lines changed

Sources/Bugsnag/Bugsnag.swift

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ struct BugsnagEvent: Encodable {
2323
let exceptions: [BugsnagException]
2424
let metaData: BugsnagMetaData
2525
let payloadVersion: String
26-
let request: BugsnagRequest
26+
let request: BugsnagRequest?
2727
let severity: String
2828
let unhandled = true
2929
let user: BugsnagUser?
@@ -32,7 +32,8 @@ struct BugsnagEvent: Encodable {
3232
app: BugsnagApp,
3333
breadcrumbs: [BugsnagBreadcrumb],
3434
error: Error,
35-
httpRequest: HTTPRequest,
35+
httpRequest: HTTPRequest? = nil,
36+
keyFilters: [String],
3637
metadata: [String: CustomDebugStringConvertible],
3738
payloadVersion: String,
3839
severity: Severity,
@@ -49,7 +50,7 @@ struct BugsnagEvent: Encodable {
4950
].merging(metadata.mapValues { $0.debugDescription }) { a, b in b }
5051
)
5152
self.payloadVersion = payloadVersion
52-
self.request = BugsnagRequest(httpRequest: httpRequest)
53+
self.request = httpRequest.map { BugsnagRequest(httpRequest: $0, keyFilters: keyFilters) }
5354
self.severity = severity.value
5455
self.user = userId.map { BugsnagUser(id: $0.description) }
5556
}
@@ -85,14 +86,28 @@ struct BugsnagRequest: Encodable {
8586
let referer: String
8687
let url: String
8788

88-
init(httpRequest: HTTPRequest) {
89-
self.body = httpRequest.body.data.flatMap { String(data: $0, encoding: .utf8) }
89+
init(httpRequest: HTTPRequest, keyFilters: [String]) {
90+
self.body = BugsnagRequest.filter(httpRequest.body, using: keyFilters)
9091
self.clientIp = httpRequest.remotePeer.hostname
9192
self.headers = Dictionary(httpRequest.headers.map { $0 }) { first, second in second }
9293
self.httpMethod = httpRequest.method.string
9394
self.referer = httpRequest.remotePeer.description
9495
self.url = httpRequest.urlString
9596
}
97+
98+
static private func filter(_ body: HTTPBody, using filters: [String]) -> String? {
99+
guard
100+
let data = body.data,
101+
let unwrap = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
102+
let jsonObject = unwrap
103+
else {
104+
return body.data.flatMap { String(data: $0, encoding: .utf8) }
105+
}
106+
107+
let filtered = jsonObject.filter { !filters.contains($0.key) }
108+
let json = try? JSONSerialization.data(withJSONObject: filtered, options: [.prettyPrinted])
109+
return json.flatMap { String(data: $0, encoding: .utf8) }
110+
}
96111
}
97112

98113
struct BugsnagThread: Encodable {

Sources/Bugsnag/BugsnagConfig.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
public struct BugsnagConfig {
22
let apiKey: String
33
let releaseStage: String
4+
let keyFilters: [String]
45
let shouldReport: Bool
56
let debug: Bool
67

78
public init(
89
apiKey: String,
910
releaseStage: String,
11+
keyFilters: [String] = [],
1012
shouldReport: Bool = true,
1113
debug: Bool = false
1214
) {
1315
self.apiKey = apiKey
1416
self.releaseStage = releaseStage
17+
self.keyFilters = keyFilters
1518
self.shouldReport = shouldReport
1619
self.debug = debug
1720
}

Sources/Bugsnag/BugsnagReporter.swift

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,17 @@ public struct BugsnagReporter: Service {
1313
version: "3"
1414
)
1515
private let payloadVersion = "4"
16-
private let sendReport: (String, HTTPHeaders, Data, Request) -> Future<HTTPResponse>
16+
private let sendReport: (String, HTTPHeaders, Data, Container) -> Future<HTTPResponse>
1717

1818
public init(
1919
config: BugsnagConfig,
20-
sendReport: ((String, HTTPHeaders, Data, Request) -> Future<HTTPResponse>)? = nil
20+
sendReport: ((String, HTTPHeaders, Data, Container) -> Future<HTTPResponse>)? = nil
2121
) {
2222
self.config = config
2323

24-
self.sendReport = sendReport ?? { (hostName, headers, body, req) in
24+
self.sendReport = sendReport ?? { (hostName, headers, body, container) in
2525
HTTPClient
26-
.connect(hostname: hostName, on: req)
26+
.connect(hostname: hostName, on: container)
2727
.flatMap(to: HTTPResponse.self) { client in
2828
client.send(.init(method: .POST, headers: headers, body: body))
2929
}
@@ -42,22 +42,25 @@ public struct BugsnagReporter: Service {
4242

4343
extension BugsnagReporter: ErrorReporter {
4444
private func buildBody(
45-
_ req: Request,
45+
_ container: Container,
4646
error: Error,
4747
severity: Severity,
4848
userId: CustomStringConvertible?,
4949
metadata: [String: CustomDebugStringConvertible],
5050
stacktrace: BugsnagStacktrace
5151
) throws -> Data {
52-
let breadcrumbs: [BugsnagBreadcrumb] = (try? req.privateContainer
52+
let req = container as? Request
53+
let breadcrumbsContainer = req?.privateContainer ?? container
54+
let breadcrumbs: [BugsnagBreadcrumb] = (try? breadcrumbsContainer
5355
.make(BreadcrumbContainer.self))?
5456
.breadcrumbs ?? []
5557

5658
let event = BugsnagEvent(
5759
app: app,
5860
breadcrumbs: breadcrumbs,
5961
error: error,
60-
httpRequest: req.http,
62+
httpRequest: req?.http,
63+
keyFilters: config.keyFilters,
6164
metadata: metadata,
6265
payloadVersion: payloadVersion,
6366
severity: severity,
@@ -77,22 +80,22 @@ extension BugsnagReporter: ErrorReporter {
7780
@discardableResult
7881
public func report(
7982
_ error: Error,
80-
severity: Severity,
81-
userId: CustomStringConvertible?,
82-
metadata: [String: CustomDebugStringConvertible],
83+
severity: Severity = .error,
84+
userId: CustomStringConvertible? = nil,
85+
metadata: [String: CustomDebugStringConvertible] = [:],
8386
file: String = #file,
8487
function: String = #function,
8588
line: Int = #line,
8689
column: Int = #column,
87-
on req: Request
90+
on container: Container
8891
) -> Future<Void> {
8992
guard config.shouldReport else {
90-
return req.future()
93+
return container.future()
9194
}
9295

93-
return Future.flatMap(on: req) {
96+
return Future.flatMap(on: container) {
9497
let body = try self.buildBody(
95-
req,
98+
container,
9699
error: error,
97100
severity: severity,
98101
userId: userId,
@@ -106,7 +109,7 @@ extension BugsnagReporter: ErrorReporter {
106109
)
107110

108111
return self
109-
.sendReport(self.hostName, self.headers, body, req)
112+
.sendReport(self.hostName, self.headers, body, container)
110113
.do { response in
111114
if self.config.debug {
112115
print("Bugsnag response:")

Sources/Bugsnag/ErrorReporter.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public protocol ErrorReporter {
1010
function: String,
1111
line: Int,
1212
column: Int,
13-
on req: Request
13+
on container: Container
1414
) -> Future<Void>
1515
}
1616

@@ -20,7 +20,7 @@ extension ErrorReporter {
2020
severity: Severity = .error,
2121
userId: CustomStringConvertible? = nil,
2222
metadata: [String: CustomDebugStringConvertible] = [:],
23-
on req: Request,
23+
on container: Container,
2424
file: String = #file,
2525
function: String = #function,
2626
line: Int = #line,
@@ -35,7 +35,7 @@ extension ErrorReporter {
3535
function: function,
3636
line: line,
3737
column: column,
38-
on: req
38+
on: container
3939
)
4040
}
4141

Tests/BugsnagTests/BugsnagTests.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ private class TestErrorReporter: ErrorReporter {
3333
function: String,
3434
line: Int,
3535
column: Int,
36-
req: Request
36+
container: Container
3737
)?
3838
func report(
3939
_ error: Error,
@@ -44,7 +44,7 @@ private class TestErrorReporter: ErrorReporter {
4444
function: String,
4545
line: Int,
4646
column: Int,
47-
on req: Request
47+
on container: Container
4848
) -> Future<Void> {
4949
capturedReportParameters = (
5050
error,
@@ -55,9 +55,9 @@ private class TestErrorReporter: ErrorReporter {
5555
function,
5656
line,
5757
column,
58-
req
58+
container
5959
)
60-
return req.future()
60+
return container.future()
6161
}
6262
}
6363

@@ -108,14 +108,14 @@ final class BugsnagTests: XCTestCase {
108108
host: String,
109109
headers: HTTPHeaders,
110110
body: Data,
111-
request: Request
111+
container: Container
112112
)?
113113

114114
let reporter = BugsnagReporter(
115115
config: .init(apiKey: "apiKey", releaseStage: "test"),
116-
sendReport: { host, headers, data, request in
117-
capturedSendReportParameters = (host, headers, data, request)
118-
return request.future(HTTPResponse(status: .ok))
116+
sendReport: { host, headers, data, container in
117+
capturedSendReportParameters = (host, headers, data, container)
118+
return container.future(HTTPResponse(status: .ok))
119119
})
120120
let application = try Application.test()
121121
let request = Request(using: application)

0 commit comments

Comments
 (0)