/* */ #ifndef D_HTTP_SERVER_H #define D_HTTP_SERVER_H #include "common.h" #include #include #include #include "SharedHandle.h" #include "SocketBuffer.h" namespace aria2 { class SocketCore; class HttpHeader; class HttpHeaderProcessor; class DownloadEngine; class SocketRecvBuffer; class DiskWriter; enum RequestType { RPC_TYPE_NONE, RPC_TYPE_XML, RPC_TYPE_JSON, RPC_TYPE_JSONP }; // HTTP server class handling RPC request from the client. It is not // intended to be a generic HTTP server. class HttpServer { private: SharedHandle socket_; SharedHandle socketRecvBuffer_; SocketBuffer socketBuffer_; DownloadEngine* e_; SharedHandle headerProcessor_; SharedHandle lastRequestHeader_; int64_t lastContentLength_; // How many bytes are consumed. The total number of bytes is // lastContentLength_. int64_t bodyConsumed_; RequestType reqType_; SharedHandle lastBody_; bool keepAlive_; bool gzip_; std::string username_; std::string password_; bool acceptsPersistentConnection_; bool acceptsGZip_; std::string allowOrigin_; public: HttpServer(const SharedHandle& socket, DownloadEngine* e); ~HttpServer(); SharedHandle receiveRequest(); bool receiveBody(); const std::string& getMethod() const; const std::string& getRequestPath() const; int setupResponseRecv(); std::string createPath() const; std::string createQuery() const; const SharedHandle& getBody() const { return lastBody_; } RequestType getRequestType() const { return reqType_; } void feedResponse(std::string& text, const std::string& contentType); // Feeds HTTP response with the status code |status| (e.g., // 200). The |headers| is zero or more lines of HTTP header field // and each line must end with "\r\n". The |text| is the response // body. The |contentType" is the content-type of the response body. void feedResponse(int status, const std::string& headers = "", const std::string& text = "", const std::string& contentType = ""); // Feeds "101 Switching Protocols" response. The |protocol| will // appear in Upgrade header field. The |headers| is zero or more // lines of HTTP header field and each line must end with "\r\n". void feedUpgradeResponse(const std::string& protocol, const std::string& headers); bool authenticate(); void setUsernamePassword (const std::string& username, const std::string& password); ssize_t sendResponse(); bool sendBufferIsEmpty() const; bool supportsPersistentConnection() const { return keepAlive_ && acceptsPersistentConnection_; } bool supportsGZip() const { return gzip_ && acceptsGZip_; } void enableKeepAlive() { keepAlive_ = true; } void disableKeepAlive() { keepAlive_ = false; } void enableGZip() { gzip_ = true; } void disableGZip() { gzip_ = false; } int64_t getContentLength() const { return lastContentLength_; } const SharedHandle& getSocketRecvBuffer() const { return socketRecvBuffer_; } const std::string& getAllowOrigin() const { return allowOrigin_; } void setAllowOrigin(const std::string& allowOrigin) { allowOrigin_ = allowOrigin; } const SharedHandle& getSocket() const { return socket_; } const SharedHandle& getRequestHeader() const { return lastRequestHeader_; } }; } // namespace aria2 #endif // D_HTTP_SERVER_H