Merge pull request #83 from digineo/deadline
Add SetDeadline to Response
This commit is contained in:
commit
0895dc7f07
@ -4,6 +4,7 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/textproto"
|
"net/textproto"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@ -67,6 +68,7 @@ func testConn(t *testing.T, disableEPSV bool) {
|
|||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Read without deadline
|
||||||
r, err := c.Retr("tset")
|
r, err := c.Retr("tset")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
@ -81,6 +83,22 @@ func testConn(t *testing.T, disableEPSV bool) {
|
|||||||
r.Close()
|
r.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Read with deadline
|
||||||
|
r, err = c.Retr("tset")
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
} else {
|
||||||
|
r.SetDeadline(time.Now())
|
||||||
|
_, err := ioutil.ReadAll(r)
|
||||||
|
if err == nil {
|
||||||
|
t.Error("deadline should have caused error")
|
||||||
|
} else if !strings.HasSuffix(err.Error(), "i/o timeout") {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
r.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read with offset
|
||||||
r, err = c.RetrFrom("tset", 5)
|
r, err = c.RetrFrom("tset", 5)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
|
23
ftp.go
23
ftp.go
@ -45,8 +45,8 @@ type Entry struct {
|
|||||||
Time time.Time
|
Time time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
// response represent a data-connection
|
// Response represents a data-connection
|
||||||
type response struct {
|
type Response struct {
|
||||||
conn net.Conn
|
conn net.Conn
|
||||||
c *ServerConn
|
c *ServerConn
|
||||||
}
|
}
|
||||||
@ -337,7 +337,7 @@ func (c *ServerConn) NameList(path string) (entries []string, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
r := &response{conn, c}
|
r := &Response{conn, c}
|
||||||
defer r.Close()
|
defer r.Close()
|
||||||
|
|
||||||
scanner := bufio.NewScanner(r)
|
scanner := bufio.NewScanner(r)
|
||||||
@ -368,7 +368,7 @@ func (c *ServerConn) List(path string) (entries []*Entry, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
r := &response{conn, c}
|
r := &Response{conn, c}
|
||||||
defer r.Close()
|
defer r.Close()
|
||||||
|
|
||||||
scanner := bufio.NewScanner(r)
|
scanner := bufio.NewScanner(r)
|
||||||
@ -431,7 +431,7 @@ func (c *ServerConn) FileSize(path string) (int64, error) {
|
|||||||
// FTP server.
|
// FTP server.
|
||||||
//
|
//
|
||||||
// The returned ReadCloser must be closed to cleanup the FTP data connection.
|
// The returned ReadCloser must be closed to cleanup the FTP data connection.
|
||||||
func (c *ServerConn) Retr(path string) (io.ReadCloser, error) {
|
func (c *ServerConn) Retr(path string) (*Response, error) {
|
||||||
return c.RetrFrom(path, 0)
|
return c.RetrFrom(path, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -439,13 +439,13 @@ func (c *ServerConn) Retr(path string) (io.ReadCloser, error) {
|
|||||||
// FTP server, the server will not send the offset first bytes of the file.
|
// FTP server, the server will not send the offset first bytes of the file.
|
||||||
//
|
//
|
||||||
// The returned ReadCloser must be closed to cleanup the FTP data connection.
|
// The returned ReadCloser must be closed to cleanup the FTP data connection.
|
||||||
func (c *ServerConn) RetrFrom(path string, offset uint64) (io.ReadCloser, error) {
|
func (c *ServerConn) RetrFrom(path string, offset uint64) (*Response, error) {
|
||||||
conn, err := c.cmdDataConnFrom(offset, "RETR %s", path)
|
conn, err := c.cmdDataConnFrom(offset, "RETR %s", path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return &response{conn, c}, nil
|
return &Response{conn, c}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stor issues a STOR FTP command to store a file to the remote FTP server.
|
// Stor issues a STOR FTP command to store a file to the remote FTP server.
|
||||||
@ -531,12 +531,12 @@ func (c *ServerConn) Quit() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Read implements the io.Reader interface on a FTP data connection.
|
// Read implements the io.Reader interface on a FTP data connection.
|
||||||
func (r *response) Read(buf []byte) (int, error) {
|
func (r *Response) Read(buf []byte) (int, error) {
|
||||||
return r.conn.Read(buf)
|
return r.conn.Read(buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close implements the io.Closer interface on a FTP data connection.
|
// Close implements the io.Closer interface on a FTP data connection.
|
||||||
func (r *response) Close() error {
|
func (r *Response) Close() error {
|
||||||
err := r.conn.Close()
|
err := r.conn.Close()
|
||||||
_, _, err2 := r.c.conn.ReadResponse(StatusClosingDataConnection)
|
_, _, err2 := r.c.conn.ReadResponse(StatusClosingDataConnection)
|
||||||
if err2 != nil {
|
if err2 != nil {
|
||||||
@ -544,3 +544,8 @@ func (r *response) Close() error {
|
|||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetDeadline sets the deadlines associated with the connection.
|
||||||
|
func (r *Response) SetDeadline(t time.Time) error {
|
||||||
|
return r.conn.SetDeadline(t)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user