summaryrefslogtreecommitdiff
path: root/public/gcsdk/http.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/gcsdk/http.h')
-rw-r--r--public/gcsdk/http.h228
1 files changed, 228 insertions, 0 deletions
diff --git a/public/gcsdk/http.h b/public/gcsdk/http.h
new file mode 100644
index 0000000..b766ca2
--- /dev/null
+++ b/public/gcsdk/http.h
@@ -0,0 +1,228 @@
+//====== Copyright � 1996-2010, Valve Corporation, All rights reserved. =======
+//
+// Purpose: HTTP related enums and objects, stuff that both clients and server use should go here
+//
+//=============================================================================
+
+#ifndef HTTP_H
+#define HTTP_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "steam/steamhttpenums.h"
+#include "tier1/KeyValues.h"
+#include "tier1/netadr.h"
+#include "gcsdk/bufferpool.h"
+
+class CMsgHttpRequest;
+class CMsgHttpResponse;
+#include "tier0/memdbgon.h"
+
+namespace GCSDK
+{
+
+// Container class for useful parsing methods and other utility code used by client or server http code
+class CHTTPUtil
+{
+public:
+ // Check if a status code allows a body to exist
+ static bool BStatusCodeAllowsBody( EHTTPStatusCode eHTTPStatus );
+
+};
+
+
+class CHTTPRequest;
+class CHTTPResponse;
+class CHTTPServerClientConnection;
+
+class CHTTPRequest
+{
+public:
+
+ CHTTPRequest();
+ CHTTPRequest( CMsgHttpRequest* pProto );
+ CHTTPRequest( EHTTPMethod eMethod, const char *pchHost, const char *pchRelativeURL );
+ CHTTPRequest( EHTTPMethod eMethod, const char *pchAbsoluteURL );
+ ~CHTTPRequest();
+
+ // Get the method type for the request (ie, GET, POST, etc)
+ EHTTPMethod GetEHTTPMethod() const { return ( EHTTPMethod )m_pProto->request_method(); }
+
+ // Get the relative URL for the request
+ const char *GetURL() const { return m_pProto->url().c_str(); }
+
+ // Get the value of a GET parameter, using the default value if not set. This is case-insensitive by default.
+ const CMsgHttpRequest_QueryParam *GetGETParam( const char *pchGetParamName, bool bMatchCase = false ) const;
+ const char *GetGETParamString( const char *pchGetParamName, const char *pchDefault, bool bMatchCase = false ) const;
+ bool GetGETParamBool( const char *pchGetParamName, bool bDefault, bool bMatchCase = false ) const;
+ int32 GetGETParamInt32( const char *pchGetParamName, int32 nDefault, bool bMatchCase = false ) const;
+ uint32 GetGETParamUInt32( const char *pchGetParamName, uint32 unDefault, bool bMatchCase = false ) const;
+ int64 GetGETParamInt64( const char *pchGetParamName, int64 nDefault, bool bMatchCase = false ) const;
+ uint64 GetGETParamUInt64( const char *pchGetParamName, uint64 unDefault, bool bMatchCase = false ) const;
+ float GetGETParamFloat( const char *pchGetParamName, float fDefault, bool bMatchCase = false ) const;
+
+
+ // Get the value of a POST parameter, using the default value if not set. This is case-insensitive by default.
+ const CMsgHttpRequest_QueryParam *GetPOSTParam( const char *pchPostParamName, bool bMatchCase = false ) const;
+ const char *GetPOSTParamString( const char *pchGetParamName, const char *pchDefault, bool bMatchCase = false ) const;
+ bool GetPOSTParamBool( const char *pchGetParamName, bool bDefault, bool bMatchCase = false ) const;
+ int32 GetPOSTParamInt32( const char *pchGetParamName, int32 nDefault, bool bMatchCase = false ) const;
+ uint32 GetPOSTParamUInt32( const char *pchGetParamName, uint32 unDefault, bool bMatchCase = false ) const;
+ int64 GetPOSTParamInt64( const char *pchGetParamName, int64 nDefault, bool bMatchCase = false ) const;
+ uint64 GetPOSTParamUInt64( const char *pchGetParamName, uint64 unDefault, bool bMatchCase = false ) const;
+ float GetPOSTParamFloat( const char *pchGetParamName, float fDefault, bool bMatchCase = false ) const;
+
+ // Add a GET param to the request
+ void SetGETParamString( const char *pchGetParamName, const char *pString ) { SetGETParamRaw( pchGetParamName, (uint8*)pString, Q_strlen(pString) ); }
+ void SetGETParamBool( const char *pchPostParamName, bool bValue ) { SetGETParamRaw( pchPostParamName, (uint8*)(bValue ? "1" : "0"), 1 ); }
+ void SetGETParamInt32( const char *pchPostParamName, int32 nValue ) { CNumStr str( nValue ); SetGETParamRaw( pchPostParamName, (uint8*)str.String(), Q_strlen( str ) ); }
+ void SetGETParamUInt32( const char *pchPostParamName, uint32 unValue ) { CNumStr str( unValue ); SetGETParamRaw( pchPostParamName, (uint8*)str.String(), Q_strlen( str ) ); }
+ void SetGETParamInt64( const char *pchPostParamName, int64 nValue ) { CNumStr str( nValue ); SetGETParamRaw( pchPostParamName, (uint8*)str.String(), Q_strlen( str ) ); }
+ void SetGETParamUInt64( const char *pchPostParamName, uint64 unValue ) { CNumStr str( unValue ); SetGETParamRaw( pchPostParamName, (uint8*)str.String(), Q_strlen( str ) ); }
+ void SetGETParamFloat( const char *pchPostParamName, float fValue ) { CNumStr str( fValue ); SetGETParamRaw( pchPostParamName, (uint8*)str.String(), Q_strlen( str ) ); }
+
+ // Add a POST param to the request given a string for the name and value
+ void SetPOSTParamString( const char *pchPostParamName, const char *pString ) { SetPOSTParamRaw( pchPostParamName, (uint8*)pString, Q_strlen(pString) ); }
+ void SetPOSTParamBool( const char *pchPostParamName, bool bValue ) { SetPOSTParamRaw( pchPostParamName, (uint8*)(bValue ? "1" : "0"), 1 ); }
+ void SetPOSTParamInt32( const char *pchPostParamName, int32 nValue ) { CNumStr str( nValue ); SetPOSTParamRaw( pchPostParamName, (uint8*)str.String(), Q_strlen( str ) ); }
+ void SetPOSTParamUInt32( const char *pchPostParamName, uint32 unValue ) { CNumStr str( unValue ); SetPOSTParamRaw( pchPostParamName, (uint8*)str.String(), Q_strlen( str ) ); }
+ void SetPOSTParamInt64( const char *pchPostParamName, int64 nValue ) { CNumStr str( nValue ); SetPOSTParamRaw( pchPostParamName, (uint8*)str.String(), Q_strlen( str ) ); }
+ void SetPOSTParamUInt64( const char *pchPostParamName, uint64 unValue ) { CNumStr str( unValue ); SetPOSTParamRaw( pchPostParamName, (uint8*)str.String(), Q_strlen( str ) ); }
+ void SetPOSTParamFloat( const char *pchPostParamName, float fValue ) { CNumStr str( fValue ); SetPOSTParamRaw( pchPostParamName, (uint8*)str.String(), Q_strlen( str ) ); }
+
+ // Adds a POST param containing raw data to the request. If you are using the Web API, you probably do not want this function
+ void SetPOSTParamRaw( const char *pchPostParamName, uint8 *pData, uint32 cubDataLen );
+
+ // Raw iteration support for GET and POST parameters
+ uint32 GetPOSTParamCount() const { return m_pProto->post_params_size(); }
+ const char* GetPOSTParamName( uint32 i ) const { return m_pProto->post_params( i ).name().c_str(); }
+ const char* GetPOSTParamValue( uint32 i ) const { return m_pProto->post_params( i ).value().c_str(); }
+ uint32 GetGETParamCount() const { return m_pProto->get_params_size(); }
+ const char* GetGETParamName( uint32 i ) const { return m_pProto->get_params( i ).name().c_str(); }
+ const char* GetGETParamValue( uint32 i ) const { return m_pProto->get_params( i ).value().c_str(); }
+
+ // Fetch a request header by header name and convert it to a time value
+ RTime32 GetRequestHeaderTimeValue( const char *pchRequestHeaderName, RTime32 rtDefault = 0 ) const;
+
+ // Fetch a request headers value by header name
+ const char *GetRequestHeaderValue( const char *pchRequestHeaderName, const char *pchDefault = NULL ) const;
+
+ // Set a header field for the request
+ void SetRequestHeaderValue( const char *pchHeaderName, const char *pchHeaderString );
+
+ // Set the method for the request object
+ void SetEHTTPMethod( EHTTPMethod eMethod ) { m_pProto->set_request_method( eMethod ); }
+
+ // Set the relative URL for the request
+ void SetURL( const char *pchURL )
+ {
+ AssertMsg( pchURL && pchURL[0] == '/', "URLs must start with the slash (/) character. Param: %s", pchURL );
+ m_pProto->set_url( pchURL );
+ }
+
+ void SetURLDirect( const char *pchURL, size_t size )
+ {
+ AssertMsg( pchURL && pchURL[0] == '/', "URLs must start with the slash (/) character. Param: %s", pchURL );
+ m_pProto->set_url( pchURL, size );
+ }
+
+ // Set body data
+ void SetBodyData( const void *pubData, uint32 cubData );
+ bool BHasBodyData() { return m_pProto->has_body(); }
+ uint GetBodyDataSize() const { return (uint)m_pProto->body().size(); }
+ const char* GetBodyData() const { return m_pProto->body().c_str(); }
+
+ // Set hostname for request to target (or host it was received on)
+ void SetHostname( const char *pchHost ) { m_pProto->set_hostname( pchHost ); }
+ void SetHostnameDirect( const char *pchHost, uint32 unLength ) { m_pProto->set_hostname( pchHost, unLength ); }
+ const char *GetHostname() const { return m_pProto->hostname().c_str(); }
+
+ // Set the overall timeout in seconds for this request
+ void SetAbsoluteTimeoutSeconds( uint32 unSeconds ) { m_pProto->set_absolute_timeout( unSeconds ); }
+
+ // Get the total absolute timeout value for the request
+ uint32 GetAbsoluteTimeoutSeconds() { return m_pProto->absolute_timeout(); }
+
+ //accesses the HTTP message
+ const CMsgHttpRequest& GetProtoObj() const { return *m_pProto; }
+
+ static void RetrieveURLEncodedData( const char *pchQueryString, int nQueryStrLen, CUtlVector<CMsgHttpRequest_QueryParam> &vecParams );
+
+protected:
+
+ // Adds a GET param containing raw data to the request. If you are using the Web API, you probably do not want this function
+ void SetGETParamRaw( const char *pchGetParamName, uint8 *pData, uint32 cubDataLen );
+
+ // Common initialization code
+ void Init( CMsgHttpRequest* pProto );
+
+ //the protobuf object that stores all of our contents
+ CMsgHttpRequest* m_pProto;
+ //whether or not we own this proto and should free it when the object is destroyed
+ bool m_bOwnProto;
+};
+
+
+//-----------------------------------------------------------------------------
+// Purpose: A wrapper to CHTTPRequest for Steam WebAPIs. Host, mode, and API key
+// are set automatically
+//-----------------------------------------------------------------------------
+class CSteamAPIRequest : public CHTTPRequest
+{
+public:
+ CSteamAPIRequest( EHTTPMethod eMethod, const char *pchInterface, const char *pchMethod, int nVersion );
+};
+
+
+class CHTTPResponse
+{
+public:
+ CHTTPResponse();
+ virtual ~CHTTPResponse();
+
+ // Get a specific headers data
+ const char *GetResponseHeaderValue( const char *pchName, const char *pchDefault = NULL ) const { return m_pkvResponseHeaders->GetString( pchName, pchDefault ); }
+
+ // Set a specific headers data, will clobber any existing value for that header
+ virtual void SetResponseHeaderValue( const char *pchName, const char *pchValue ) { m_pkvResponseHeaders->SetString( pchName, pchValue ); }
+
+ // Set status code for response
+ virtual void SetStatusCode( EHTTPStatusCode eStatusCode ) { m_eStatusCode = eStatusCode; }
+
+ // Set the expiration header based on a time delta from now
+ void SetExpirationHeaderDeltaFromNow( int32 nSecondsFromNow );
+
+ // Set the expiration header based on a time delta from now
+ void SetHeaderTimeValue( const char *pchHeaderName, RTime32 rtTimestamp );
+
+ // Get the entire headers KV (in case you want to iterate them all or such)
+ KeyValues *GetResponseHeadersKV() const { return m_pkvResponseHeaders; }
+
+ // Accessors to the body data in the response
+ const uint8 *GetPubBody() const { return (uint8*)m_pbufBody->Base(); }
+ uint32 GetCubBody() const { return m_pbufBody->TellPut(); }
+ const CUtlBuffer *GetBodyBuffer() const { return m_pbufBody; }
+ CUtlBuffer *GetBodyBuffer() { return m_pbufBody; }
+
+ // Accessor
+ EHTTPStatusCode GetStatusCode() const { return m_eStatusCode; }
+
+ // writes the response into a protobuf for use in messages
+ void SerializeIntoProtoBuf( CMsgHttpResponse & response ) const;
+
+ // reads the response out of a protobuf from a message
+ void DeserializeFromProtoBuf( const CMsgHttpResponse & response );
+
+protected:
+ static CBufferPool &GetBufferPool();
+
+ EHTTPStatusCode m_eStatusCode;
+ CUtlBuffer *m_pbufBody;
+ KeyValues *m_pkvResponseHeaders;
+};
+
+}
+#include "tier0/memdbgoff.h"
+
+#endif // HTTP_H