Skip to content

Commit

Permalink
Fix leaks
Browse files Browse the repository at this point in the history
  • Loading branch information
guoye-zhang committed Nov 4, 2024
1 parent da8a204 commit c3884fb
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 5 deletions.
5 changes: 5 additions & 0 deletions Sources/NIOResumableUpload/HTTPResumableUpload.swift
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ extension HTTPResumableUpload {
if close {
uploadHandler.close(mode: .all, promise: nil)
}
uploadHandler.detach()

if self.uploadChannel != nil {
self.idleTimer?.cancel()
Expand Down Expand Up @@ -469,6 +470,10 @@ extension HTTPResumableUpload {
precondition(mode != .input)
self.destroyChannel(error: nil)
self.uploadHandler?.close(mode: mode, promise: promise)
self.uploadHandler?.detach()
self.uploadHandler = nil
self.idleTimer?.cancel()
self.idleTimer = nil
}
}

Expand Down
16 changes: 11 additions & 5 deletions Sources/NIOResumableUpload/HTTPResumableUploadHandler.swift
Original file line number Diff line number Diff line change
Expand Up @@ -66,13 +66,13 @@ public final class HTTPResumableUploadHandler: ChannelDuplexHandler {
}
}

private func resetUpload() {
private func resetUpload(context: ChannelHandlerContext) {
if let existingUpload = self.upload {
existingUpload.end(handler: self, error: nil)
}
let upload = self.createUpload()
upload.scheduleOnEventLoop(self.eventLoop)
upload.attachUploadHandler(self, channel: self.context.channel)
upload.attachUploadHandler(self, channel: context.channel)
self.upload = upload
self.shouldReset = false
}
Expand All @@ -81,7 +81,7 @@ public final class HTTPResumableUploadHandler: ChannelDuplexHandler {
self.context = context
self.eventLoop = context.eventLoop

self.resetUpload()
self.resetUpload(context: context)
}

public func channelActive(context: ChannelHandlerContext) {
Expand All @@ -94,13 +94,13 @@ public final class HTTPResumableUploadHandler: ChannelDuplexHandler {

public func channelRead(context: ChannelHandlerContext, data: NIOAny) {
if self.shouldReset {
self.resetUpload()
self.resetUpload(context: context)
}
let part = self.unwrapInboundIn(data)
if case .end = part {
self.shouldReset = true
}
self.upload?.receive(handler: self, channel: self.context.channel, part: part)
self.upload?.receive(handler: self, channel: context.channel, part: part)
}

public func channelReadComplete(context: ChannelHandlerContext) {
Expand Down Expand Up @@ -163,4 +163,10 @@ extension HTTPResumableUploadHandler {
self.context.close(mode: mode, promise: promise)
}
}

func detach() {
self.runInEventLoop {
self.context = nil
}
}
}

0 comments on commit c3884fb

Please sign in to comment.