mirror of https://github.com/aria2/aria2
pull/1/head
parent
5a8710676d
commit
e0aa767f94
|
@ -0,0 +1,207 @@
|
|||
/* <!-- copyright */
|
||||
/*
|
||||
* aria2 - a simple utility for downloading files faster
|
||||
*
|
||||
* Copyright (C) 2006 Tatsuhiro Tsujikawa
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
/* copyright --> */
|
||||
#include "FtpConnection.h"
|
||||
#include "Util.h"
|
||||
#include "DlAbortEx.h"
|
||||
#include "message.h"
|
||||
|
||||
FtpConnection::FtpConnection(int cuid, const Socket* socket, const Request* req, const Option* op, const Logger* logger):cuid(cuid), socket(socket), req(req), option(op), logger(logger) {}
|
||||
|
||||
FtpConnection::~FtpConnection() {}
|
||||
|
||||
void FtpConnection::sendUser() const {
|
||||
string request = "USER "+option->get("ftp_user")+"\r\n";
|
||||
logger->info(MSG_SENDING_FTP_REQUEST, cuid, request.c_str());
|
||||
socket->writeData(request);
|
||||
}
|
||||
|
||||
void FtpConnection::sendPass() const {
|
||||
string request = "PASS "+option->get("ftp_passwd")+"\r\n";
|
||||
logger->info(MSG_SENDING_FTP_REQUEST, cuid, "PASS ********");
|
||||
socket->writeData(request);
|
||||
}
|
||||
|
||||
void FtpConnection::sendType() const {
|
||||
string request = "TYPE "+option->get("ftp_type")+"\r\n";
|
||||
logger->info(MSG_SENDING_FTP_REQUEST, cuid, request.c_str());
|
||||
socket->writeData(request);
|
||||
}
|
||||
|
||||
void FtpConnection::sendCwd() const {
|
||||
string request = "CWD "+req->getDir()+"\r\n";
|
||||
logger->info(MSG_SENDING_FTP_REQUEST, cuid, request.c_str());
|
||||
socket->writeData(request);
|
||||
}
|
||||
|
||||
void FtpConnection::sendSize() const {
|
||||
string request = "SIZE "+req->getFile()+"\r\n";
|
||||
logger->info(MSG_SENDING_FTP_REQUEST, cuid, request.c_str());
|
||||
socket->writeData(request);
|
||||
}
|
||||
|
||||
void FtpConnection::sendPasv() const {
|
||||
string request = "PASV\r\n";
|
||||
logger->info(MSG_SENDING_FTP_REQUEST, cuid, request.c_str());
|
||||
socket->writeData(request);
|
||||
}
|
||||
|
||||
Socket* FtpConnection::sendPort() const {
|
||||
Socket* serverSocket = new Socket();
|
||||
try {
|
||||
serverSocket->beginListen();
|
||||
|
||||
pair<string, int> addrinfo;
|
||||
socket->getAddrInfo(addrinfo);
|
||||
int ipaddr[4];
|
||||
sscanf(addrinfo.first.c_str(), "%d.%d.%d.%d",
|
||||
&ipaddr[0], &ipaddr[1], &ipaddr[2], &ipaddr[3]);
|
||||
serverSocket->getAddrInfo(addrinfo);
|
||||
string request = "PORT "+
|
||||
Util::itos(ipaddr[0])+","+Util::itos(ipaddr[1])+","+
|
||||
Util::itos(ipaddr[2])+","+Util::itos(ipaddr[3])+","+
|
||||
Util::itos(addrinfo.second/256)+","+Util::itos(addrinfo.second%256)+"\r\n";
|
||||
logger->info(MSG_SENDING_FTP_REQUEST, cuid, request.c_str());
|
||||
socket->writeData(request);
|
||||
} catch (Exception* ex) {
|
||||
delete serverSocket;
|
||||
throw;
|
||||
}
|
||||
return serverSocket;
|
||||
}
|
||||
|
||||
void FtpConnection::sendRest(const Segment& segment) const {
|
||||
string request = "REST "+Util::llitos(segment.sp+segment.ds)+"\r\n";
|
||||
logger->info(MSG_SENDING_FTP_REQUEST, cuid, request.c_str());
|
||||
socket->writeData(request);
|
||||
}
|
||||
|
||||
void FtpConnection::sendRetr() const {
|
||||
string request = "RETR "+req->getFile()+"\r\n";
|
||||
logger->info(MSG_SENDING_FTP_REQUEST, cuid, request.c_str());
|
||||
socket->writeData(request);
|
||||
}
|
||||
|
||||
int FtpConnection::getStatus(string response) const {
|
||||
int status;
|
||||
// TODO we must handle when the response is not like "%d %*s"
|
||||
// In this case, we return 0
|
||||
if(sscanf(response.c_str(), "%d %*s", &status) == 1) {
|
||||
return status;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
bool FtpConnection::isEndOfResponse(int status, string response) const {
|
||||
if(response.size() <= 4) {
|
||||
return false;
|
||||
}
|
||||
// if forth character of buf is '-', then multi line response is expected.
|
||||
if(response.at(3) == '-') {
|
||||
// multi line response
|
||||
string::size_type p;
|
||||
p = response.find("\r\n"+Util::itos(status)+" ");
|
||||
if(p == string::npos) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if(Util::endsWith(response, "\r\n")) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool FtpConnection::bulkReceiveResponse(pair<int, string>& response) {
|
||||
char buf[1024];
|
||||
while(socket->isReadable(0)) {
|
||||
int size = sizeof(buf)-1;
|
||||
socket->readData(buf, size);
|
||||
buf[size] = '\0';
|
||||
strbuf += buf;
|
||||
}
|
||||
int status;
|
||||
if(strbuf.size() >= 4) {
|
||||
status = getStatus(strbuf);
|
||||
if(status == 0) {
|
||||
throw new DlAbortEx(EX_INVALID_RESPONSE);
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
if(isEndOfResponse(status, strbuf)) {
|
||||
logger->info(MSG_RECEIVE_RESPONSE, cuid, strbuf.c_str());
|
||||
response.first = status;
|
||||
response.second = strbuf;
|
||||
strbuf.erase();
|
||||
return true;
|
||||
} else {
|
||||
// didn't receive response fully.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
int FtpConnection::receiveResponse() {
|
||||
pair<int, string> response;
|
||||
if(bulkReceiveResponse(response)) {
|
||||
return response.first;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int FtpConnection::receiveSizeResponse(long long int& size) {
|
||||
pair<int, string> response;
|
||||
if(bulkReceiveResponse(response)) {
|
||||
if(response.first == 213) {
|
||||
sscanf(response.second.c_str(), "%*d %Ld", &size);
|
||||
}
|
||||
return response.first;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int FtpConnection::receivePasvResponse(pair<string, int>& dest) {
|
||||
pair<int, string> response;
|
||||
if(bulkReceiveResponse(response)) {
|
||||
if(response.first == 227) {
|
||||
// we assume the format of response is "227 Entering Passive Mode (h1,h2,h3,h4,p1,p2)."
|
||||
int h1, h2, h3, h4, p1, p2;
|
||||
string::size_type p = response.second.find("(");
|
||||
if(p >= 4) {
|
||||
sscanf(response.second.substr(response.second.find("(")).c_str(),
|
||||
"(%d,%d,%d,%d,%d,%d).",
|
||||
&h1, &h2, &h3, &h4, &p1, &p2);
|
||||
// ip address
|
||||
dest.first = Util::itos(h1)+"."+Util::itos(h2)+"."+Util::itos(h3)+"."+Util::itos(h4);
|
||||
// port number
|
||||
dest.second = 256*p1+p2;
|
||||
} else {
|
||||
throw new DlAbortEx(EX_INVALID_RESPONSE);
|
||||
}
|
||||
}
|
||||
return response.first;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,65 @@
|
|||
/* <!-- copyright */
|
||||
/*
|
||||
* aria2 - a simple utility for downloading files faster
|
||||
*
|
||||
* Copyright (C) 2006 Tatsuhiro Tsujikawa
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
/* copyright --> */
|
||||
#ifndef _D_FTP_CONNECTION_H_
|
||||
#define _D_FTP_CONNECTION_H_
|
||||
|
||||
#include "Socket.h"
|
||||
#include "Option.h"
|
||||
#include "Logger.h"
|
||||
#include "Segment.h"
|
||||
#include "Request.h"
|
||||
#include <utility>
|
||||
|
||||
using namespace std;
|
||||
|
||||
class FtpConnection {
|
||||
private:
|
||||
int cuid;
|
||||
const Socket* socket;
|
||||
const Request* req;
|
||||
const Option* option;
|
||||
const Logger* logger;
|
||||
|
||||
string strbuf;
|
||||
|
||||
int getStatus(string response) const;
|
||||
bool isEndOfResponse(int status, string response) const;
|
||||
bool bulkReceiveResponse(pair<int, string>& response);
|
||||
public:
|
||||
FtpConnection(int cuid, const Socket* socket, const Request* req, const Option* op, const Logger* logger);
|
||||
~FtpConnection();
|
||||
void sendUser() const;
|
||||
void sendPass() const;
|
||||
void sendType() const;
|
||||
void sendCwd() const;
|
||||
void sendSize() const;
|
||||
void sendPasv() const;
|
||||
Socket* sendPort() const;
|
||||
void sendRest(const Segment& segment) const;
|
||||
void sendRetr() const;
|
||||
|
||||
int receiveResponse();
|
||||
int receiveSizeResponse(long long int& size);
|
||||
int receivePasvResponse(pair<string, int>& dest);
|
||||
};
|
||||
|
||||
#endif // _D_FTP_CONNECTION_H_
|
|
@ -0,0 +1,38 @@
|
|||
/* <!-- copyright */
|
||||
/*
|
||||
* aria2 - a simple utility for downloading files faster
|
||||
*
|
||||
* Copyright (C) 2006 Tatsuhiro Tsujikawa
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
/* copyright --> */
|
||||
#include "FtpDownloadCommand.h"
|
||||
|
||||
FtpDownloadCommand::FtpDownloadCommand(int cuid, Request* req, DownloadEngine* e, Socket* dataSocket, Socket* ctrlSocket):
|
||||
DownloadCommand(cuid, req, e, dataSocket)
|
||||
{
|
||||
this->ctrlSocket = new Socket(*ctrlSocket);
|
||||
}
|
||||
|
||||
FtpDownloadCommand::~FtpDownloadCommand() {
|
||||
if(ctrlSocket != NULL) {
|
||||
delete ctrlSocket;
|
||||
}
|
||||
}
|
||||
|
||||
TransferEncoding* FtpDownloadCommand::getTransferEncoding(string name) {
|
||||
return NULL;
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
/* <!-- copyright */
|
||||
/*
|
||||
* aria2 - a simple utility for downloading files faster
|
||||
*
|
||||
* Copyright (C) 2006 Tatsuhiro Tsujikawa
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
/* copyright --> */
|
||||
#ifndef _D_FTP_DOWNLOAD_COMMAND_H_
|
||||
#define _D_FTP_DOWNLOAD_COMMAND_H_
|
||||
|
||||
#include "DownloadCommand.h"
|
||||
|
||||
class FtpDownloadCommand : public DownloadCommand {
|
||||
private:
|
||||
Socket* ctrlSocket;
|
||||
public:
|
||||
FtpDownloadCommand(int cuid, Request* req, DownloadEngine* e, Socket* dataSocket, Socket* ctrlSocket);
|
||||
~FtpDownloadCommand();
|
||||
|
||||
TransferEncoding* getTransferEncoding(string name);
|
||||
};
|
||||
|
||||
#endif // _D_FTP_DOWNLOAD_COMMAND_H_
|
|
@ -0,0 +1,84 @@
|
|||
/* <!-- copyright */
|
||||
/*
|
||||
* aria2 - a simple utility for downloading files faster
|
||||
*
|
||||
* Copyright (C) 2006 Tatsuhiro Tsujikawa
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
/* copyright --> */
|
||||
#include "FtpInitiateConnectionCommand.h"
|
||||
#include "FtpNegotiationCommand.h"
|
||||
#include "HttpRequestCommand.h"
|
||||
#include "FtpTunnelRequestCommand.h"
|
||||
#include "DlAbortEx.h"
|
||||
#include "message.h"
|
||||
|
||||
FtpInitiateConnectionCommand::FtpInitiateConnectionCommand(int cuid, Request* req, DownloadEngine* e):AbstractCommand(cuid, req, e) {}
|
||||
|
||||
FtpInitiateConnectionCommand::~FtpInitiateConnectionCommand() {}
|
||||
|
||||
bool FtpInitiateConnectionCommand::executeInternal(Segment segment) {
|
||||
if(!e->segmentMan->downloadStarted) {
|
||||
e->segmentMan->filename = req->getFile();
|
||||
bool segFileExists = e->segmentMan->segmentFileExists();
|
||||
if(segFileExists) {
|
||||
e->segmentMan->load();
|
||||
e->diskWriter->openExistingFile(e->segmentMan->getFilePath());
|
||||
e->segmentMan->downloadStarted = true;
|
||||
} else {
|
||||
e->diskWriter->initAndOpenFile(e->segmentMan->getFilePath());
|
||||
}
|
||||
}
|
||||
|
||||
socket = new Socket();
|
||||
Command* command;
|
||||
if(useHttpProxy()) {
|
||||
e->logger->info(MSG_CONNECTING_TO_SERVER, cuid,
|
||||
e->option->get("http_proxy_host").c_str(),
|
||||
e->option->getAsInt("http_proxy_port"));
|
||||
socket->establishConnection(e->option->get("http_proxy_host"),
|
||||
e->option->getAsInt("http_proxy_port"));
|
||||
|
||||
if(useHttpProxyGet()) {
|
||||
command = new HttpRequestCommand(cuid, req, e, socket);
|
||||
} else if(useHttpProxyConnect()) {
|
||||
command = new FtpTunnelRequestCommand(cuid, req, e, socket);
|
||||
} else {
|
||||
// TODO
|
||||
throw new DlAbortEx("ERROR");
|
||||
}
|
||||
} else {
|
||||
e->logger->info(MSG_CONNECTING_TO_SERVER, cuid, req->getHost().c_str(),
|
||||
req->getPort());
|
||||
socket->establishConnection(req->getHost(), req->getPort());
|
||||
command = new FtpNegotiationCommand(cuid, req, e, socket);
|
||||
}
|
||||
e->commands.push(command);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FtpInitiateConnectionCommand::useHttpProxy() const {
|
||||
return e->option->defined("http_proxy_enabled") &&
|
||||
e->option->get("http_proxy_enabled") == "true";
|
||||
}
|
||||
|
||||
bool FtpInitiateConnectionCommand::useHttpProxyGet() const {
|
||||
return useHttpProxy() && e->option->get("ftp_via_http_proxy") == "get";
|
||||
}
|
||||
|
||||
bool FtpInitiateConnectionCommand::useHttpProxyConnect() const {
|
||||
return useHttpProxy() && e->option->get("ftp_via_http_proxy") == "tunnel";
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
/* <!-- copyright */
|
||||
/*
|
||||
* aria2 - a simple utility for downloading files faster
|
||||
*
|
||||
* Copyright (C) 2006 Tatsuhiro Tsujikawa
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
/* copyright --> */
|
||||
#ifndef _D_FTP_INITIATE_CONNECTION_COMMAND_H_
|
||||
#define _D_FTP_INITIATE_CONNECTION_COMMAND_H_
|
||||
|
||||
#include "AbstractCommand.h"
|
||||
|
||||
class FtpInitiateConnectionCommand : public AbstractCommand {
|
||||
private:
|
||||
bool useHttpProxy() const;
|
||||
bool useHttpProxyGet() const;
|
||||
bool useHttpProxyConnect() const;
|
||||
protected:
|
||||
bool executeInternal(Segment segment);
|
||||
public:
|
||||
FtpInitiateConnectionCommand(int cuid, Request* req, DownloadEngine* e);
|
||||
~FtpInitiateConnectionCommand();
|
||||
};
|
||||
|
||||
#endif // _D_FTP_INITIATE_CONNECTION_COMMAND_H_
|
|
@ -0,0 +1,328 @@
|
|||
/* <!-- copyright */
|
||||
/*
|
||||
* aria2 - a simple utility for downloading files faster
|
||||
*
|
||||
* Copyright (C) 2006 Tatsuhiro Tsujikawa
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
/* copyright --> */
|
||||
#include "FtpNegotiationCommand.h"
|
||||
#include "FtpDownloadCommand.h"
|
||||
#include "DlAbortEx.h"
|
||||
#include "message.h"
|
||||
|
||||
FtpNegotiationCommand::FtpNegotiationCommand(int cuid, Request* req, DownloadEngine* e, Socket* s):
|
||||
AbstractCommand(cuid, req, e, s),
|
||||
dataSocket(NULL), serverSocket(NULL), sequence(SEQ_RECV_GREETING)
|
||||
{
|
||||
ftp = new FtpConnection(cuid, socket, req, e->option, e->logger);
|
||||
setReadCheckSocket(NULL);
|
||||
setWriteCheckSocket(socket);
|
||||
}
|
||||
|
||||
FtpNegotiationCommand::~FtpNegotiationCommand() {
|
||||
if(dataSocket != NULL) {
|
||||
delete dataSocket;
|
||||
}
|
||||
if(serverSocket != NULL) {
|
||||
delete serverSocket;
|
||||
}
|
||||
delete ftp;
|
||||
}
|
||||
|
||||
bool FtpNegotiationCommand::executeInternal(Segment segment) {
|
||||
while(processSequence(segment));
|
||||
if(sequence == SEQ_RETRY) {
|
||||
return prepareForRetry(0);
|
||||
} else if(sequence == SEQ_NEGOTIATION_COMPLETED) {
|
||||
FtpDownloadCommand* command = new FtpDownloadCommand(cuid, req, e, dataSocket, socket);
|
||||
e->commands.push(command);
|
||||
return true;
|
||||
} else {
|
||||
e->commands.push(this);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool FtpNegotiationCommand::recvGreeting() {
|
||||
socket->setBlockingMode();
|
||||
int status = ftp->receiveResponse();
|
||||
if(status == 0) {
|
||||
return false;
|
||||
}
|
||||
if(status != 220) {
|
||||
throw new DlAbortEx(EX_CONNECTION_FAILED);
|
||||
}
|
||||
sequence = SEQ_SEND_USER;
|
||||
|
||||
setReadCheckSocket(socket);
|
||||
setWriteCheckSocket(NULL);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FtpNegotiationCommand::sendUser() {
|
||||
ftp->sendUser();
|
||||
sequence = SEQ_RECV_USER;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool FtpNegotiationCommand::recvUser() {
|
||||
int status = ftp->receiveResponse();
|
||||
switch(status) {
|
||||
case 0:
|
||||
return false;
|
||||
case 230:
|
||||
sequence = SEQ_SEND_TYPE;
|
||||
break;
|
||||
case 331:
|
||||
sequence = SEQ_SEND_PASS;
|
||||
break;
|
||||
default:
|
||||
throw new DlAbortEx(EX_BAD_STATUS, status);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FtpNegotiationCommand::sendPass() {
|
||||
ftp->sendPass();
|
||||
sequence = SEQ_RECV_PASS;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool FtpNegotiationCommand::recvPass() {
|
||||
int status = ftp->receiveResponse();
|
||||
if(status == 0) {
|
||||
return false;
|
||||
}
|
||||
if(status != 230) {
|
||||
throw new DlAbortEx(EX_BAD_STATUS, status);
|
||||
}
|
||||
sequence = SEQ_SEND_TYPE;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FtpNegotiationCommand::sendType() {
|
||||
ftp->sendType();
|
||||
sequence = SEQ_RECV_TYPE;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool FtpNegotiationCommand::recvType() {
|
||||
int status = ftp->receiveResponse();
|
||||
if(status == 0) {
|
||||
return false;
|
||||
}
|
||||
if(status != 200) {
|
||||
throw new DlAbortEx(EX_BAD_STATUS, status);
|
||||
}
|
||||
sequence = SEQ_SEND_CWD;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FtpNegotiationCommand::sendCwd() {
|
||||
ftp->sendCwd();
|
||||
sequence = SEQ_RECV_CWD;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool FtpNegotiationCommand::recvCwd() {
|
||||
int status = ftp->receiveResponse();
|
||||
if(status == 0) {
|
||||
return false;
|
||||
}
|
||||
if(status != 250) {
|
||||
throw new DlAbortEx(EX_BAD_STATUS, status);
|
||||
}
|
||||
sequence = SEQ_SEND_SIZE;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FtpNegotiationCommand::sendSize() {
|
||||
ftp->sendSize();
|
||||
sequence = SEQ_RECV_SIZE;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool FtpNegotiationCommand::recvSize() {
|
||||
long long int size = 0;
|
||||
int status = ftp->receiveSizeResponse(size);
|
||||
if(status == 0) {
|
||||
return false;
|
||||
}
|
||||
if(status != 213) {
|
||||
throw new DlAbortEx(EX_BAD_STATUS, status);
|
||||
}
|
||||
// TODO check the value of size
|
||||
if(!e->segmentMan->downloadStarted) {
|
||||
e->segmentMan->downloadStarted = true;
|
||||
e->segmentMan->totalSize = size;
|
||||
} else if(e->segmentMan->totalSize != size) {
|
||||
throw new DlAbortEx(EX_SIZE_MISMATCH, e->segmentMan->totalSize, size);
|
||||
}
|
||||
if(e->option->get("ftp_pasv_enabled") == "true") {
|
||||
sequence = SEQ_SEND_PASV;
|
||||
} else {
|
||||
sequence = SEQ_SEND_PORT;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FtpNegotiationCommand::sendPort() {
|
||||
serverSocket = ftp->sendPort();
|
||||
sequence = SEQ_RECV_PORT;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool FtpNegotiationCommand::recvPort() {
|
||||
int status = ftp->receiveResponse();
|
||||
if(status == 0) {
|
||||
return false;
|
||||
}
|
||||
if(status != 200) {
|
||||
throw new DlAbortEx(EX_BAD_STATUS, status);
|
||||
}
|
||||
sequence = SEQ_SEND_REST;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FtpNegotiationCommand::sendPasv() {
|
||||
ftp->sendPasv();
|
||||
sequence = SEQ_RECV_PASV;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool FtpNegotiationCommand::recvPasv() {
|
||||
pair<string, int> dest;
|
||||
int status = ftp->receivePasvResponse(dest);
|
||||
if(status == 0) {
|
||||
return false;
|
||||
}
|
||||
if(status != 227) {
|
||||
throw new DlAbortEx(EX_BAD_STATUS, status);
|
||||
}
|
||||
// make a data connection to the server.
|
||||
dataSocket = new Socket();
|
||||
|
||||
e->logger->info(MSG_CONNECTING_TO_SERVER, cuid,
|
||||
dest.first.c_str(),
|
||||
dest.second);
|
||||
dataSocket->establishConnection(dest.first, dest.second);
|
||||
|
||||
setReadCheckSocket(NULL);
|
||||
setWriteCheckSocket(dataSocket);
|
||||
|
||||
sequence = SEQ_SEND_REST_PASV;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool FtpNegotiationCommand::sendRestPasv(const Segment& segment) {
|
||||
dataSocket->setBlockingMode();
|
||||
setReadCheckSocket(socket);
|
||||
setWriteCheckSocket(NULL);
|
||||
return sendRest(segment);
|
||||
}
|
||||
|
||||
bool FtpNegotiationCommand::sendRest(const Segment& segment) {
|
||||
ftp->sendRest(segment);
|
||||
sequence = SEQ_RECV_REST;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool FtpNegotiationCommand::recvRest() {
|
||||
int status = ftp->receiveResponse();
|
||||
if(status == 0) {
|
||||
return false;
|
||||
}
|
||||
// TODO if we recieve negative response, then we set e->segmentMan->splittable = false, and continue.
|
||||
if(status != 350) {
|
||||
throw new DlAbortEx(EX_BAD_STATUS, status);
|
||||
}
|
||||
sequence = SEQ_SEND_RETR;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FtpNegotiationCommand::sendRetr() {
|
||||
ftp->sendRetr();
|
||||
sequence = SEQ_RECV_RETR;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool FtpNegotiationCommand::recvRetr() {
|
||||
int status = ftp->receiveResponse();
|
||||
if(status == 0) {
|
||||
return false;
|
||||
}
|
||||
if(status != 150) {
|
||||
throw new DlAbortEx(EX_BAD_STATUS, status);
|
||||
}
|
||||
if(e->option->get("ftp_pasv_enabled") != "true") {
|
||||
assert(serverSocket);
|
||||
dataSocket = serverSocket->acceptConnection();
|
||||
}
|
||||
sequence = SEQ_NEGOTIATION_COMPLETED;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool FtpNegotiationCommand::processSequence(const Segment& segment) {
|
||||
bool doNextSequence = true;
|
||||
switch(sequence) {
|
||||
case SEQ_RECV_GREETING:
|
||||
return recvGreeting();
|
||||
case SEQ_SEND_USER:
|
||||
return sendUser();
|
||||
case SEQ_RECV_USER:
|
||||
return recvUser();
|
||||
case SEQ_SEND_PASS:
|
||||
return sendPass();
|
||||
case SEQ_RECV_PASS:
|
||||
return recvPass();
|
||||
case SEQ_SEND_TYPE:
|
||||
return sendType();
|
||||
case SEQ_RECV_TYPE:
|
||||
return recvType();
|
||||
case SEQ_SEND_CWD:
|
||||
return sendCwd();
|
||||
case SEQ_RECV_CWD:
|
||||
return recvCwd();
|
||||
case SEQ_SEND_SIZE:
|
||||
return sendSize();
|
||||
case SEQ_RECV_SIZE:
|
||||
return recvSize();
|
||||
case SEQ_SEND_PORT:
|
||||
return sendPort();
|
||||
case SEQ_RECV_PORT:
|
||||
return recvPort();
|
||||
case SEQ_SEND_PASV:
|
||||
return sendPasv();
|
||||
case SEQ_RECV_PASV:
|
||||
return recvPasv();
|
||||
case SEQ_SEND_REST_PASV:
|
||||
return sendRestPasv(segment);
|
||||
case SEQ_SEND_REST:
|
||||
return sendRest(segment);
|
||||
case SEQ_RECV_REST:
|
||||
return recvRest();
|
||||
case SEQ_SEND_RETR:
|
||||
return sendRetr();
|
||||
case SEQ_RECV_RETR:
|
||||
return recvRetr();
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
return doNextSequence;
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
/* <!-- copyright */
|
||||
/*
|
||||
* aria2 - a simple utility for downloading files faster
|
||||
*
|
||||
* Copyright (C) 2006 Tatsuhiro Tsujikawa
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
/* copyright --> */
|
||||
#ifndef _D_FTP_NEGOTIATION_COMMAND_H_
|
||||
#define _D_FTP_NEGOTIATION_COMMAND_H_
|
||||
|
||||
#include "AbstractCommand.h"
|
||||
#include "FtpConnection.h"
|
||||
|
||||
class FtpNegotiationCommand : public AbstractCommand {
|
||||
private:
|
||||
enum Seq {
|
||||
SEQ_RECV_GREETING,
|
||||
SEQ_SEND_USER,
|
||||
SEQ_RECV_USER,
|
||||
SEQ_SEND_PASS,
|
||||
SEQ_RECV_PASS,
|
||||
SEQ_SEND_TYPE,
|
||||
SEQ_RECV_TYPE,
|
||||
SEQ_SEND_CWD,
|
||||
SEQ_RECV_CWD,
|
||||
SEQ_SEND_SIZE,
|
||||
SEQ_RECV_SIZE,
|
||||
SEQ_SEND_PORT,
|
||||
SEQ_RECV_PORT,
|
||||
SEQ_SEND_PASV,
|
||||
SEQ_RECV_PASV,
|
||||
SEQ_SEND_REST_PASV,
|
||||
SEQ_SEND_REST,
|
||||
SEQ_RECV_REST,
|
||||
SEQ_SEND_RETR,
|
||||
SEQ_RECV_RETR,
|
||||
SEQ_NEGOTIATION_COMPLETED,
|
||||
SEQ_RETRY
|
||||
};
|
||||
bool recvGreeting();
|
||||
bool sendUser();
|
||||
bool recvUser();
|
||||
bool sendPass();
|
||||
bool recvPass();
|
||||
bool sendType();
|
||||
bool recvType();
|
||||
bool sendCwd();
|
||||
bool recvCwd();
|
||||
bool sendSize();
|
||||
bool recvSize();
|
||||
bool sendPort();
|
||||
bool recvPort();
|
||||
bool sendPasv();
|
||||
bool recvPasv();
|
||||
bool sendRest(const Segment& segment);
|
||||
bool sendRestPasv(const Segment& segment);
|
||||
bool recvRest();
|
||||
bool sendRetr();
|
||||
bool recvRetr();
|
||||
bool processSequence(const Segment& segment);
|
||||
|
||||
Socket* dataSocket;
|
||||
Socket* serverSocket;
|
||||
int sequence;
|
||||
FtpConnection* ftp;
|
||||
protected:
|
||||
bool executeInternal(Segment segment);
|
||||
public:
|
||||
FtpNegotiationCommand(int cuid, Request* req, DownloadEngine* e, Socket* s);
|
||||
~FtpNegotiationCommand();
|
||||
};
|
||||
|
||||
#endif // _D_FTP_NEGOTIATION_COMMAND_H_
|
|
@ -0,0 +1,41 @@
|
|||
/* <!-- copyright */
|
||||
/*
|
||||
* aria2 - a simple utility for downloading files faster
|
||||
*
|
||||
* Copyright (C) 2006 Tatsuhiro Tsujikawa
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
/* copyright --> */
|
||||
#include "FtpTunnelRequestCommand.h"
|
||||
#include "FtpTunnelResponseCommand.h"
|
||||
#include "HttpConnection.h"
|
||||
|
||||
FtpTunnelRequestCommand::FtpTunnelRequestCommand(int cuid, Request* req, DownloadEngine* e, Socket* s):AbstractCommand(cuid, req, e, s) {
|
||||
setReadCheckSocket(NULL);
|
||||
setWriteCheckSocket(NULL);
|
||||
}
|
||||
|
||||
FtpTunnelRequestCommand::~FtpTunnelRequestCommand() {}
|
||||
|
||||
bool FtpTunnelRequestCommand::executeInternal(Segment segment) {
|
||||
socket->setBlockingMode();
|
||||
HttpConnection httpConnection(cuid, socket, req, e->option, e->logger);
|
||||
httpConnection.sendProxyRequest();
|
||||
|
||||
FtpTunnelResponseCommand* command = new FtpTunnelResponseCommand(cuid, req, e, socket);
|
||||
e->commands.push(command);
|
||||
return true;
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
/* <!-- copyright */
|
||||
/*
|
||||
* aria2 - a simple utility for downloading files faster
|
||||
*
|
||||
* Copyright (C) 2006 Tatsuhiro Tsujikawa
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
/* copyright --> */
|
||||
#ifndef _D_FTP_TUNNEL_REQUEST_COMMAND_H_
|
||||
#define _D_FTP_TUNNEL_REQUEST_COMMAND_H_
|
||||
|
||||
#include "AbstractCommand.h"
|
||||
|
||||
class FtpTunnelRequestCommand : public AbstractCommand {
|
||||
protected:
|
||||
bool executeInternal(Segment segment);
|
||||
public:
|
||||
FtpTunnelRequestCommand(int cuid, Request* req, DownloadEngine* e, Socket* s);
|
||||
~FtpTunnelRequestCommand();
|
||||
};
|
||||
|
||||
#endif // _D_FTP_TUNNEL_REQUEST_COMMAND_H_
|
|
@ -0,0 +1,49 @@
|
|||
/* <!-- copyright */
|
||||
/*
|
||||
* aria2 - a simple utility for downloading files faster
|
||||
*
|
||||
* Copyright (C) 2006 Tatsuhiro Tsujikawa
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
/* copyright --> */
|
||||
#include "FtpTunnelResponseCommand.h"
|
||||
#include "FtpNegotiationCommand.h"
|
||||
#include "DlRetryEx.h"
|
||||
#include "message.h"
|
||||
|
||||
FtpTunnelResponseCommand::FtpTunnelResponseCommand(int cuid, Request* req, DownloadEngine* e, Socket* s):AbstractCommand(cuid, req, e, s) {
|
||||
http = new HttpConnection(cuid, socket, req, e->option, e->logger);
|
||||
}
|
||||
|
||||
FtpTunnelResponseCommand::~FtpTunnelResponseCommand() {
|
||||
delete http;
|
||||
}
|
||||
|
||||
bool FtpTunnelResponseCommand::executeInternal(Segment segment) {
|
||||
HttpHeader headers;
|
||||
int status = http->receiveResponse(headers);
|
||||
if(status == 0) {
|
||||
// we didn't receive all of headers yet.
|
||||
e->commands.push(this);
|
||||
return false;
|
||||
}
|
||||
if(status != 200) {
|
||||
throw new DlRetryEx(EX_PROXY_CONNECTION_FAILED);
|
||||
}
|
||||
FtpNegotiationCommand* command = new FtpNegotiationCommand(cuid, req, e, socket);
|
||||
e->commands.push(command);
|
||||
return true;
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
/* <!-- copyright */
|
||||
/*
|
||||
* aria2 - a simple utility for downloading files faster
|
||||
*
|
||||
* Copyright (C) 2006 Tatsuhiro Tsujikawa
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
/* copyright --> */
|
||||
#ifndef _D_FTP_TUNNEL_RESPONSE_COMMAND_H_
|
||||
#define _D_FTP_TUNNEL_RESPONSE_COMMAND_H_
|
||||
|
||||
#include "AbstractCommand.h"
|
||||
#include "HttpConnection.h"
|
||||
|
||||
class FtpTunnelResponseCommand : public AbstractCommand {
|
||||
private:
|
||||
HttpConnection* http;
|
||||
protected:
|
||||
bool executeInternal(Segment segment);
|
||||
public:
|
||||
FtpTunnelResponseCommand(int cuid, Request* req, DownloadEngine* e, Socket* s);
|
||||
~FtpTunnelResponseCommand();
|
||||
};
|
||||
|
||||
#endif // _D_FTP_TUNNEL_RESPONSE_COMMAND_H_
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
/* <!-- copyright */
|
||||
/*
|
||||
* aria2 - a simple utility for downloading files faster
|
||||
*
|
||||
* Copyright (C) 2006 Tatsuhiro Tsujikawa
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
/* copyright --> */
|
||||
#include "HttpHeader.h"
|
||||
|
||||
void HttpHeader::put(const string& name, const string& value) {
|
||||
multimap<string, string>::value_type vt(name, value);
|
||||
table.insert(vt);
|
||||
}
|
||||
|
||||
bool HttpHeader::defined(const string& name) const {
|
||||
return table.count(name) == 1;
|
||||
}
|
||||
|
||||
string HttpHeader::getFirst(const string& name) const {
|
||||
multimap<string, string>::const_iterator itr = table.find(name);
|
||||
if(itr == table.end()) {
|
||||
return "";
|
||||
} else {
|
||||
return (*itr).second;
|
||||
}
|
||||
}
|
||||
|
||||
vector<string> HttpHeader::get(const string& name) const {
|
||||
vector<string> v;
|
||||
for(multimap<string, string>::const_iterator itr = table.find(name); itr != table.end(); itr++) {
|
||||
v.push_back((*itr).second);
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
int HttpHeader::getFirstAsInt(const string& name) const {
|
||||
multimap<string, string>::const_iterator itr = table.find(name);
|
||||
if(itr == table.end()) {
|
||||
return 0;
|
||||
} else {
|
||||
return (int)strtol((*itr).second.c_str(), NULL, 10);
|
||||
}
|
||||
}
|
||||
|
||||
long long int HttpHeader::getFirstAsLLInt(const string& name) const {
|
||||
multimap<string, string>::const_iterator itr = table.find(name);
|
||||
if(itr == table.end()) {
|
||||
return 0;
|
||||
} else {
|
||||
return strtoll((*itr).second.c_str(), NULL, 10);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
/* <!-- copyright */
|
||||
/*
|
||||
* aria2 - a simple utility for downloading files faster
|
||||
*
|
||||
* Copyright (C) 2006 Tatsuhiro Tsujikawa
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
/* copyright --> */
|
||||
#ifndef _D_HTTP_HEADER_H_
|
||||
#define _D_HTTP_HEADER_H_
|
||||
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
using namespace std;
|
||||
|
||||
class HttpHeader {
|
||||
private:
|
||||
multimap<string, string> table;
|
||||
public:
|
||||
HttpHeader() {}
|
||||
~HttpHeader() {}
|
||||
|
||||
void put(const string& name, const string& value);
|
||||
bool defined(const string& name) const;
|
||||
string getFirst(const string& name) const;
|
||||
vector<string> get(const string& name) const;
|
||||
int getFirstAsInt(const string& name) const;
|
||||
long long int getFirstAsLLInt(const string& name) const;
|
||||
};
|
||||
|
||||
#endif // _D_HTTP_HEADER_H_
|
Loading…
Reference in New Issue