FTP client package for Go
Go to file
Nick Craig-Wood 9e39e2c406
Fix hang when using ExplicitTLS to certain servers. (#283)
In #282 it was discovered that doing the tls Handshake immediately on
connection causes some FTP servers (proftpd and pureftpd) to hang.

The exact cause of this is unknown, but this patch works around the
problem by not doing the Handsake initially, and only doing it at the
end if we were attempting to upload a zero length file.

Doing the Handshake at the end was originally added in
a4e9650823 however it got reverted in 212daf295f which
used tls.DialWithDialer to do the handshake. Unfortunately
tls.DialWithDialer seems to trigger the hanging bug.

See: https://forum.rclone.org/t/rclone-ftps-explicit-rclone-touch-empty-files-proftpd-unable-to-build-data-connection-operation-not-permitted/22522
See: https://github.com/rclone/rclone/issues/6426#issuecomment-1243993039
Fixes #282
2023-02-08 11:46:41 -05:00
.github Bump actions/cache from 3.2.3 to 3.2.4 (#307) 2023-02-08 11:44:47 -05:00
client_test.go Add forceListHidden dial option to force the use of 'LIST -a' command (#271) 2022-09-04 14:43:06 -04:00
conn_test.go Add MLST command in the form of a Get method (#269) 2022-08-21 17:25:29 -04:00
constants_test.go Add tests for EntryType 2022-03-08 18:57:09 -05:00
debug.go Debug directory listings 2021-10-03 18:40:19 +03:00
ftp.go Fix hang when using ExplicitTLS to certain servers. (#283) 2023-02-08 11:46:41 -05:00
go.mod Bump github.com/stretchr/testify from 1.8.0 to 1.8.1 (#294) 2022-12-21 17:33:01 -05:00
go.sum Bump github.com/stretchr/testify from 1.8.0 to 1.8.1 (#294) 2022-12-21 17:33:01 -05:00
LICENSE Update copyright years. 2013-02-17 10:34:01 +01:00
parse_test.go Fix issues reported by errcheck 2021-03-06 19:36:26 -05:00
parse.go Add MLST command in the form of a Get method (#269) 2022-08-21 17:25:29 -04:00
README.md Add CodeQL and golangci-lint badges 2022-09-07 18:02:26 -04:00
scanner_test.go Fix issues reported by goimports 2021-03-06 19:44:19 -05:00
scanner.go Do not export the scanner type 2017-03-04 13:01:41 +01:00
status.go Add status string for unknown status codes 2020-07-08 08:23:44 +02:00
walker_test.go Fix issues reported by staticcheck 2020-10-21 22:10:46 +02:00
walker.go Add forceListHidden dial option to force the use of 'LIST -a' command (#271) 2022-09-04 14:43:06 -04:00

goftp

Units tests Coverage Status golangci-lint CodeQL Go ReportCard Go Reference

A FTP client package for Go

Install

go get -u github.com/jlaffaye/ftp

Documentation

https://pkg.go.dev/github.com/jlaffaye/ftp

Example

c, err := ftp.Dial("ftp.example.org:21", ftp.DialWithTimeout(5*time.Second))
if err != nil {
    log.Fatal(err)
}

err = c.Login("anonymous", "anonymous")
if err != nil {
    log.Fatal(err)
}

// Do something with the FTP conn

if err := c.Quit(); err != nil {
    log.Fatal(err)
}

Store a file example

data := bytes.NewBufferString("Hello World")
err = c.Stor("test-file.txt", data)
if err != nil {
	panic(err)
}

Read a file example

r, err := c.Retr("test-file.txt")
if err != nil {
	panic(err)
}
defer r.Close()

buf, err := ioutil.ReadAll(r)
println(string(buf))