diff --git a/ChangeLog b/ChangeLog index 568e1559..59b2250a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,10 @@ unregister its cuid from SegmentMan. * DownloadEngine.cc: .aria2 file was written when a downloading failed with errors. + * HttpConnection.cc: Added "Proxy-Connection" header to proxy request. + Added "User-Agent" header to CONNECT proxy request. + Fixed "Proxy-Authorization" header. Now proxy authorization works + properly. 2006-02-28 Tatsuhiro Tsujikawa diff --git a/src/HttpConnection.cc b/src/HttpConnection.cc index 815975d2..3c5b3c97 100644 --- a/src/HttpConnection.cc +++ b/src/HttpConnection.cc @@ -39,6 +39,8 @@ void HttpConnection::sendProxyRequest() const { string request = string("CONNECT ")+req->getHost()+":"+Util::llitos(req->getPort())+ string(" HTTP/1.1\r\n")+ + "User-Agent: aria2\r\n"+ + "Proxy-Connection: close\r\n"+ "Host: "+getHost(req->getHost(), req->getPort())+"\r\n"; if(useProxyAuth()) { request += getProxyAuthString(); @@ -51,7 +53,7 @@ void HttpConnection::sendProxyRequest() const { string HttpConnection::getProxyAuthString() const { return "Proxy-Authorization: Basic "+ Base64::encode(option->get(PREF_HTTP_PROXY_USER)+":"+ - option->get(PREF_HTTP_PROXY_PORT))+"\r\n"; + option->get(PREF_HTTP_PROXY_PASSWD))+"\r\n"; } string HttpConnection::getHost(const string& host, int port) const { @@ -75,6 +77,7 @@ string HttpConnection::createRequest(const Segment& segment) const { Util::llitos(segment.sp+segment.ds)+"-"+Util::llitos(segment.ep)+"\r\n"; } if(useProxy() && useProxyAuth() && useProxyGet()) { + request += "Proxy-Connection: close\r\n"; request += getProxyAuthString(); } if(option->get(PREF_HTTP_AUTH_SCHEME) == V_BASIC) { diff --git a/src/Socket.h b/src/Socket.h index ea895dc5..d49ef953 100644 --- a/src/Socket.h +++ b/src/Socket.h @@ -30,8 +30,10 @@ using namespace std; class Socket { private: - // socket endpoint descriptor SocketCore* core; + /** + * This method doesn't increment the use count of core. + */ Socket(SocketCore* core); public: Socket(); @@ -40,51 +42,74 @@ public: Socket& operator=(const Socket& s); + /** + * Returns socket descriptor of this socket. + * @returns socket descriptor of this socket. + */ int getSockfd() const { return core->sockfd; } + /** + * @see SocketCore::beginListen() + */ void beginListen() const; + + /** + * @see SocketCore::getAddrInfo() + */ void getAddrInfo(pair& addrinfo) const; + + /** + * @see SocketCore::acceptConnection() + */ Socket* acceptConnection() const; /** - * Connects to the server named host and the destination port is port. - * This method make socket non-blocking mode. - * To make the socket blocking mode, call setBlockingMode() after - * the connection is established. + * @see SocketCore::establishConnection() */ void establishConnection(string host, int port) const; + /** + * @see SocketCore::setBlockingMode() + */ void setBlockingMode() const; - // Closes the connection which this socket object has + /** + * @see SocketCore::closeConnection() + */ void closeConnection() const; - // examines whether the socket of this Socket object is available for writing. - // returns true if the socket is available for writing, otherwise returns false. + /** + * @see SocketCore::isWritable() + */ bool isWritable(int timeout) const; - // examines whether the socket of this Socket object is available for reading. - // returns true if the socket is available for reading, otherwise returns false. + /** + * @see SocketCore::isReadable() + */ bool isReadable(int timeout) const; - // writes characters into the socket. data is a pointer pointing the first - // byte of the data and len is the length of the data. + /** + * @see SocketCore::writeData() + */ void writeData(const char* data, int len, int timeout = 5) const; + /** + * A covenient function that can take string class parameter and + * internally calls SocketCore::writeData(). + */ void writeData(string str, int timeout = 5) const; - // Reads up to len bytes from this socket. - // data is a pointer pointing the first - // byte of the data, which must be allocated before this method is called. - // len is the size of the allocated memory. When this method returns - // successfully, len is replaced by the size of the read data. + /** + * @see SocketCore::readData() + */ void readData(char* data, int& len, int timeout = 5) const; - // Reads up to len bytes from this socket, but bytes are not removed from - // this socket. + + /** + * @see SocketCore::peekData() + */ void peekData(char* data, int& len, int timeout = 5) const; /** - * Makes this socket secure. - * If the system has not OpenSSL, then this method do nothing. + * @see SocketCore::initiateSecureConnection() */ void initiateSecureConnection() const; }; diff --git a/src/SocketCore.h b/src/SocketCore.h index a6b7d3f8..3c09da60 100644 --- a/src/SocketCore.h +++ b/src/SocketCore.h @@ -52,47 +52,107 @@ public: SocketCore(); ~SocketCore(); + /** + * Creates a socket and listens form connection on it. + */ void beginListen(); + + /** + * Stores host address and port of this socket to addrinfo. + * @param addrinfo placeholder to store host address and port. + */ void getAddrInfo(pair& addrinfo) const; + + /** + * Accepts incoming connection on this socket. + * You must call beginListen() before calling this method. + * @return accepted socket. The caller must delete it after using it. + */ SocketCore* acceptConnection() const; + /** * Connects to the server named host and the destination port is port. - * This method make socket non-blocking mode. - * To make the socket blocking mode, call setBlockingMode() after + * This method makes socket non-blocking mode. + * To make the socket blocking mode again, call setBlockingMode() after * the connection is established. + * @param host hostname or ip address to connect to + * @param port service port number to connect to */ void establishConnection(string host, int port); + /** + * Makes this socket blocking mode. + */ void setBlockingMode() const; - // Closes the connection which this socket object has + /** + * Closes the connection of this socket. + */ void closeConnection(); - // examines whether the socket of this SocketCore object is available for writing. - // returns true if the socket is available for writing, otherwise returns false. + /** + * Checks whether this socket is available for writing. + * @param timeout the amount of time elapsed before the checking are timed + * out. + * @return true if the socket is available for writing, + * otherwise returns false. + */ bool isWritable(int timeout) const; - // examines whether the socket of this SocketCore object is available for reading. - // returns true if the socket is available for reading, otherwise returns false. + /** + * Checks whether this socket is available for reading. + * @param timeout the amount of time elapsed before the checking are timed + * out. + * @return true if the socket is available for reading, + * otherwise returns false. + */ bool isReadable(int timeout) const; - // writes characters into the socket. data is a pointer pointing the first - // byte of the data and len is the length of the data. + /** + * Writes characters into this socket. data is a pointer pointing the first + * byte of the data and len is the length of data. + * This method internally calls isWritable(). The parmeter timeout is used + * for this method call. + * @param data data to write + * @param len length of data + * @param timeout the amount of time elapsed before isWritable() + * are timed out. + */ void writeData(const char* data, int len, int timeout = 5) const; - // Reads up to len bytes from this socket. - // data is a pointer pointing the first - // byte of the data, which must be allocated before this method is called. - // len is the size of the allocated memory. When this method returns - // successfully, len is replaced by the size of the read data. + /** + * Reads up to len bytes from this socket. + * data is a pointer pointing the first + * byte of the data, which must be allocated before this method is called. + * len is the size of the allocated memory. When this method returns + * successfully, len is replaced by the size of the read data. + * This method internally calls isReadable(). The parameter timeout is used + * for this method call. + * @param data holder to store data. + * @param len the maximum size data can store. This method assigns + * the number of bytes read to len. + * @param timeout the amount of time elapsed before isReadable() are timed + * out. + */ void readData(char* data, int& len, int timeout = 5) const; - // Reads up to len bytes from this socket, but bytes are not removed from - // this socket. + + /** + * Reads up to len bytes from this socket, but bytes are not removed from + * this socket. + * This method internally calls isReadable(). The parameter timeout is used + * for this method call. + * @param data holder to store data. + * @param len the maximum size data can store. This method assigns + * the number of bytes read to len. + * @param timeout the amount of time elapsed before isReadable() are timed + * out. + */ void peekData(char* data, int& len, int timeout = 5) const; /** * Makes this socket secure. * If the system has not OpenSSL, then this method do nothing. + * connection must be established before calling this method. */ void initiateSecureConnection() ; };