📄 requesthandler.java
字号:
*/
protected void notifyObserver() {
m_request.updateLastAccessTime();
m_fconfig.getConnectionManager().updateConnection(this);
}
/**
* Execute the ftp command.
*/
public void service(FtpRequestImpl request, FtpWriter out) throws IOException, FtpException {
try {
Command command = (Command)COMMAND_MAP.get( request.getCommand() );
if(command != null) {
command.execute(this, request, out);
}
else {
out.send(502, "not.implemented", null);
}
}
catch(Exception ex) {
// send error reply
m_log.warn("error:"+ ex.getMessage());
try {
out.send(550, null, null);
}
catch(Exception ex1) {
}
if (ex instanceof java.io.IOException) {
throw (IOException)ex;
}
else {
m_log.warn("RequestHandler.service()", ex);
}
}
}
/**
* Close connection. This is called by the connection service.
*/
public void close() {
// check whether already closed or not
synchronized(this) {
if(m_isConnectionClosed) {
return;
}
m_isConnectionClosed = true;
}
// call Ftplet.onDisconnect() method.
try {
Ftplet ftpletContainer = m_fconfig.getFtpletContainer();
ftpletContainer.onDisconnect(m_request, m_writer);
}
catch(Exception ex) {
m_log.warn("RequestHandler.close()", ex);
}
// notify statistics object and close request
IFtpStatistics ftpStat = (IFtpStatistics)m_fconfig.getFtpStatistics();
FtpRequestImpl request = m_request;
if(request != null) {
// log message
String userName = request.getUser().getName();
InetAddress clientAddr = request.getRemoteAddress();
m_log.info("Close connection : " + clientAddr.getHostAddress() + " - " + userName);
// logout if necessary and notify statistics
if(request.isLoggedIn()) {
request.setLogout();
ftpStat.setLogout(this);
}
ftpStat.setCloseConnection(this);
// clear request
request.clear();
request.setObserver(null);
request.getFtpDataConnection().dispose();
FileSystemView fview = request.getFileSystemView();
if(fview != null) {
fview.dispose();
}
m_request = null;
}
// close ftp writer
FtpWriter writer = m_writer;
if(writer != null) {
writer.setObserver(null);
writer.close();
m_writer = null;
}
// close buffered reader
BufferedReader reader = m_reader;
if(reader != null) {
IoUtils.close(reader);
m_reader = null;
}
// close control socket
Socket controlSocket = m_controlSocket;
if (controlSocket != null) {
try {
controlSocket.close();
}
catch(Exception ex) {
m_log.warn("RequestHandler.close()", ex);
}
m_controlSocket = null;
}
}
/**
* Check user permission to execute ftp command.
*/
protected boolean hasPermission() {
String cmd = m_request.getCommand();
if(cmd == null) {
return false;
}
return m_request.isLoggedIn() ||
cmd.equals("USER") ||
cmd.equals("PASS") ||
cmd.equals("AUTH") ||
cmd.equals("HELP") ||
cmd.equals("SYST") ||
cmd.equals("FEAT") ||
cmd.equals("PBSZ") ||
cmd.equals("PROT") ||
cmd.equals("LANG") ||
cmd.equals("QUIT");
}
/**
* Transfer data.
*/
public final long transfer(BufferedInputStream in,
BufferedOutputStream out,
int maxRate) throws IOException {
boolean isAscii = m_dataType == DataType.ASCII;
long startTime = System.currentTimeMillis();
long transferredSize = 0L;
byte[] buff = new byte[4096];
while(true) {
// if current rate exceeds the max rate, sleep for 50ms
if(maxRate > 0) {
// prevent "divide by zero" exception
long interval = System.currentTimeMillis() - startTime;
if(interval == 0) {
interval = 1;
}
// check current rate
long currRate = (transferredSize*1000L)/interval;
if(currRate > maxRate) {
try { Thread.sleep(50); } catch(InterruptedException ex) {break;}
}
}
// read data
int count = in.read(buff);
if(count == -1) {
break;
}
// write data
// if ascii, replace \n by \r\n
if(isAscii) {
for(int i=0; i<count; ++i) {
byte b = buff[i];
if(b == '\n') {
out.write('\r');
}
out.write(b);
}
}
else {
out.write(buff, 0, count);
}
transferredSize += count;
notifyObserver();
}
return transferredSize;
}
/**
* Create secure socket.
*/
public void createSecureSocket(String protocol) throws Exception {
// change socket to SSL socket
ISsl ssl = m_fconfig.getDataConnectionConfig().getSSL();
if(ssl == null) {
throw new FtpException("Socket factory SSL not configured");
}
Socket ssoc = ssl.createSocket(protocol, m_controlSocket, false);
// change streams
m_reader = new BufferedReader(new InputStreamReader(ssoc.getInputStream(), "GB2312"));//GB2312 UTF-8
m_writer.setControlSocket(ssoc);
// set control socket
m_controlSocket = ssoc;
}
/////////////////////////////////////////////////////////////////////
static {
COMMAND_MAP.put("ABOR", new org.apache.ftpserver.command.ABOR());
COMMAND_MAP.put("ACCT", new org.apache.ftpserver.command.ACCT());
COMMAND_MAP.put("APPE", new org.apache.ftpserver.command.APPE());
COMMAND_MAP.put("AUTH", new org.apache.ftpserver.command.AUTH());
COMMAND_MAP.put("CDUP", new org.apache.ftpserver.command.CDUP());
COMMAND_MAP.put("CWD", new org.apache.ftpserver.command.CWD());
COMMAND_MAP.put("DELE", new org.apache.ftpserver.command.DELE());
COMMAND_MAP.put("EPRT", new org.apache.ftpserver.command.EPRT());
COMMAND_MAP.put("EPSV", new org.apache.ftpserver.command.EPSV());
COMMAND_MAP.put("FEAT", new org.apache.ftpserver.command.FEAT());
COMMAND_MAP.put("HELP", new org.apache.ftpserver.command.HELP());
COMMAND_MAP.put("LANG", new org.apache.ftpserver.command.LANG());
COMMAND_MAP.put("LIST", new org.apache.ftpserver.command.LIST());
COMMAND_MAP.put("MDTM", new org.apache.ftpserver.command.MDTM());
COMMAND_MAP.put("MLST", new org.apache.ftpserver.command.MLST());
COMMAND_MAP.put("MKD", new org.apache.ftpserver.command.MKD());
COMMAND_MAP.put("MLSD", new org.apache.ftpserver.command.MLSD());
COMMAND_MAP.put("MODE", new org.apache.ftpserver.command.MODE());
COMMAND_MAP.put("NLST", new org.apache.ftpserver.command.NLST());
COMMAND_MAP.put("NOOP", new org.apache.ftpserver.command.NOOP());
COMMAND_MAP.put("OPTS", new org.apache.ftpserver.command.OPTS());
COMMAND_MAP.put("PASS", new org.apache.ftpserver.command.PASS());
COMMAND_MAP.put("PASV", new org.apache.ftpserver.command.PASV());
COMMAND_MAP.put("PBSZ", new org.apache.ftpserver.command.PBSZ());
COMMAND_MAP.put("PORT", new org.apache.ftpserver.command.PORT());
COMMAND_MAP.put("PROT", new org.apache.ftpserver.command.PROT());
COMMAND_MAP.put("PWD", new org.apache.ftpserver.command.PWD());
COMMAND_MAP.put("QUIT", new org.apache.ftpserver.command.QUIT());
COMMAND_MAP.put("REIN", new org.apache.ftpserver.command.REIN());
COMMAND_MAP.put("REST", new org.apache.ftpserver.command.REST());
COMMAND_MAP.put("RETR", new org.apache.ftpserver.command.RETR());
COMMAND_MAP.put("RMD", new org.apache.ftpserver.command.RMD());
COMMAND_MAP.put("RNFR", new org.apache.ftpserver.command.RNFR());
COMMAND_MAP.put("RNTO", new org.apache.ftpserver.command.RNTO());
COMMAND_MAP.put("SITE", new org.apache.ftpserver.command.SITE());
COMMAND_MAP.put("SIZE", new org.apache.ftpserver.command.SIZE());
COMMAND_MAP.put("STAT", new org.apache.ftpserver.command.STAT());
COMMAND_MAP.put("STOR", new org.apache.ftpserver.command.STOR());
COMMAND_MAP.put("STOU", new org.apache.ftpserver.command.STOU());
COMMAND_MAP.put("STRU", new org.apache.ftpserver.command.STRU());
COMMAND_MAP.put("SYST", new org.apache.ftpserver.command.SYST());
COMMAND_MAP.put("TYPE", new org.apache.ftpserver.command.TYPE());
COMMAND_MAP.put("USER", new org.apache.ftpserver.command.USER());
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -