Continuing to implement the FTPServer
This commit is contained in:
parent
537298e7d7
commit
1450a8c0e5
@ -5,9 +5,11 @@ _ftpCommand({'\0'}),
|
|||||||
_cmdParameters(NULL),
|
_cmdParameters(NULL),
|
||||||
_loggedIn(false),
|
_loggedIn(false),
|
||||||
_username(NULL),
|
_username(NULL),
|
||||||
_dataSocketOpen(false),
|
_currentDirectory(NULL),
|
||||||
|
_waitingForDataConnection(false),
|
||||||
_ftpClientState(FTPServer<FTPClient>::FTPClientState::WAITING_FOR_COMMANDS),
|
_ftpClientState(FTPServer<FTPClient>::FTPClientState::WAITING_FOR_COMMANDS),
|
||||||
_binaryFlag(FTPServer<FTPClient>::BinaryFlag::OFF)
|
_binaryFlag(FTPServer<FTPClient>::BinaryFlag::OFF),
|
||||||
|
_dataTransferPending(FTPServer<FTPClient>::FTPClientDataTransfer::NONE)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -16,11 +18,12 @@ FTPClient::~FTPClient()
|
|||||||
{
|
{
|
||||||
delete _cmdParameters;
|
delete _cmdParameters;
|
||||||
free(_username);
|
free(_username);
|
||||||
|
free(_currentDirectory);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FTPClient::setDataClient(WiFiClient dataClient)
|
void FTPClient::setDataClient(WiFiClient dataClient)
|
||||||
{
|
{
|
||||||
_dataClient = _dataClient;
|
_dataClient = dataClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean FTPClient::parseCommandAndParameters()
|
boolean FTPClient::parseCommandAndParameters()
|
||||||
|
@ -23,10 +23,13 @@ class FTPClient : public TCPClient
|
|||||||
Dictionary<DictionaryHelper::StringEntity> *_cmdParameters;
|
Dictionary<DictionaryHelper::StringEntity> *_cmdParameters;
|
||||||
boolean _loggedIn;
|
boolean _loggedIn;
|
||||||
char *_username;
|
char *_username;
|
||||||
boolean _dataSocketOpen;
|
char *_currentDirectory;
|
||||||
|
boolean _waitingForDataConnection;
|
||||||
|
|
||||||
|
|
||||||
FTPServer<FTPClient>::FTPClientState _ftpClientState;
|
FTPServer<FTPClient>::FTPClientState _ftpClientState;
|
||||||
FTPServer<FTPClient>::BinaryFlag _binaryFlag;
|
FTPServer<FTPClient>::BinaryFlag _binaryFlag;
|
||||||
|
FTPServer<FTPClient>::FTPClientDataTransfer _dataTransferPending;
|
||||||
WiFiClient _dataClient; //data socket
|
WiFiClient _dataClient; //data socket
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ class FTPServer : public TCPServer<T>
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
enum FTPClientState {WAITING_FOR_COMMANDS};
|
enum FTPClientState {WAITING_FOR_COMMANDS};
|
||||||
|
enum FTPClientDataTransfer {NONE, LIST_DF, NLST_DF};
|
||||||
enum BinaryFlag {OFF = 0, ON};
|
enum BinaryFlag {OFF = 0, ON};
|
||||||
|
|
||||||
FTPServer(unsigned int port = 21, const char *login = NULL, const char *password = NULL, uint8_t maxClient = MAX_CLIENT, uint16_t clientCommandDataBufferSize = 255) : TCPServer<T>(port, maxClient, clientCommandDataBufferSize),
|
FTPServer(unsigned int port = 21, const char *login = NULL, const char *password = NULL, uint8_t maxClient = MAX_CLIENT, uint16_t clientCommandDataBufferSize = 255) : TCPServer<T>(port, maxClient, clientCommandDataBufferSize),
|
||||||
@ -30,6 +31,11 @@ class FTPServer : public TCPServer<T>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setCustomDataPort(unsigned int port)
|
||||||
|
{
|
||||||
|
_dataPort = port;
|
||||||
|
}
|
||||||
|
|
||||||
virtual ~FTPServer()
|
virtual ~FTPServer()
|
||||||
{
|
{
|
||||||
free(_login);free(_password);
|
free(_login);free(_password);
|
||||||
@ -50,7 +56,7 @@ class FTPServer : public TCPServer<T>
|
|||||||
|
|
||||||
virtual void processClientData(T *client)
|
virtual void processClientData(T *client)
|
||||||
{
|
{
|
||||||
if(client->_dataSocketOpen)
|
if(client->_waitingForDataConnection)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_FTPS
|
#ifdef DEBUG_FTPS
|
||||||
Serial.println("Listening for new data client");
|
Serial.println("Listening for new data client");
|
||||||
@ -61,7 +67,7 @@ class FTPServer : public TCPServer<T>
|
|||||||
{
|
{
|
||||||
if(dataClient.connected())
|
if(dataClient.connected())
|
||||||
{
|
{
|
||||||
client->_dataSocketOpen = false;
|
client->_waitingForDataConnection = false;
|
||||||
client->setDataClient(dataClient);
|
client->setDataClient(dataClient);
|
||||||
#ifdef DEBUG_FTPS
|
#ifdef DEBUG_FTPS
|
||||||
Serial.println("Data client accepted successfully");
|
Serial.println("Data client accepted successfully");
|
||||||
@ -72,6 +78,30 @@ class FTPServer : public TCPServer<T>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(client->_dataTransferPending == LIST_DF)//We list the files of the current directory
|
||||||
|
{
|
||||||
|
//We check if the dataConnection is established:
|
||||||
|
if(client->_dataClient.connected())
|
||||||
|
{
|
||||||
|
//client->_client.println("125 Data connection already open.");
|
||||||
|
|
||||||
|
client->_dataClient.print("-rw-r--r-- 1 owner group 213 Aug 26 16:31 README.txt\r\n\
|
||||||
|
-rw-r--r-- 1 owner group 213 Aug 26 16:31 music.mp3\r\n\
|
||||||
|
drw-r--r-- 1 owner group 213 Aug 26 16:31 directory\r\n\
|
||||||
|
drw-r--r-- 1 owner group 213 Aug 26 16:31 subdir\r\n\
|
||||||
|
");
|
||||||
|
|
||||||
|
client->_client.println("226 Closing data connection.");
|
||||||
|
client->_dataClient.stop();
|
||||||
|
client->_dataTransferPending = NONE;
|
||||||
|
}
|
||||||
|
//With timeout
|
||||||
|
/*else
|
||||||
|
{
|
||||||
|
client->_client.println("425 Can't open data connection.");
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_FTPS
|
#ifdef DEBUG_FTPS
|
||||||
if(client->_newDataAvailable)
|
if(client->_newDataAvailable)
|
||||||
{
|
{
|
||||||
@ -181,9 +211,13 @@ class FTPServer : public TCPServer<T>
|
|||||||
{
|
{
|
||||||
_dataServer.begin(_dataPort);
|
_dataServer.begin(_dataPort);
|
||||||
client->_client.printf("227 Entering Passive Mode (%u,%u,%u,%u,%d,%d).\r\n", WiFi.localIP()[0], WiFi.localIP()[1], WiFi.localIP()[2], WiFi.localIP()[3], _dataPort/256, _dataPort%256);
|
client->_client.printf("227 Entering Passive Mode (%u,%u,%u,%u,%d,%d).\r\n", WiFi.localIP()[0], WiFi.localIP()[1], WiFi.localIP()[2], WiFi.localIP()[3], _dataPort/256, _dataPort%256);
|
||||||
client->_dataSocketOpen = true;
|
client->_waitingForDataConnection = true;
|
||||||
|
}
|
||||||
|
else if(strcmp(client->_ftpCommand,"LIST") == 0)
|
||||||
|
{
|
||||||
|
//We inform that a data transfer is pending
|
||||||
|
client->_dataTransferPending = LIST_DF;
|
||||||
}
|
}
|
||||||
ese if()
|
|
||||||
else
|
else
|
||||||
client->_client.println("502 Command not implemented.");
|
client->_client.println("502 Command not implemented.");
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@ uint16_t lastClientCount(0);
|
|||||||
|
|
||||||
//TCPServer<TCPClient> server(80, MAX_CLIENT, 5);
|
//TCPServer<TCPClient> server(80, MAX_CLIENT, 5);
|
||||||
//WEBServer<WEBClient> webServer(8080);
|
//WEBServer<WEBClient> webServer(8080);
|
||||||
FTPServer<FTPClient> ftpServer;
|
FTPServer<FTPClient> ftpServer;//(21,"test","test");
|
||||||
|
|
||||||
WiFiEventHandler gotIpEventHandler, disconnectedEventHandler;
|
WiFiEventHandler gotIpEventHandler, disconnectedEventHandler;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user