libUPnP  1.6.17
Data Structures | Defines | Enumerations | Functions | Variables
webserver.c File Reference

Defines the Web Server and has functions to carry out operations of the Web Server. More...

#include "config.h"
#include "webserver.h"
#include "httpparser.h"
#include "httpreadwrite.h"
#include "ithread.h"
#include "membuffer.h"
#include "ssdplib.h"
#include "statcodes.h"
#include "strintmap.h"
#include "unixutil.h"
#include "upnp.h"
#include "upnpapi.h"
#include "UpnpIntTypes.h"
#include "UpnpStdInt.h"
#include "upnputil.h"
#include "VirtualDir.h"
#include <assert.h>
#include <fcntl.h>
#include <sys/stat.h>
Include dependency graph for webserver.c:

Data Structures

struct  document_type_t
struct  xml_alias_t

Defines

#define AUDIO_STR   "\1"
#define VIDEO_STR   "\2"
#define IMAGE_STR   "\3"
#define APPLICATION_STR   "\4"
#define TEXT_STR   "\5"
#define APPLICATION_INDEX   4
#define TEXT_INDEX   5
#define NUM_MEDIA_TYPES   69
#define NUM_HTTP_HEADER_NAMES   33

Enumerations

enum  resp_type {
  RESP_FILEDOC, RESP_XMLDOC, RESP_HEADERS, RESP_WEBDOC,
  RESP_POST
}

Functions

static UPNP_INLINE void media_list_init (void)
 Decodes list and stores it in gMediaTypeList.
static UPNP_INLINE int search_extension (const char *extension, const char **con_type, const char **con_subtype)
 Based on the extension, returns the content type and content subtype.
static UPNP_INLINE int get_content_type (const char *filename, DOMString *content_type)
 Based on the extension, clones an XML string based on type and content subtype. If content type and sub type are not found, unknown types are used.
static UPNP_INLINE void glob_alias_init (void)
 Initialize the global XML document. Allocate buffers for the XML document.
static UPNP_INLINE int is_valid_alias (const struct xml_alias_t *alias)
 Check for the validity of the XML object buffer.
static void alias_grab (struct xml_alias_t *alias)
 Copy the contents of the global XML document into the local output parameter.
static void alias_release (struct xml_alias_t *alias)
 Release the XML document referred to by the input parameter. Free the allocated buffers associated with this object.
int web_server_set_alias (const char *alias_name, const char *alias_content, size_t alias_content_length, time_t last_modified)
 Replaces current alias with the given alias. To remove the current alias, set alias_name to NULL.
int web_server_init ()
 Initilialize the different documents. Initialize the memory for root directory for web server. Call to initialize global XML document. Sets bWebServerState to WEB_SERVER_ENABLED.
void web_server_destroy (void)
 Release memory allocated for the global web server root directory and the global XML document. Resets the flag bWebServerState to WEB_SERVER_DISABLED.
static int get_file_info (const char *filename, struct File_Info *info)
 Release memory allocated for the global web server root directory and the global XML document. Resets the flag bWebServerState to WEB_SERVER_DISABLED.
int web_server_set_root_dir (const char *root_dir)
 Assign the path specfied by the input const char* root_dir parameter to the global Document root directory. Also check for path names ending in '/'.
static UPNP_INLINE int get_alias (const char *request_file, struct xml_alias_t *alias, struct File_Info *info)
 Compare the files names between the one on the XML alias the one passed in as the input parameter. If equal extract file information.
static int isFileInVirtualDir (char *filePath)
 Compares filePath with paths from the list of virtual directory lists.
static void ToUpperCase (char *s)
 Converts input string to upper case.
static char * StrStr (char *s1, const char *s2)
 Finds a substring from a string in a case insensitive way.
static char * StrTok (char **Src, const char *Del)
 Finds next token in a string.
static int GetNextRange (char **SrcRangeStr, off_t *FirstByte, off_t *LastByte)
 Returns a range of integers from a string.
static int CreateHTTPRangeResponseHeader (char *ByteRangeSpecifier, off_t FileLength, struct SendInstruction *Instr)
 Fills in the Offset, read size and contents to send out as an HTTP Range Response.
static int CheckOtherHTTPHeaders (http_message_t *Req, struct SendInstruction *RespInstr, off_t FileSize)
 Get header id from the request parameter and take appropriate action based on the ids as an HTTP Range Response.
static int process_request (http_message_t *req, enum resp_type *rtype, membuffer *headers, membuffer *filename, struct xml_alias_t *alias, struct SendInstruction *RespInstr)
 Processes the request and returns the result in the output parameters.
static int http_RecvPostMessage (http_parser_t *parser, SOCKINFO *info, char *filename, struct SendInstruction *Instr)
 Receives the HTTP post message.
void web_server_callback (http_parser_t *parser, INOUT http_message_t *req, SOCKINFO *info)

Variables

static const char * gMediaTypes []
static const char * gEncodedMediaTypes = "\0"
static struct document_type_t gMediaTypeList [69]
membuffer gDocumentRootDir
static struct xml_alias_t gAliasDoc
static ithread_mutex_t gWebMutex
str_int_entry Http_Header_Names [33]

Detailed Description

Defines the Web Server and has functions to carry out operations of the Web Server.


Enumeration Type Documentation

enum resp_type

Response Types.


Function Documentation

static void alias_grab ( struct xml_alias_t alias) [static]

Copy the contents of the global XML document into the local output parameter.

Parameters:
[out]aliasXML alias object.

References xml_alias_t::ct, gAliasDoc, and is_valid_alias().

Referenced by process_request().

static void alias_release ( struct xml_alias_t alias) [static]

Release the XML document referred to by the input parameter. Free the allocated buffers associated with this object.

Parameters:
[in]aliasXML alias object.

References xml_alias_t::ct, xml_alias_t::doc, is_valid_alias(), and xml_alias_t::name.

Referenced by process_request(), web_server_destroy(), and web_server_set_alias().

static int CheckOtherHTTPHeaders ( http_message_t Req,
struct SendInstruction RespInstr,
off_t  FileSize 
) [static]

Get header id from the request parameter and take appropriate action based on the ids as an HTTP Range Response.

Returns:
  • HTTP_BAD_REQUEST
  • UPNP_E_OUTOF_MEMORY
  • HTTP_REQUEST_RANGE_NOT_SATISFIABLE
  • HTTP_OK
Parameters:
[in]ReqHTTP Request message.
[out]RespInstrSend Instruction object to data for the response.
FileSizeSize of the file containing the request document.

References memptr::buf, membuffer::buf, CreateHTTPRangeResponseHeader(), FALSE, http_message_t::headers, memptr::length, membuffer::length, ListHead(), ListNext(), http_header_t::name, SendInstruction::RecvWriteSize, StrStr(), UPNP_E_OUTOF_MEMORY, and http_header_t::value.

Referenced by process_request().

static int CreateHTTPRangeResponseHeader ( char *  ByteRangeSpecifier,
off_t  FileLength,
struct SendInstruction Instr 
) [static]

Fills in the Offset, read size and contents to send out as an HTTP Range Response.

Returns:
  • HTTP_BAD_REQUEST
  • UPNP_E_OUTOF_MEMORY
  • HTTP_REQUEST_RANGE_NOT_SATISFIABLE
  • HTTP_OK
Parameters:
ByteRangeSpecifierString containing the range.
FileLengthLength of the file.
[out]InstrSendInstruction object where the range operations will be stored.

References GetNextRange(), SendInstruction::ReadSendSize, StrStr(), and UPNP_E_OUTOF_MEMORY.

Referenced by CheckOtherHTTPHeaders().

static UPNP_INLINE int get_alias ( const char *  request_file,
struct xml_alias_t alias,
struct File_Info info 
) [static]

Compare the files names between the one on the XML alias the one passed in as the input parameter. If equal extract file information.

Returns:
  • TRUE - On Success
  • FALSE if request is not an alias
Parameters:
[in]request_filerequest file passed in to be compared with.
[out]aliasxml alias object which has a file name stored.
[out]infoFile information object which will be filled up if the file comparison succeeds.

References membuffer::buf, xml_alias_t::doc, FALSE, File_Info::file_length, File_Info::is_directory, File_Info::is_readable, xml_alias_t::last_modified, File_Info::last_modified, membuffer::length, and xml_alias_t::name.

Referenced by process_request().

static UPNP_INLINE int get_content_type ( const char *  filename,
DOMString content_type 
) [static]

Based on the extension, clones an XML string based on type and content subtype. If content type and sub type are not found, unknown types are used.

Returns:
  • 0 on success.
  • UPNP_E_OUTOF_MEMORY - on memory allocation failures.
Parameters:
[in]filename.
[out]content_type.

References FALSE, ixmlCloneDOMString(), search_extension(), and UPNP_E_OUTOF_MEMORY.

Referenced by get_file_info().

static int get_file_info ( const char *  filename,
struct File_Info info 
) [static]

Release memory allocated for the global web server root directory and the global XML document. Resets the flag bWebServerState to WEB_SERVER_DISABLED.

Returns:
Integer.
Parameters:
[in]filenameFilename having the description document.
[out]infoFile information object having file attributes such as filelength, when was the file last modified, whether a file or a directory and whether the file or directory is readable.

References File_Info::content_type, FALSE, File_Info::file_length, get_content_type(), File_Info::is_directory, File_Info::is_readable, ixmlFreeDOMString(), File_Info::last_modified, and UpnpPrintf().

Referenced by process_request().

static int GetNextRange ( char **  SrcRangeStr,
off_t *  FirstByte,
off_t *  LastByte 
) [static]

Returns a range of integers from a string.

Returns:
Always returns 1.
Parameters:
SrcRangeStrstring containing the token / range.
FirstBytegets the first byte of the token.
LastBytegets the last byte of the token.

References StrTok().

Referenced by CreateHTTPRangeResponseHeader().

static UPNP_INLINE void glob_alias_init ( void  ) [static]

Initialize the global XML document. Allocate buffers for the XML document.

References xml_alias_t::ct, xml_alias_t::doc, gAliasDoc, xml_alias_t::last_modified, and xml_alias_t::name.

Referenced by web_server_init().

static int http_RecvPostMessage ( http_parser_t parser,
SOCKINFO info,
char *  filename,
struct SendInstruction Instr 
) [static]

Receives the HTTP post message.

Returns:
  • HTTP_INTERNAL_SERVER_ERROR
  • HTTP_UNAUTHORIZED
  • HTTP_REQUEST_RANGE_NOT_SATISFIABLE
  • HTTP_OK
Parameters:
parserHTTP Parser object.
[in]infoSocket Information object.
filenameFile where received data is copied to.
InstrSend Instruction object which gives information whether the file is a virtual file or not.

References membuffer::buf, VirtualDirCallbacks::close, http_message_t::entity, http_parser_t::entity_start_position, FALSE, http_parser_t::http_error_code, memptr::length, http_message_t::msg, VirtualDirCallbacks::open, PARSE_CONTINUE_1, PARSE_INCOMPLETE, PARSE_INCOMPLETE_ENTITY, PARSE_OK, PARSE_SUCCESS, sock_read(), UpnpPrintf(), virtualDirCallback, and VirtualDirCallbacks::write.

static UPNP_INLINE int is_valid_alias ( const struct xml_alias_t alias) [static]

Check for the validity of the XML object buffer.

Returns:
BOOLEAN.
Parameters:
[in]aliasXML alias object.

References membuffer::buf, and xml_alias_t::doc.

Referenced by alias_grab(), alias_release(), and process_request().

static int isFileInVirtualDir ( char *  filePath) [static]

Compares filePath with paths from the list of virtual directory lists.

Returns:
BOOLEAN.
Parameters:
[in]filePathDirectory path to be tested for virtual directory.

References pVirtualDirList.

Referenced by process_request().

static UPNP_INLINE void media_list_init ( void  ) [static]

Decodes list and stores it in gMediaTypeList.

References document_type_t::content_subtype, document_type_t::content_type, document_type_t::file_ext, and gMediaTypeList.

Referenced by web_server_init().

static int process_request ( http_message_t req,
enum resp_type rtype,
membuffer headers,
membuffer filename,
struct xml_alias_t alias,
struct SendInstruction RespInstr 
) [static]

Processes the request and returns the result in the output parameters.

Returns:
  • HTTP_BAD_REQUEST
  • UPNP_E_OUTOF_MEMORY
  • HTTP_REQUEST_RANGE_NOT_SATISFIABLE
  • HTTP_OK
Parameters:
[in]reqHTTP Request message.
[out]rtypeTpye of response.
[out]headersHeaders.
[out]filenameGet filename from request document.
[out]aliasXml alias document from the request document.
[out]RespInstrSend Instruction object where the response is set up.

References alias_grab(), alias_release(), membuffer::buf, CheckOtherHTTPHeaders(), File_Info::content_type, FALSE, File_Info::file_length, gAliasDoc, get_alias(), get_file_info(), http_MakeMessage(), File_Info::is_directory, File_Info::is_readable, is_valid_alias(), isFileInVirtualDir(), ixmlCloneDOMString(), ixmlFreeDOMString(), File_Info::last_modified, membuffer::length, http_message_t::method, SendInstruction::ReadSendSize, remove_dots(), remove_escaped_chars(), UPNP_E_SUCCESS, http_message_t::uri, and virtualDirCallback.

static UPNP_INLINE int search_extension ( const char *  extension,
const char **  con_type,
const char **  con_subtype 
) [static]

Based on the extension, returns the content type and content subtype.

Returns:
  • 0 on success
  • -1 on error
Parameters:
[in]extension.
[out]con_type.
[out]con_subtype.

References document_type_t::content_subtype, document_type_t::content_type, document_type_t::file_ext, and gMediaTypeList.

Referenced by get_content_type().

static char* StrStr ( char *  s1,
const char *  s2 
) [static]

Finds a substring from a string in a case insensitive way.

Returns:
A pointer to the first occurence of s2 in s1.
Parameters:
s1Input string.
s2Input sub-string.

References ToUpperCase().

Referenced by CheckOtherHTTPHeaders(), and CreateHTTPRangeResponseHeader().

static char* StrTok ( char **  Src,
const char *  Del 
) [static]

Finds next token in a string.

Returns:
Pointer to the next token.
Parameters:
SrcString containing the token.
DelSet of delimiter characters.

Referenced by GetNextRange().

static void ToUpperCase ( char *  s) [static]

Converts input string to upper case.

Parameters:
sInput string to be converted.

Referenced by StrStr().

void web_server_destroy ( void  )

Release memory allocated for the global web server root directory and the global XML document. Resets the flag bWebServerState to WEB_SERVER_DISABLED.

References alias_release(), bWebServerState, and gAliasDoc.

Referenced by UpnpEnableWebserver(), and UpnpFinish().

int web_server_init ( void  )

Initilialize the different documents. Initialize the memory for root directory for web server. Call to initialize global XML document. Sets bWebServerState to WEB_SERVER_ENABLED.

Note:
alias_content is not freed here
Returns:
  • 0 - OK
  • UPNP_E_OUTOF_MEMORY

References bWebServerState, VirtualDirCallbacks::close, VirtualDirCallbacks::get_info, glob_alias_init(), media_list_init(), VirtualDirCallbacks::open, pVirtualDirList, VirtualDirCallbacks::read, VirtualDirCallbacks::seek, UPNP_E_OUTOF_MEMORY, virtualDirCallback, and VirtualDirCallbacks::write.

Referenced by UpnpEnableWebserver().

int web_server_set_alias ( const char *  alias_name,
const char *  alias_content,
size_t  alias_content_length,
time_t  last_modified 
)

Replaces current alias with the given alias. To remove the current alias, set alias_name to NULL.

Note:
alias_content is not freed here
Returns:
  • 0 - OK
  • UPNP_E_OUTOF_MEMORY
Parameters:
[in]alias_nameWebserver name of alias; created by caller and freed by caller (doesn't even have to be malloc()d.
[in]alias_contentThe xml doc; this is allocated by the caller; and freed by the web server.
[in]alias_content_lengthLength of alias body in bytes.
[in]last_modifiedTime when the contents of alias were last changed (local time).

References alias_release(), xml_alias_t::ct, xml_alias_t::doc, FALSE, gAliasDoc, xml_alias_t::last_modified, xml_alias_t::name, and UPNP_E_OUTOF_MEMORY.

Referenced by UpnpUnRegisterRootDeviceLowPower().

int web_server_set_root_dir ( const char *  root_dir)

Assign the path specfied by the input const char* root_dir parameter to the global Document root directory. Also check for path names ending in '/'.

Returns:
Integer.
Parameters:
[in]root_dirString having the root directory for the document.

References membuffer::buf, and membuffer::length.


Variable Documentation

struct xml_alias_t gAliasDoc [static]
struct document_type_t gMediaTypeList[69] [static]

module variables - Globals, static and externs.

Referenced by media_list_init(), and search_extension().

const char* gMediaTypes[] [static]
Initial value:
 {
        
        NULL,
        
        "audio",
        
        "video",
        
        "image",
        
        "application",
        
        "text"
}