#ifndef _PLT_HTTP_H_
#define _PLT_HTTP_H_
#include "Neptune.h"
#include "PltVersion.h"
#if !defined(PLT_HTTP_DEFAULT_USER_AGENT)
#define PLT_HTTP_DEFAULT_USER_AGENT "UPnP/1.0 DLNADOC/1.50 Platinum/" PLT_PLATINUM_SDK_VERSION_STRING
#endif
#if !defined(PLT_HTTP_DEFAULT_SERVER)
#define PLT_HTTP_DEFAULT_SERVER "UPnP/1.0 DLNADOC/1.50 Platinum/" PLT_PLATINUM_SDK_VERSION_STRING
#endif
typedef enum {
PLT_DEVICE_UNKNOWN,
PLT_DEVICE_XBOX,
PLT_DEVICE_PS3,
PLT_DEVICE_WMP,
PLT_DEVICE_SONOS,
PLT_DEVICE_MAC,
PLT_DEVICE_WINDOWS,
PLT_DEVICE_VLC
} PLT_DeviceSignature;
class PLT_HttpHelper {
public:
static bool IsConnectionKeepAlive(NPT_HttpMessage& message);
static bool IsBodyStreamSeekable(NPT_HttpMessage& message);
static NPT_Result ToLog(NPT_LoggerReference logger, int level, const char* prefix, NPT_HttpRequest* request);
static NPT_Result ToLog(NPT_LoggerReference logger, int level, const char* prefix, const NPT_HttpRequest& request);
static NPT_Result ToLog(NPT_LoggerReference logger, int level, const char* prefix, NPT_HttpResponse* response);
static NPT_Result ToLog(NPT_LoggerReference logger, int level, const char* prefix, const NPT_HttpResponse& response);
static NPT_Result GetContentType(const NPT_HttpMessage& message, NPT_String& type);
static NPT_Result GetContentLength(const NPT_HttpMessage& message, NPT_LargeSize& len);
static NPT_Result GetHost(const NPT_HttpRequest& request, NPT_String& value);
static void SetHost(NPT_HttpRequest& request, const char* host);
static PLT_DeviceSignature GetDeviceSignature(const NPT_HttpRequest& request);
static NPT_Result SetBody(NPT_HttpMessage& message, NPT_String& text, NPT_HttpEntity** entity = NULL);
static NPT_Result SetBody(NPT_HttpMessage& message, const char* text, NPT_HttpEntity** entity = NULL);
static NPT_Result SetBody(NPT_HttpMessage& message, const void* body, NPT_LargeSize len, NPT_HttpEntity** entity = NULL);
static NPT_Result SetBody(NPT_HttpMessage& message, NPT_InputStreamReference stream, NPT_HttpEntity** entity = NULL);
static NPT_Result GetBody(const NPT_HttpMessage& message, NPT_String& body);
static NPT_Result ParseBody(const NPT_HttpMessage& message, NPT_XmlElementNode*& xml);
static void SetBasicAuthorization(NPT_HttpRequest& request, const char* username, const char* password);
};
class PLT_HttpRequestContext : public NPT_HttpRequestContext {
public:
PLT_HttpRequestContext(const NPT_HttpRequest& request) :
m_Request(request) {}
PLT_HttpRequestContext(const NPT_HttpRequest& request, const NPT_HttpRequestContext& context) :
NPT_HttpRequestContext(&context.GetLocalAddress(), &context.GetRemoteAddress()),
m_Request(request) {}
virtual ~PLT_HttpRequestContext() {}
const NPT_HttpRequest& GetRequest() const { return m_Request; }
PLT_DeviceSignature GetDeviceSignature() { return PLT_HttpHelper::GetDeviceSignature(m_Request); }
private:
const NPT_HttpRequest& m_Request;
};
#if defined(NPT_CONFIG_ENABLE_LOGGING)
#define PLT_LOG_HTTP_MESSAGE_L(_logger, _level, _prefix, _msg) \
PLT_HttpHelper::ToLog((_logger), (_level), (_prefix), (_msg))
#define PLT_LOG_HTTP_MESSAGE(_level, _prefix, _msg) \
PLT_HttpHelper::ToLog((_NPT_LocalLogger), (_level), (_prefix), (_msg))
#else
#define PLT_LOG_HTTP_MESSAGE_L(_logger, _level, _prefix, _msg)
#define PLT_LOG_HTTP_MESSAGE(_level, _prefix, _msg)
#endif
class PLT_HttpRequestHandler : public NPT_HttpRequestHandler
{
public:
PLT_HttpRequestHandler(NPT_HttpRequestHandler* delegate) :
m_Delegate(delegate) {}
virtual ~PLT_HttpRequestHandler() {}
NPT_Result SetupResponse(NPT_HttpRequest& request,
const NPT_HttpRequestContext& context,
NPT_HttpResponse& response) {
return m_Delegate->SetupResponse(request, context, response);
}
private:
NPT_HttpRequestHandler* m_Delegate;
};
#endif