CARVIEW |
Select Language
HTTP/2 200
date: Wed, 23 Jul 2025 23:28:45 GMT
content-type: text/html; charset=utf-8
cache-control: max-age=0, private, must-revalidate
content-security-policy: default-src 'none'; base-uri 'self'; child-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/; connect-src 'self' uploads.github.com www.githubstatus.com collector.github.com raw.githubusercontent.com api.github.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com *.rel.tunnels.api.visualstudio.com wss://*.rel.tunnels.api.visualstudio.com objects-origin.githubusercontent.com copilot-proxy.githubusercontent.com proxy.individual.githubcopilot.com proxy.business.githubcopilot.com proxy.enterprise.githubcopilot.com *.actions.githubusercontent.com wss://*.actions.githubusercontent.com productionresultssa0.blob.core.windows.net/ productionresultssa1.blob.core.windows.net/ productionresultssa2.blob.core.windows.net/ productionresultssa3.blob.core.windows.net/ productionresultssa4.blob.core.windows.net/ productionresultssa5.blob.core.windows.net/ productionresultssa6.blob.core.windows.net/ productionresultssa7.blob.core.windows.net/ productionresultssa8.blob.core.windows.net/ productionresultssa9.blob.core.windows.net/ productionresultssa10.blob.core.windows.net/ productionresultssa11.blob.core.windows.net/ productionresultssa12.blob.core.windows.net/ productionresultssa13.blob.core.windows.net/ productionresultssa14.blob.core.windows.net/ productionresultssa15.blob.core.windows.net/ productionresultssa16.blob.core.windows.net/ productionresultssa17.blob.core.windows.net/ productionresultssa18.blob.core.windows.net/ productionresultssa19.blob.core.windows.net/ github-production-repository-image-32fea6.s3.amazonaws.com github-production-release-asset-2e65be.s3.amazonaws.com insights.github.com wss://alive.github.com api.githubcopilot.com api.individual.githubcopilot.com api.business.githubcopilot.com api.enterprise.githubcopilot.com; font-src github.githubassets.com; form-action 'self' github.com gist.github.com copilot-workspace.githubnext.com objects-origin.githubusercontent.com; frame-ancestors 'none'; frame-src viewscreen.githubusercontent.com notebooks.githubusercontent.com; img-src 'self' data: blob: github.githubassets.com media.githubusercontent.com camo.githubusercontent.com identicons.github.com avatars.githubusercontent.com private-avatars.githubusercontent.com github-cloud.s3.amazonaws.com objects.githubusercontent.com release-assets.githubusercontent.com secured-user-images.githubusercontent.com/ user-images.githubusercontent.com/ private-user-images.githubusercontent.com opengraph.githubassets.com copilotprodattachments.blob.core.windows.net/github-production-copilot-attachments/ github-production-user-asset-6210df.s3.amazonaws.com customer-stories-feed.github.com spotlights-feed.github.com objects-origin.githubusercontent.com *.githubusercontent.com; manifest-src 'self'; media-src github.com user-images.githubusercontent.com/ secured-user-images.githubusercontent.com/ private-user-images.githubusercontent.com github-production-user-asset-6210df.s3.amazonaws.com gist.github.com; script-src github.githubassets.com; style-src 'unsafe-inline' github.githubassets.com; upgrade-insecure-requests; worker-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/
link: ; rel=preload; as=fetch; crossorigin=use-credentials
referrer-policy: no-referrer-when-downgrade
server-timing: issue_layout-fragment;desc="issue_layout fragment";dur=517.507149,issue_conversation_content-fragment;desc="issue_conversation_content fragment";dur=801.235796,issue_conversation_sidebar-fragment;desc="issue_conversation_sidebar fragment";dur=61.42851,nginx;desc="NGINX";dur=0.732947,glb;desc="GLB";dur=102.175983
strict-transport-security: max-age=31536000; includeSubdomains; preload
vary: X-PJAX, X-PJAX-Container, Turbo-Visit, Turbo-Frame, X-Requested-With, Accept,Accept-Encoding, Accept, X-Requested-With
x-content-type-options: nosniff
x-frame-options: deny
x-voltron-version: fd8fbbc
x-xss-protection: 0
server: github.com
content-encoding: gzip
accept-ranges: bytes
set-cookie: _gh_sess=0Ko1C2e29XxyG0FKP9RzUrnJyZbQUCjK%2BWnlRI7OHeZHh3KdcV8Y5QsTCuyP4NCY7cO5sh1sZ%2FDHSSMqr9idwT%2FVkpEm6AfUfPmlfqtNq%2B3iy%2FdLApDdzPdaBoWiENPR%2FrOoYBVdwzO3fmCPtclKzDi4riEjUuNOJCrK5DoqG3svN02GnAa3VarXTzNnhcdwLzyEjCAjRj2pIQ%2FL16JJl2KmP21OdPZMfap3OSSlazYG%2Fc29qp1MlmKGyZHG9Mqb1y%2BlIoervQwy5kQAag24ZQ%3D%3D--%2BS%2FzJqfl2TufkmwI--gsAlDNYSFC7rFRa0OcuNGQ%3D%3D; Path=/; HttpOnly; Secure; SameSite=Lax
set-cookie: _octo=GH1.1.1311217770.1753313324; Path=/; Domain=github.com; Expires=Thu, 23 Jul 2026 23:28:44 GMT; Secure; SameSite=Lax
set-cookie: logged_in=no; Path=/; Domain=github.com; Expires=Thu, 23 Jul 2026 23:28:44 GMT; HttpOnly; Secure; SameSite=Lax
x-github-request-id: 9C8E:0A76:11D8CD:19B260:6881702C
I want to cleanup and refactor this library (v40 proposal and discussion) · Issue #906 · robinrodricks/FluentFTP · GitHub
No one assignedNo projectsNo milestoneNone yetNo branches or pull requests
Skip to content
Navigation Menu
{{ message }}
-
-
Notifications
You must be signed in to change notification settings - Fork 673
Closed
Description
Intro
Here are things that I'd like to cleanup going forward. Since this has ramifications on all existing projects using FluentFTP, and since these will be major breaking changes to the API, I'd like community feedback on these changes so that they are not hasty, disruptive, or out-of-touch with the actual userbase.
I would like these to be part of the v40 release so its easy for existing users to understand that v39 is the "legacy API" and that v40+ will use the "newer API". I have never undertaken such a large systematic refactoring before.
Topic 1
- Problem: We have a lot of old/weird/unused functionality that is probably broken or not well tested or not being used.
EnableThreadSafeDataConnections
- Crazy feature which spawns new FTP connections for each file transferredQuickTransferLimit
- Implemented but disabledFtpClient.Connect(Uri)
- Static constructorsFtpClient.GetPublicIP()
- Static methodsDereferenceLink
- does anyone even use this?- 200 different constructors for
FtpClient
- I would just like 1 or 2 constructors for common patterns.
- Solution: Drop these features entirely.
Topic 2
- Problem: We have a massive set of properties directly within the
FtpClient
class which clutters up its API. - Solution: Store all configuration setting properties into child classes whose references are stored within the
FtpClient
. This groups up the properties into logical categories and also eliminates them from the FtpClient API.client.Connect()
becomesclient.Connect(FtpProfile)
client.FXPProgressInterval
becomesclient.FXP.ProgressInterval
client.DownloadZeroByteFiles
becomesclient.Download.ZeroByteFiles
client.TransferChunkSize
becomesclient.Download.ChunkSize
andclient.Upload.ChunkSize
Topic 3
- Problem: Most FTP servers don't support directly downloading/uploading from an absolute path (eg:
/root/animals/duck.txt
, therefore we should always set the working directory to the folder (eg:/root/animals/
) and then download the file (duck.txt
). And we should not allow the user to manually modify the working directory because it would conflict with this system. - Solution: Drop support for
GetWorkingDirectory
andSetWorkingDirectory
and instead always automatically set the working directory before file transfers or even getting the file size, etc. This would even fix issues where there are spaces in directory paths, and many other things. It would put us in parity with FileZilla.
Topic 4
- Problem: Our logging is a mess. We should be able to integrate with NLog and other standard .NET loggers.
- Solution: Drop support for
FtpTrace
and its outdated API and instead support aclient.Logger
property which can be set to our default logger or an NLog instance, etc.
Topic 5
- Problem: Poor implementation of timezone conversion. Fixed implementation that does not allow users to customize it.
- Solution: Implement a strategy pattern so users can select from:
NoTimeConversion
TimeZoneConversion
- a new method that allows for DST to be observed (missing feature)TimeOffsetConversion
- users specify which is their PC timezone and the server timezone and we do simple math to convert it (current method)
Topic 6
- Problem: We have 2 implementations of each function, a synchronous version and an async version. This causes bloat, mistakes/mismatches in the implementation, and weird behavior.
- Solution: Drop support for synchronous API. Drop support for <.NET 3.5 as it doesn't support async.
Topic 7
- Problem: Too much bloat with older
IAsyncResult
style async functions. - Solution: Remove it. Anyone who wants async can just use
async/await
.
Lets talk!
Please start the discussions below! Add your comments and mention which topic you are talking about. You can comment on any topic(s) that you like.
Metadata
Metadata
Assignees
Projects
Milestone
Relationships
Development
Issue actions
You can’t perform that action at this time.