X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fhttpd.h;h=2d8da2cbdb81b4f1f3d0264942d5835eff5189ba;hb=697098bb47651b40ed9c768361d1a3b1ca452856;hp=565648659e7268e36f07cd5203008a70161718df;hpb=1bbc0066e98d213775218651db2fe92a54709143;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/httpd.h b/src/modules/httpd.h index 565648659..2d8da2cbd 100644 --- a/src/modules/httpd.h +++ b/src/modules/httpd.h @@ -1,3 +1,16 @@ +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2008 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + #include "base.h" #ifndef __HTTPD_H__ @@ -5,6 +18,81 @@ #include #include +#include + +/** A modifyable list of HTTP header fields + */ +class HTTPHeaders : public classbase +{ + protected: + std::map headers; + public: + + /** Set the value of a header + * Sets the value of the named header. If the header is already present, it will be replaced + */ + void SetHeader(const std::string &name, const std::string &data) + { + headers[name] = data; + } + + /** Set the value of a header, only if it doesn't exist already + * Sets the value of the named header. If the header is already present, it will NOT be updated + */ + void CreateHeader(const std::string &name, const std::string &data) + { + if (!IsSet(name)) + SetHeader(name, data); + } + + /** Remove the named header + */ + void RemoveHeader(const std::string &name) + { + headers.erase(name); + } + + /** Remove all headers + */ + void Clear() + { + headers.clear(); + } + + /** Get the value of a header + * @return The value of the header, or an empty string + */ + std::string GetHeader(const std::string &name) + { + std::map::iterator it = headers.find(name); + if (it == headers.end()) + return std::string(); + + return it->second; + } + + /** Check if the given header is specified + * @return true if the header is specified + */ + bool IsSet(const std::string &name) + { + std::map::iterator it = headers.find(name); + return (it != headers.end()); + } + + /** Get all headers, formatted by the HTTP protocol + * @return Returns all headers, formatted according to the HTTP protocol. There is no request terminator at the end + */ + std::string GetFormattedHeaders() + { + std::string re; + + for (std::map::iterator i = headers.begin(); i != headers.end(); i++) + re += i->first + ": " + i->second + "\r\n"; + + return re; + } +}; /** This class represents a HTTP request. * It will be sent to all modules as the data section of @@ -13,14 +101,16 @@ class HTTPRequest : public classbase { protected: - std::string type; std::string document; std::string ipaddr; - std::stringstream* headers; + std::string postdata; public: + HTTPHeaders *headers; + int errorcode; + /** A socket pointer, which you must return in your HTTPDocument class * if you reply to this request. */ @@ -33,19 +123,20 @@ class HTTPRequest : public classbase * @param hdr The headers sent with the request * @param opaque An opaque pointer used internally by m_httpd, which you must pass back to the module in your reply. * @param ip The IP address making the web request. + * @param pdata The post data (content after headers) received with the request, up to Content-Length in size */ - HTTPRequest(const std::string &request_type, const std::string &uri, std::stringstream* hdr, void* opaque, const std::string &ip) - : type(request_type), document(uri), ipaddr(ip), headers(hdr), sock(opaque) + HTTPRequest(const std::string &request_type, const std::string &uri, HTTPHeaders* hdr, void* opaque, const std::string &ip, const std::string &pdata) + : type(request_type), document(uri), ipaddr(ip), postdata(pdata), headers(hdr), sock(opaque) { } - /** Get headers. - * All the headers for the web request are returned, as a pointer to a stringstream. - * @return The header information + /** Get the post data (request content). + * All post data will be returned, including carriage returns and linefeeds. + * @return The postdata */ - std::stringstream* GetHeaders() + std::string& GetPostData() { - return headers; + return postdata; } /** Get the request type. @@ -86,10 +177,11 @@ class HTTPDocument : public classbase std::stringstream* document; int responsecode; - std::string extraheaders; public: + HTTPHeaders headers; + /** The socket pointer from an earlier HTTPRequest */ void* sock; @@ -101,7 +193,7 @@ class HTTPDocument : public classbase * based upon the response code. * @param extra Any extra headers to include with the defaults, seperated by carriage return and linefeed. */ - HTTPDocument(void* opaque, std::stringstream* doc, int response, const std::string &extra) : document(doc), responsecode(response), extraheaders(extra), sock(opaque) + HTTPDocument(void* opaque, std::stringstream* doc, int response) : document(doc), responsecode(response), sock(opaque) { } @@ -128,14 +220,6 @@ class HTTPDocument : public classbase { return this->responsecode; } - - /** Get the headers. - * @return The header text, headers seperated by carriage return and linefeed. - */ - std::string& GetExtraHeaders() - { - return this->extraheaders; - } }; #endif