39
44
+---------------------------------------------------------------------*/
40
45
#include "Neptune.h"
46
#include "PltVersion.h"
48
/*----------------------------------------------------------------------
50
+---------------------------------------------------------------------*/
51
#if !defined(PLT_HTTP_DEFAULT_USER_AGENT)
52
#define PLT_HTTP_DEFAULT_USER_AGENT "UPnP/1.0 DLNADOC/1.50 Platinum/" PLT_PLATINUM_SDK_VERSION_STRING
55
#if !defined(PLT_HTTP_DEFAULT_SERVER)
56
#define PLT_HTTP_DEFAULT_SERVER "UPnP/1.0 DLNADOC/1.50 Platinum/" PLT_PLATINUM_SDK_VERSION_STRING
59
/*----------------------------------------------------------------------
61
+---------------------------------------------------------------------*/
71
} PLT_DeviceSignature;
42
73
/*----------------------------------------------------------------------
44
75
+---------------------------------------------------------------------*/
77
The PLT_HttpHelper class is a set of utility functions for manipulating
78
HTTP headers, entities and messages.
45
80
class PLT_HttpHelper {
47
82
static bool IsConnectionKeepAlive(NPT_HttpMessage& message);
48
83
static bool IsBodyStreamSeekable(NPT_HttpMessage& message);
50
static NPT_Result ToLog(NPT_LoggerReference logger, int level, NPT_HttpRequest* request);
51
static NPT_Result ToLog(NPT_LoggerReference logger, int level, NPT_HttpResponse* response);
53
static NPT_Result GetContentType(NPT_HttpMessage& message, NPT_String& type);
54
static void SetContentType(NPT_HttpMessage& message, const char* type);
55
static NPT_Result GetContentLength(NPT_HttpMessage& message, NPT_LargeSize& len);
56
static void SetContentLength(NPT_HttpMessage& message, NPT_LargeSize len);
58
static NPT_Result GetHost(NPT_HttpRequest& request, NPT_String& value);
85
static NPT_Result ToLog(NPT_LoggerReference logger, int level, const char* prefix, NPT_HttpRequest* request);
86
static NPT_Result ToLog(NPT_LoggerReference logger, int level, const char* prefix, const NPT_HttpRequest& request);
87
static NPT_Result ToLog(NPT_LoggerReference logger, int level, const char* prefix, NPT_HttpResponse* response);
88
static NPT_Result ToLog(NPT_LoggerReference logger, int level, const char* prefix, const NPT_HttpResponse& response);
90
static NPT_Result GetContentType(const NPT_HttpMessage& message, NPT_String& type);
91
static NPT_Result GetContentLength(const NPT_HttpMessage& message, NPT_LargeSize& len);
93
static NPT_Result GetHost(const NPT_HttpRequest& request, NPT_String& value);
59
94
static void SetHost(NPT_HttpRequest& request, const char* host);
60
static NPT_Result GetRange(NPT_HttpRequest& request, NPT_Position& start, NPT_Position& end);
61
static void SetRange(NPT_HttpRequest& request, NPT_Position start, NPT_Position end = (NPT_Position)-1);
63
static NPT_Result GetContentRange(NPT_HttpResponse& response, NPT_Position& start, NPT_Position& end, NPT_LargeSize& length);
64
static NPT_Result SetContentRange(NPT_HttpResponse& response, NPT_Position start, NPT_Position end, NPT_LargeSize length);
66
static NPT_Result SetBody(NPT_HttpMessage& message, NPT_String& body);
67
static NPT_Result SetBody(NPT_HttpMessage& message, const char* body, NPT_Size len);
68
static NPT_Result SetBody(NPT_HttpMessage& message, NPT_InputStreamReference& stream, NPT_LargeSize len = 0);
71
static NPT_Result GetBody(NPT_HttpMessage& message, NPT_String& body);
72
static NPT_Result ParseBody(NPT_HttpMessage& message, NPT_XmlElementNode*& xml);
74
static NPT_Result Connect(NPT_Socket& connection,
75
NPT_HttpRequest& request,
76
NPT_Timeout timeout = NPT_TIMEOUT_INFINITE);
77
static void SetBasicAuthorization(NPT_HttpRequest& request, const char* login, const char* password);
95
static PLT_DeviceSignature GetDeviceSignature(const NPT_HttpRequest& request);
97
static NPT_Result SetBody(NPT_HttpMessage& message, NPT_String& text, NPT_HttpEntity** entity = NULL);
98
static NPT_Result SetBody(NPT_HttpMessage& message, const char* text, NPT_HttpEntity** entity = NULL);
99
static NPT_Result SetBody(NPT_HttpMessage& message, const void* body, NPT_LargeSize len, NPT_HttpEntity** entity = NULL);
100
static NPT_Result SetBody(NPT_HttpMessage& message, NPT_InputStreamReference stream, NPT_HttpEntity** entity = NULL);
101
static NPT_Result GetBody(const NPT_HttpMessage& message, NPT_String& body);
102
static NPT_Result ParseBody(const NPT_HttpMessage& message, NPT_XmlElementNode*& xml);
104
static void SetBasicAuthorization(NPT_HttpRequest& request, const char* username, const char* password);
80
107
/*----------------------------------------------------------------------
81
108
| PLT_HttpRequestContext
82
109
+---------------------------------------------------------------------*/
111
The PLT_HttpRequestContext class holds information about the request sent, the
112
local & remote ip addresses and ports associated with a connection. It is used
113
mostly when processing a HTTP response.
83
115
class PLT_HttpRequestContext : public NPT_HttpRequestContext {
85
117
// constructors and destructor
86
PLT_HttpRequestContext(NPT_HttpRequest& request) :
118
PLT_HttpRequestContext(const NPT_HttpRequest& request) :
87
119
m_Request(request) {}
88
PLT_HttpRequestContext(NPT_HttpRequest& request, const NPT_HttpRequestContext& context) :
120
PLT_HttpRequestContext(const NPT_HttpRequest& request, const NPT_HttpRequestContext& context) :
89
121
NPT_HttpRequestContext(&context.GetLocalAddress(), &context.GetRemoteAddress()),
90
122
m_Request(request) {}
91
123
virtual ~PLT_HttpRequestContext() {}
93
NPT_HttpRequest& GetRequest() const { return m_Request; }
125
const NPT_HttpRequest& GetRequest() const { return m_Request; }
126
PLT_DeviceSignature GetDeviceSignature() { return PLT_HttpHelper::GetDeviceSignature(m_Request); }
96
NPT_HttpRequest& m_Request;
129
const NPT_HttpRequest& m_Request;
99
132
/*----------------------------------------------------------------------
101
134
+---------------------------------------------------------------------*/
102
135
#if defined(NPT_CONFIG_ENABLE_LOGGING)
103
#define PLT_LOG_HTTP_MESSAGE_L(_logger, _level, _msg) \
104
PLT_HttpHelper::ToLog((_logger), (_level), (_msg))
105
#define PLT_LOG_HTTP_MESSAGE(_level, _msg) \
106
PLT_HttpHelper::ToLog((_NPT_LocalLogger), (_level), (_msg))
136
#define PLT_LOG_HTTP_MESSAGE_L(_logger, _level, _prefix, _msg) \
137
PLT_HttpHelper::ToLog((_logger), (_level), (_prefix), (_msg))
138
#define PLT_LOG_HTTP_MESSAGE(_level, _prefix, _msg) \
139
PLT_HttpHelper::ToLog((_NPT_LocalLogger), (_level), (_prefix), (_msg))
108
141
#else /* NPT_CONFIG_ENABLE_LOGGING */
109
#define PLT_LOG_HTTP_MESSAGE_L(_logger, _level, _msg)
110
#define PLT_LOG_HTTP_MESSAGE(_level, _msg)
142
#define PLT_LOG_HTTP_MESSAGE_L(_logger, _level, _prefix, _msg)
143
#define PLT_LOG_HTTP_MESSAGE(_level, _prefix, _msg)
111
144
#endif /* NPT_CONFIG_ENABLE_LOGGING */
113
146
/*----------------------------------------------------------------------
114
147
| PLT_HttpRequestHandler
115
148
+---------------------------------------------------------------------*/
150
The PLT_HttpRequestHandler class delegates the handling of the response of a
151
received HTTP request by a HTTP Server.
117
153
class PLT_HttpRequestHandler : public NPT_HttpRequestHandler
120
PLT_HttpRequestHandler<T>(T* data) : m_Data(data) {}
121
virtual ~PLT_HttpRequestHandler<T>() {}
156
PLT_HttpRequestHandler(NPT_HttpRequestHandler* delegate) :
157
m_Delegate(delegate) {}
158
virtual ~PLT_HttpRequestHandler() {}
123
160
// NPT_HttpRequestHandler methods
124
161
NPT_Result SetupResponse(NPT_HttpRequest& request,
125
162
const NPT_HttpRequestContext& context,
126
163
NPT_HttpResponse& response) {
127
return m_Data->ProcessHttpRequest(request, context, response);
164
return m_Delegate->SetupResponse(request, context, response);
168
NPT_HttpRequestHandler* m_Delegate;
135
171
#endif /* _PLT_HTTP_H_ */