summaryrefslogtreecommitdiff
path: root/src/modules/httpd.h
diff options
context:
space:
mode:
authorspecial <special@e03df62e-2008-0410-955e-edbf42e46eb7>2007-08-19 11:03:27 +0000
committerspecial <special@e03df62e-2008-0410-955e-edbf42e46eb7>2007-08-19 11:03:27 +0000
commit05c95857273e6c68ca05ee786948c455ac7d3d39 (patch)
tree9dbfd12c93bc6aef66c13f552e83f3f7fe93783e /src/modules/httpd.h
parentbb1b08b0354620fad367c79471c99d7a836dc6e9 (diff)
Added proper header handling, persistant connections, and working timeouts to m_httpd
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@7743 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/modules/httpd.h')
-rw-r--r--src/modules/httpd.h105
1 files changed, 82 insertions, 23 deletions
diff --git a/src/modules/httpd.h b/src/modules/httpd.h
index a8b0bafcd..0b3b6fa81 100644
--- a/src/modules/httpd.h
+++ b/src/modules/httpd.h
@@ -18,6 +18,81 @@
#include <string>
#include <sstream>
+#include <map>
+
+/** A modifyable list of HTTP header fields
+ */
+class HTTPHeaders
+{
+ protected:
+ std::map<std::string,std::string> 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<std::string,std::string>::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<std::string,std::string>::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<std::string,std::string>::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
@@ -26,15 +101,15 @@
class HTTPRequest : public classbase
{
protected:
-
std::string type;
std::string document;
std::string ipaddr;
std::string postdata;
- std::stringstream* headers;
-
+
public:
+ HTTPHeaders *headers;
+
/** A socket pointer, which you must return in your HTTPDocument class
* if you reply to this request.
*/
@@ -49,20 +124,11 @@ class HTTPRequest : public classbase
* @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, const std::string &pdata)
+ 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
- */
- std::stringstream* GetHeaders()
- {
- return headers;
- }
-
/** Get the post data (request content).
* All post data will be returned, including carriage returns and linefeeds.
* @return The postdata
@@ -110,10 +176,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;
@@ -125,7 +192,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)
{
}
@@ -152,14 +219,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