summaryrefslogtreecommitdiffstats
path: root/source/HTTPServer/HTTPMessage.h
diff options
context:
space:
mode:
Diffstat (limited to 'source/HTTPServer/HTTPMessage.h')
-rw-r--r--source/HTTPServer/HTTPMessage.h121
1 files changed, 121 insertions, 0 deletions
diff --git a/source/HTTPServer/HTTPMessage.h b/source/HTTPServer/HTTPMessage.h
new file mode 100644
index 000000000..a3c4f96d1
--- /dev/null
+++ b/source/HTTPServer/HTTPMessage.h
@@ -0,0 +1,121 @@
+
+// HTTPMessage.h
+
+// Declares the cHTTPMessage class representing the common ancestor for HTTP request and response classes
+
+
+
+
+
+#pragma once
+
+
+
+
+
+class cHTTPMessage
+{
+public:
+ enum
+ {
+ HTTP_OK = 200,
+ HTTP_BAD_REQUEST = 400,
+ } ;
+
+ enum eKind
+ {
+ mkRequest,
+ mkResponse,
+ } ;
+
+ cHTTPMessage(eKind a_Kind);
+
+ /// Adds a header into the internal map of headers. Recognizes special headers: Content-Type and Content-Length
+ void AddHeader(const AString & a_Key, const AString & a_Value);
+
+ void SetContentType (const AString & a_ContentType) { m_ContentType = a_ContentType; }
+ void SetContentLength(int a_ContentLength) { m_ContentLength = a_ContentLength; }
+
+ const AString & GetContentType (void) const { return m_ContentType; }
+ int GetContentLength(void) const { return m_ContentLength; }
+
+protected:
+ typedef std::map<AString, AString> cNameValueMap;
+
+ eKind m_Kind;
+
+ cNameValueMap m_Headers;
+
+ /// Type of the content; parsed by AddHeader(), set directly by SetContentLength()
+ AString m_ContentType;
+
+ /// Length of the content that is to be received. -1 when the object is created, parsed by AddHeader() or set directly by SetContentLength()
+ int m_ContentLength;
+} ;
+
+
+
+
+
+class cHTTPRequest :
+ public cHTTPMessage
+{
+ typedef cHTTPMessage super;
+
+public:
+ cHTTPRequest(void);
+
+ /// Parses the headers information from the received data in the specified string of incoming data. Returns true if successful.
+ bool ParseHeaders(const char * a_IncomingData, size_t a_idxEnd);
+
+ /// Returns true if the request did contain a Content-Length header
+ bool HasReceivedContentLength(void) const { return (m_ContentLength >= 0); }
+
+protected:
+ /// Method of the request (GET / PUT / POST / ...)
+ AString m_Method;
+
+ /// Full URL of the request
+ AString m_URL;
+
+ /// Number of bytes that remain to read for the complete body of the message to be received
+ int m_BodyRemaining;
+
+ /** Parses the RequestLine out of a_Data, up to index a_IdxEnd
+ Returns the index to the next line, or npos if invalid request
+ */
+ size_t ParseRequestLine(const char * a_Data, size_t a_IdxEnd);
+
+ /** Parses one header field out of a_Data, up to offset a_IdxEnd.
+ Returns the index to the next line (relative to a_Data), or npos if invalid request.
+ a_Key is set to the key that was parsed (used for multi-line headers)
+ */
+ size_t ParseHeaderField(const char * a_Data, size_t a_IdxEnd, AString & a_Key);
+
+ /** Parses one header field that is known to be a continuation of previous header.
+ Returns the index to the next line, or npos if invalid request.
+ */
+ size_t ParseHeaderFieldContinuation(const char * a_Data, size_t a_IdxEnd, AString & a_Key);
+} ;
+
+
+
+
+
+class cHTTPResponse :
+ public cHTTPMessage
+{
+ typedef cHTTPMessage super;
+
+public:
+ cHTTPResponse(void);
+
+ /** Appends the response to the specified datastream - response line and headers.
+ The body will be sent later directly through cConnection::Send()
+ */
+ void AppendToData(AString & a_DataStream) const;
+} ;
+
+
+
+