ConnStateData::FtpState clientState() const;
void clientState(ConnStateData::FtpState newState);
+ virtual void serverComplete();
virtual void failed(err_type error = ERR_NONE, int xerrno = 0);
virtual void handleControlReply();
virtual void handleRequestBodyProducerAborted();
- virtual bool doneWithServer() const;
virtual bool mayReadVirginReplyBody() const;
virtual void completeForwarding();
void forwardReply();
SENT_DATA_REQUEST,
READING_DATA,
UPLOADING_DATA,
- DONE
+ END
};
typedef void (ServerStateData::*SM_FUNC)();
static const SM_FUNC SM_FUNCS[];
&ServerStateData::readDataReply, // SENT_DATA_REQUEST
&ServerStateData::readTransferDoneReply, // READING_DATA
&ServerStateData::readReply, // UPLOADING_DATA
- NULL // DONE
+ NULL // END
};
ServerStateData::ServerStateData(FwdState *const fwdState):
ServerStateData::~ServerStateData()
{
- if (Comm::IsConnOpen(ctrl.conn)) {
- fwd->unregister(ctrl.conn);
- ctrl.forget();
- }
+ closeServer(); // TODO: move to Server.cc?
}
void
sendCommand();
}
+/// Keep control connection for future requests, after we are done with it.
+/// Similar to COMPLETE_PERSISTENT_MSG handling in http.cc.
+void
+ServerStateData::serverComplete()
+{
+ if (Comm::IsConnOpen(ctrl.conn)) {
+ debugs(9, 5, "preserve FTP server FD " << ctrl.conn->fd);
+ fwd->unregister(ctrl.conn);
+ ctrl.forget();
+ // fwd->request->clientConnectionManager has this connection pinned
+ }
+ Ftp::ServerStateData::serverComplete();
+}
+
ConnStateData::FtpState
ServerStateData::clientState() const
{
if (ctrl.message == NULL)
return; // didn't get complete reply yet
- assert(state < DONE);
+ assert(state < END);
(this->*SM_FUNCS[state])();
}
failed(ERR_READ_ERROR);
}
-bool
-ServerStateData::doneWithServer() const
-{
- return state == DONE || Ftp::ServerStateData::doneWithServer();
-}
-
bool
ServerStateData::mayReadVirginReplyBody() const
{
setVirginReply(reply);
adaptOrFinalizeReply();
- state = DONE;
serverComplete();
}
void
ServerStateData::forwardError(err_type error, int xerrno)
{
- state = DONE;
failed(error, xerrno);
}
" after reading data");
}
- state = DONE;
serverComplete();
}