|
libUPnP 1.18.4
|
Defines the Web Server and has functions to carry out operations of the Web Server. More...
#include "config.h"#include "webserver.h"#include "UpnpExtraHeaders.h"#include "UpnpFileInfo.h"#include "UpnpIntTypes.h"#include "UpnpStdInt.h"#include "VirtualDir.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 "upnputil.h"#include <assert.h>#include <fcntl.h>#include <sys/stat.h>#include "posix_overwrites.h"
Data Structures | |
| struct | document_type_t |
| struct | xml_alias_t |
Enumerations | |
| enum | resp_type { RESP_FILEDOC , RESP_XMLDOC , RESP_HEADERS , RESP_WEBDOC , RESP_POST } |
Functions | |
| static char * | web_server_asctime_r (const struct tm *tm, char *buf) |
| 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, UpnpFileInfo *fileInfo) |
| 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, UpnpFileInfo *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 '/'. | |
| int | web_server_set_cors (const char *cors_string) |
| Assign the Access-Control-Allow-Origin specfied by the input const char* cors_string parameterto the global CORS string. | |
| static UPNP_INLINE int | get_alias (const char *request_file, struct xml_alias_t *alias, UpnpFileInfo *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, const void **cookie) |
| 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 void | FreeExtraHTTPHeaders (UpnpListHead *extraHeadersList) |
| static int | ExtraHTTPHeaders (http_message_t *Req, UpnpListHead *extraHeadersList) |
| Build an array of unrecognized headers. | |
| static int | process_request (SOCKINFO *info, 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, http_message_t *req, SOCKINFO *info) |
| Main entry point into web server; Handles HTTP GET and HEAD requests. | |
Variables | |
| static const char * | gMediaTypes [] |
| static const char * | gEncodedMediaTypes |
| static struct document_type_t | gMediaTypeList [70] |
| membuffer | gDocumentRootDir |
| membuffer | gWebserverCorsString |
| static struct xml_alias_t | gAliasDoc |
| static ithread_mutex_t | gWebMutex |
| str_int_entry | Http_Header_Names [33] |
Defines the Web Server and has functions to carry out operations of the Web Server.
| enum resp_type |
Response Types.
|
static |
Copy the contents of the global XML document into the local output parameter.
| [out] | alias | XML alias object. |
References xml_alias_t::ct, gAliasDoc, and is_valid_alias().
Referenced by process_request().
|
static |
Release the XML document referred to by the input parameter. Free the allocated buffers associated with this object.
| [in] | alias | XML 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_callback(), web_server_destroy(), and web_server_set_alias().
|
static |
Get header id from the request parameter and take appropriate action based on the ids as an HTTP Range Response.
HTTP_BAD_REQUEST HTTP_INTERNAL_SERVER_ERROR HTTP_REQUEST_RANGE_NOT_SATISFIABLE HTTP_OK | [in] | Req | HTTP Request message. |
| [out] | RespInstr | Send Instruction object to data for the response. |
| FileSize | Size of the file containing the request document. |
References membuffer::buf, memptr::buf, CreateHTTPRangeResponseHeader(), http_message_t::headers, membuffer::length, memptr::length, http_header_t::name, SendInstruction::RecvWriteSize, StrStr(), and http_header_t::value.
Referenced by process_request().
|
static |
Fills in the Offset, read size and contents to send out as an HTTP Range Response.
HTTP_BAD_REQUEST HTTP_INTERNAL_SERVER_ERROR HTTP_REQUEST_RANGE_NOT_SATISFIABLE HTTP_OK | ByteRangeSpecifier | String containing the range. | |
| FileLength | Length of the file. | |
| [out] | Instr | SendInstruction object where the range operations will be stored. |
References GetNextRange(), SendInstruction::ReadSendSize, and StrStr().
Referenced by CheckOtherHTTPHeaders().
|
static |
Build an array of unrecognized headers.
| [in] | Req | HTTP Request message. |
References membuffer::buf, memptr::buf, FreeExtraHTTPHeaders(), http_message_t::headers, membuffer::length, memptr::length, http_header_t::name, UpnpExtraHeaders_get_node(), UpnpExtraHeaders_new(), UpnpExtraHeaders_strncpy_name(), UpnpExtraHeaders_strncpy_value(), and http_header_t::value.
Referenced by process_request().
|
static |
| [in] | extraHeadersList | extra HTTP headers to free. |
References UpnpExtraHeaders_delete().
Referenced by ExtraHTTPHeaders(), and process_request().
|
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.
1 - On Success 0 if request is not an alias | [in] | request_file | request file passed in to be compared with. |
| [out] | alias | xml alias object which has a file name stored. |
| [out] | info | File information object which will be filled up if the file comparison succeeds. |
References membuffer::buf, xml_alias_t::doc, xml_alias_t::last_modified, membuffer::length, xml_alias_t::name, UPNP_INLINE, UpnpFileInfo_set_FileLength(), UpnpFileInfo_set_IsDirectory(), UpnpFileInfo_set_IsReadable(), and UpnpFileInfo_set_LastModified().
Referenced by process_request().
|
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.
0 on success. UPNP_E_OUTOF_MEMORY - on memory allocation failures. | [in] | filename | . |
| [out] | fileInfo | . |
References search_extension(), UPNP_E_OUTOF_MEMORY, UPNP_INLINE, UpnpFileInfo_get_ContentType(), and UpnpFileInfo_set_ContentType().
Referenced by get_file_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.
| [in] | filename | Filename having the description document. |
| [out] | info | File 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 get_content_type(), UpnpFileInfo_get_FileLength(), UpnpFileInfo_get_IsReadable(), UpnpFileInfo_get_LastModified(), UpnpFileInfo_set_ContentType(), UpnpFileInfo_set_FileLength(), UpnpFileInfo_set_IsDirectory(), UpnpFileInfo_set_IsReadable(), UpnpFileInfo_set_LastModified(), and UpnpPrintf().
Referenced by process_request().
|
static |
Returns a range of integers from a string.
| SrcRangeStr | string containing the token / range. |
| FirstByte | gets the first byte of the token. |
| LastByte | gets the last byte of the token. |
References StrTok().
Referenced by CreateHTTPRangeResponseHeader().
|
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, xml_alias_t::name, and UPNP_INLINE.
Referenced by web_server_init().
|
static |
Receives the HTTP post message.
HTTP_INTERNAL_SERVER_ERROR HTTP_UNAUTHORIZED HTTP_BAD_REQUEST HTTP_SERVICE_UNAVAILABLE HTTP_OK | parser | HTTP Parser object. | |
| [in] | info | Socket Information object. |
| filename | File where received data is copied to. | |
| Instr | Send Instruction object which gives information whether the file is a virtual file or not. |
References membuffer::buf, SendInstruction::Cookie, http_message_t::entity, http_parser_t::entity_start_position, http_parser_t::http_error_code, memptr::length, http_message_t::msg, PARSE_CONTINUE_1, PARSE_INCOMPLETE, PARSE_INCOMPLETE_ENTITY, PARSE_OK, PARSE_SUCCESS, SendInstruction::RequestCookie, sock_read(), UpnpPrintf(), and virtualDirCallback.
Referenced by web_server_callback().
|
static |
Check for the validity of the XML object buffer.
| [in] | alias | XML alias object. |
References membuffer::buf, xml_alias_t::doc, and UPNP_INLINE.
Referenced by alias_grab(), alias_release(), and process_request().
|
static |
Compares filePath with paths from the list of virtual directory lists.
| [in] | filePath | Directory path to be tested for virtual directory. |
| [out] | cookie | The cookie registered with this virtual directory, if matched. |
References pVirtualDirList.
Referenced by process_request().
|
static |
Decodes list and stores it in gMediaTypeList.
References document_type_t::content_subtype, document_type_t::content_type, document_type_t::file_ext, gMediaTypeList, and UPNP_INLINE.
Referenced by web_server_init().
|
static |
Processes the request and returns the result in the output parameters.
HTTP_BAD_REQUEST HTTP_INTERNAL_SERVER_ERROR HTTP_REQUEST_RANGE_NOT_SATISFIABLE HTTP_FORBIDDEN HTTP_NOT_FOUND HTTP_NOT_ACCEPTABLE HTTP_OK | [in] | info | Socket info. |
| [in] | req | HTTP Request message. |
| [out] | rtype | Type of response. |
| [out] | headers | Headers. |
| [out] | filename | Get filename from request document. |
| [out] | alias | Xml alias document from the request document. |
| [out] | RespInstr | Send Instruction object where the response is set up. |
References alias_grab(), alias_release(), membuffer::buf, memptr::buf, CheckOtherHTTPHeaders(), SendInstruction::Cookie, SendInstruction::CorsHeader, ExtraHTTPHeaders(), SOCKINFO::foreign_sockaddr, FreeExtraHTTPHeaders(), gAliasDoc, gDocumentRootDir, get_alias(), get_file_info(), gWebserverCorsString, http_MakeMessage(), is_valid_alias(), isFileInVirtualDir(), membuffer::length, memptr::length, http_message_t::method, SendInstruction::ReadSendSize, remove_dots(), remove_escaped_chars(), SendInstruction::RequestCookie, UPNP_E_SUCCESS, UpnpFileInfo_delete(), UpnpFileInfo_get_ContentType(), UpnpFileInfo_get_ExtraHeadersList(), UpnpFileInfo_get_FileLength(), UpnpFileInfo_get_IsDirectory(), UpnpFileInfo_get_IsReadable(), UpnpFileInfo_get_LastModified(), UpnpFileInfo_new(), UpnpFileInfo_set_ContentType(), UpnpFileInfo_set_CtrlPtIPAddr(), UpnpFileInfo_strncpy_Os(), http_message_t::uri, and virtualDirCallback.
Referenced by web_server_callback().
|
static |
Based on the extension, returns the content type and content subtype.
0 on success -1 on error | [in] | extension | . |
| [out] | con_type | . |
| [out] | con_subtype | . |
References document_type_t::file_ext, gMediaTypeList, and UPNP_INLINE.
Referenced by get_content_type().
|
static |
Finds a substring from a string in a case insensitive way.
| s1 | Input string. |
| s2 | Input sub-string. |
References ToUpperCase().
Referenced by CheckOtherHTTPHeaders(), and CreateHTTPRangeResponseHeader().
|
static |
Finds next token in a string.
| Src | String containing the token. |
| Del | Set of delimiter characters. |
Referenced by GetNextRange().
|
static |
Converts input string to upper case.
| s | Input string to be converted. |
Referenced by StrStr().
| void web_server_callback | ( | http_parser_t * | parser, |
| http_message_t * | req, | ||
| SOCKINFO * | info ) |
Main entry point into web server; Handles HTTP GET and HEAD requests.
| [in] | parser | . |
| [in] | req | . |
| [in,out] | info | . |
References alias_release(), membuffer::buf, xml_alias_t::doc, http_MakeMessage(), http_RecvPostMessage(), http_SendMessage(), membuffer::length, process_request(), and UpnpPrintf().
Referenced by UpnpEnableWebserver().
| 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, gAliasDoc, gDocumentRootDir, and gWebserverCorsString.
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.
0 - OK UPNP_E_OUTOF_MEMORY References bWebServerState, gDocumentRootDir, glob_alias_init(), gWebserverCorsString, media_list_init(), pVirtualDirList, UPNP_E_OUTOF_MEMORY, UPNP_E_SUCCESS, and virtualDirCallback.
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.
0 - OK UPNP_E_OUTOF_MEMORY | [in] | alias_name | Webserver name of alias; created by caller and freed by caller (doesn't even have to be malloc()d. |
| [in] | alias_content | The xml doc; this is allocated by the caller; and freed by the web server. |
| [in] | alias_content_length | Length of alias body in bytes. |
| [in] | last_modified | Time when the contents of alias were last changed (local time). |
References alias_release(), xml_alias_t::ct, xml_alias_t::doc, gAliasDoc, xml_alias_t::last_modified, xml_alias_t::name, and UPNP_E_OUTOF_MEMORY.
Referenced by UpnpUnRegisterRootDeviceLowPower().
| int web_server_set_cors | ( | const char * | cors_string | ) |
Assign the Access-Control-Allow-Origin specfied by the input const char* cors_string parameterto the global CORS string.
| [in] | cors_string | String having the Access-Control-Allow-Origin string. |
References gWebserverCorsString.
| 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 '/'.
| [in] | root_dir | String having the root directory for the document. |
References gDocumentRootDir.
|
static |
XML document.
Referenced by alias_grab(), glob_alias_init(), process_request(), web_server_destroy(), and web_server_set_alias().
|
static |
module variables - Globals, static and externs.
Referenced by media_list_init(), and search_extension().
|
static |