};
typedef void (ServerStateData::*SM_FUNC)();
static const SM_FUNC SM_FUNCS[];
- void readWelcome();
+ void readGreeting();
void sendCommand();
void readReply();
void readPasvReply();
CBDATA_CLASS_INIT(ServerStateData);
const ServerStateData::SM_FUNC ServerStateData::SM_FUNCS[] = {
- &ServerStateData::readWelcome, // BEGIN
+ &ServerStateData::readGreeting, // BEGIN
&ServerStateData::readReply, // SENT_COMMAND
&ServerStateData::readPasvReply, // SENT_PASV
&ServerStateData::readDataReply, // SENT_DATA_REQUEST
void
ServerStateData::start()
{
- if (clientState() == ConnStateData::FTP_BEGIN)
+ if (!fwd->request->clientConnectionManager->ftp.readGreeting)
Ftp::ServerStateData::start();
else
if (clientState() == ConnStateData::FTP_HANDLE_DATA_REQUEST ||
}
void
-ServerStateData::readWelcome()
+ServerStateData::readGreeting()
{
- assert(clientState() == ConnStateData::FTP_BEGIN);
+ assert(!fwd->request->clientConnectionManager->ftp.readGreeting);
switch (ctrl.replycode) {
case 220:
- clientState(ConnStateData::FTP_CONNECTED);
+ fwd->request->clientConnectionManager->ftp.readGreeting = true;
+ if (clientState() == ConnStateData::FTP_BEGIN)
+ clientState(ConnStateData::FTP_CONNECTED);
ctrl.replycode = 120; // change status for forwarded server greeting
- forwardPreliminaryReply(&ServerStateData::sendCommand);
+ forwardPreliminaryReply(&ServerStateData::start);
break;
case 120:
if (NULL != ctrl.message)
// Socket is ready, setup the connection manager to start using it
ConnStateData *connState = connStateCreate(params.conn, s);
+ if (connState->transparent()) {
+ char buf[MAX_IPSTRLEN];
+ connState->clientConnection->local.ToURL(buf,MAX_IPSTRLEN);
+ connState->ftp.uri = "ftp://";
+ connState->ftp.uri.append(buf);
+ connState->ftp.uri.append("/");
+ debugs(33, 5, HERE << "FTP transparent URL: " << connState->ftp.uri);
+ }
+
FtpWriteGreeting(connState);
}
const String::size_type eou = params.find('@');
if (eou == String::npos || eou + 1 >= params.size()) {
+ if (connState->ftp.uri.size() > 0)
+ return true;
FtpWriteEarlyReply(connState, 501, "Missing host");
return false;
}