Skip to content

Commit

Permalink
[go] backport expo#23405 to sdk 49
Browse files Browse the repository at this point in the history
  • Loading branch information
Kudo committed Jul 10, 2023
1 parent 93bd91a commit 256a950
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 69 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -54,14 +54,13 @@ object ExpoRequestCdpInterceptor : ExpoNetworkInspectOkHttpInterceptorsDelegate
val params = ResponseReceivedParams(now, requestId, request, response)
dispatchEvent(Event("Network.responseReceived", params))

val params2 = LoadingFinishedParams(now, requestId, request, response)
dispatchEvent(Event("Network.loadingFinished", params2))

val contentLength = response.body?.contentLength() ?: 0
if (contentLength >= 0 && contentLength <= ExpoNetworkInspectOkHttpNetworkInterceptor.MAX_BODY_SIZE) {
val params3 = ExpoReceivedResponseBodyParams(now, requestId, request, response)
dispatchEvent(Event("Expo(Network.receivedResponseBody)", params3))
if (response.peekBody(ExpoNetworkInspectOkHttpNetworkInterceptor.MAX_BODY_SIZE + 1).contentLength() <= ExpoNetworkInspectOkHttpNetworkInterceptor.MAX_BODY_SIZE) {
val params2 = ExpoReceivedResponseBodyParams(now, requestId, request, response)
dispatchEvent(Event("Expo(Network.receivedResponseBody)", params2))
}

val params3 = LoadingFinishedParams(now, requestId, request, response)
dispatchEvent(Event("Network.loadingFinished", params3))
}

//endregion ExpoNetworkInspectOkHttpInterceptorsDelegate implementations
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -205,10 +205,10 @@ data class LoadingFinishedParams(
val timestamp: MonotonicTime,
val encodedDataLength: Long,
) : JsonSerializable {
constructor(now: BigDecimal, requestId: RequestId, request: okhttp3.Request, repsonse: okhttp3.Response) : this(
constructor(now: BigDecimal, requestId: RequestId, request: okhttp3.Request, response: okhttp3.Response) : this(
requestId = requestId,
timestamp = now,
encodedDataLength = repsonse.body?.contentLength() ?: 0,
encodedDataLength = response.body?.contentLength() ?: 0,
)

override fun toJSONObject(): JSONObject {
Expand All @@ -230,8 +230,6 @@ data class ExpoReceivedResponseBodyParams(
body = "",
base64Encoded = false,
) {
val contentLength = response.body?.contentLength() ?: 0
check(contentLength >= 0 && contentLength <= ExpoNetworkInspectOkHttpNetworkInterceptor.MAX_BODY_SIZE)
val rawBody = response.peekBody(ExpoNetworkInspectOkHttpNetworkInterceptor.MAX_BODY_SIZE)
val contentType = rawBody.contentType()
val isText = contentType?.type == "text" || (contentType?.type == "application" && contentType.subtype == "json")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ struct CdpNetwork {
let mimeType: String
let encodedDataLength: Int64

init(_ response: HTTPURLResponse) {
init(_ response: HTTPURLResponse, encodedDataLength: Int64) {
self.url = response.url?.absoluteString ?? ""
self.status = response.statusCode
self.statusText = ""
Expand All @@ -73,7 +73,7 @@ struct CdpNetwork {
}
self.headers = headers
self.mimeType = response.value(forHTTPHeaderField: "Content-Type") ?? ""
self.encodedDataLength = response.expectedContentLength
self.encodedDataLength = encodedDataLength
}
}

Expand All @@ -94,13 +94,13 @@ struct CdpNetwork {
var referrerPolicy = "no-referrer"
let type: ResourceType

init(now: TimeInterval, requestId: RequestId, request: URLRequest, redirectResponse: HTTPURLResponse?) {
init(now: TimeInterval, requestId: RequestId, request: URLRequest, encodedDataLength: Int64, redirectResponse: HTTPURLResponse?) {
self.requestId = requestId
self.request = Request(request)
self.timestamp = now
self.wallTime = now
if let redirectResponse = redirectResponse {
self.redirectResponse = Response(redirectResponse)
self.redirectResponse = Response(redirectResponse, encodedDataLength: encodedDataLength)
} else {
self.redirectResponse = nil
}
Expand Down Expand Up @@ -129,10 +129,10 @@ struct CdpNetwork {
let response: Response
var hasExtraInfo = false

init(now: TimeInterval, requestId: RequestId, request: URLRequest, response: HTTPURLResponse) {
init(now: TimeInterval, requestId: RequestId, request: URLRequest, response: HTTPURLResponse, encodedDataLength: Int64) {
self.requestId = requestId
self.timestamp = now
self.response = Response(response)
self.response = Response(response, encodedDataLength: encodedDataLength)
self.type = ResourceType.fromMimeType(self.response.mimeType)
}
}
Expand All @@ -142,10 +142,10 @@ struct CdpNetwork {
let timestamp: MonotonicTime
let encodedDataLength: Int64

init(now: TimeInterval, requestId: RequestId, request: URLRequest, response: HTTPURLResponse) {
init(now: TimeInterval, requestId: RequestId, encodedDataLength: Int64) {
self.requestId = requestId
self.timestamp = now
self.encodedDataLength = response.expectedContentLength
self.encodedDataLength = encodedDataLength
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,30 +34,42 @@ public final class ExpoRequestCdpInterceptor: NSObject, ExpoRequestInterceptorPr

// MARK: ExpoRequestInterceptorProtocolDelegate implementations

func willSendRequest(requestId: String, request: URLRequest, redirectResponse: HTTPURLResponse?) {
func willSendRequest(requestId: String, task: URLSessionTask, request: URLRequest, redirectResponse: HTTPURLResponse?) {
let now = Date().timeIntervalSince1970

let params = CdpNetwork.RequestWillBeSentParams(now: now, requestId: requestId, request: request, redirectResponse: redirectResponse)
let params = CdpNetwork.RequestWillBeSentParams(
now: now,
requestId: requestId,
request: request,
encodedDataLength: task.countOfBytesReceived,
redirectResponse: redirectResponse)
dispatchEvent(CdpNetwork.Event(method: "Network.requestWillBeSent", params: params))

let params2 = CdpNetwork.RequestWillBeSentExtraInfoParams(now: now, requestId: requestId, request: request)
dispatchEvent(CdpNetwork.Event(method: "Network.requestWillBeSentExtraInfo", params: params2))
}

func didReceiveResponse(requestId: String, request: URLRequest, response: HTTPURLResponse) {
func didReceiveResponse(requestId: String, task: URLSessionTask, responseBody: Data, isText: Bool, responseBodyExceedsLimit: Bool) {
guard let request = task.currentRequest, let response = task.response as? HTTPURLResponse else {
return
}
let now = Date().timeIntervalSince1970

let params = CdpNetwork.ResponseReceivedParams(now: now, requestId: requestId, request: request, response: response)
let params = CdpNetwork.ResponseReceivedParams(
now: now,
requestId: requestId,
request: request,
response: response,
encodedDataLength: task.countOfBytesReceived)
dispatchEvent(CdpNetwork.Event(method: "Network.responseReceived", params: params))

let params2 = CdpNetwork.LoadingFinishedParams(now: now, requestId: requestId, request: request, response: response)
dispatchEvent(CdpNetwork.Event(method: "Network.loadingFinished", params: params2))
}
if !responseBodyExceedsLimit {
let params2 = CdpNetwork.ExpoReceivedResponseBodyParams(now: now, requestId: requestId, responseBody: responseBody, isText: isText)
dispatchEvent(CdpNetwork.Event(method: "Expo(Network.receivedResponseBody)", params: params2))
}

func didReceiveResponseBody(requestId: String, responseBody: Data, isText: Bool) {
let now = Date().timeIntervalSince1970
let params = CdpNetwork.ExpoReceivedResponseBodyParams(now: now, requestId: requestId, responseBody: responseBody, isText: isText)
dispatchEvent(CdpNetwork.Event(method: "Expo(Network.receivedResponseBody)", params: params))
let params3 = CdpNetwork.LoadingFinishedParams(now: now, requestId: requestId, encodedDataLength: task.countOfBytesReceived)
dispatchEvent(CdpNetwork.Event(method: "Network.loadingFinished", params: params3))
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@ public final class ExpoRequestInterceptorProtocol: URLProtocol, URLSessionDataDe
)
private var dataTask_: URLSessionDataTask?
private let responseBody = NSMutableData()
private var responseIsText = false
private var responseContentLength: Int64 = 0
private var responseBodyExceedsLimit = false

static let MAX_BODY_SIZE = 1_048_576

Expand Down Expand Up @@ -55,12 +54,14 @@ public final class ExpoRequestInterceptorProtocol: URLProtocol, URLSessionDataDe
forKey: Self.REQUEST_ID,
in: mutableRequest
)
let dataTask = urlSession.dataTask(with: mutableRequest as URLRequest)
Self.delegate.willSendRequest(
requestId: requestId,
task: dataTask,
request: mutableRequest as URLRequest,
redirectResponse: nil
)
dataTask_ = urlSession.dataTask(with: mutableRequest as URLRequest)
dataTask_ = dataTask
}

public override class func canonicalRequest(for request: URLRequest) -> URLRequest {
Expand All @@ -81,62 +82,41 @@ public final class ExpoRequestInterceptorProtocol: URLProtocol, URLSessionDataDe
client?.urlProtocol(self, didLoad: data)
if responseBody.length + data.count <= Self.MAX_BODY_SIZE {
responseBody.append(data)
} else {
responseBodyExceedsLimit = true
}
}

public func urlSession(
_: URLSession,
dataTask: URLSessionDataTask,
didReceive response: URLResponse,
completionHandler: @escaping (URLSession.ResponseDisposition) -> Void
) {
if let resp = response as? HTTPURLResponse,
let currentRequest = dataTask.currentRequest,
let requestId = URLProtocol.property(
forKey: Self.REQUEST_ID,
in: currentRequest
) as? String {
Self.delegate.didReceiveResponse(
requestId: requestId,
request: currentRequest,
response: resp
)

let contentType = resp.value(forHTTPHeaderField: "Content-Type")
responseIsText = (contentType?.starts(with: "text/") ?? false) || contentType == "application/json"
responseContentLength = resp.expectedContentLength
}
completionHandler(.allow)
client?.urlProtocol(self, didReceive: response, cacheStoragePolicy: .allowed)
}

public func urlSession(_: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
if let error = error {
client?.urlProtocol(self, didFailWithError: error)
} else {
if responseContentLength > 0 && responseContentLength <= Self.MAX_BODY_SIZE,
let currentRequest = task.currentRequest,
if let currentRequest = task.currentRequest,
let response = task.response as? HTTPURLResponse,
let requestId = URLProtocol.property(
forKey: Self.REQUEST_ID,
in: currentRequest
) as? String {
Self.delegate.didReceiveResponseBody(
requestId: requestId, responseBody: responseBody as Data, isText: responseIsText)
let contentType = response.value(forHTTPHeaderField: "Content-Type")
let isText = (contentType?.starts(with: "text/") ?? false) || contentType == "application/json"
Self.delegate.didReceiveResponse(
requestId: requestId, task: task, responseBody: responseBody as Data, isText: isText, responseBodyExceedsLimit: responseBodyExceedsLimit)
}
client?.urlProtocolDidFinishLoading(self)
}
}

public func urlSession(
_: URLSession,
task _: URLSessionTask,
task: URLSessionTask,
willPerformHTTPRedirection response: HTTPURLResponse,
newRequest request: URLRequest,
completionHandler: @escaping (URLRequest?) -> Void
) {
if let requestId = URLProtocol.property(forKey: Self.REQUEST_ID, in: request) as? String {
Self.delegate.willSendRequest(
requestId: requestId,
task: task,
request: request,
redirectResponse: response
)
Expand Down Expand Up @@ -173,11 +153,8 @@ public final class ExpoRequestInterceptorProtocol: URLProtocol, URLSessionDataDe
@objc(ABI49_0_0EXRequestInterceptorProtocolDelegate)
protocol ExpoRequestInterceptorProtocolDelegate {
@objc
func willSendRequest(requestId: String, request: URLRequest, redirectResponse: HTTPURLResponse?)

@objc
func didReceiveResponse(requestId: String, request: URLRequest, response: HTTPURLResponse)
func willSendRequest(requestId: String, task: URLSessionTask, request: URLRequest, redirectResponse: HTTPURLResponse?)

@objc
func didReceiveResponseBody(requestId: String, responseBody: Data, isText: Bool)
func didReceiveResponse(requestId: String, task: URLSessionTask, responseBody: Data, isText: Bool, responseBodyExceedsLimit: Bool)
}

0 comments on commit 256a950

Please sign in to comment.