Asterisk - The Open Source Telephony Project GIT-master-80b953f
Loading...
Searching...
No Matches
Data Structures | Typedefs | Enumerations | Functions
http.h File Reference

Support for Private Asterisk HTTP Servers. More...

#include "asterisk/config.h"
#include "asterisk/tcptls.h"
#include "asterisk/linkedlists.h"
Include dependency graph for http.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  ast_http_auth
 HTTP authentication information. More...
 
struct  ast_http_uri
 Definition of a URI handler. More...
 

Typedefs

typedef int(* ast_http_callback) (struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
 HTTP Callbacks.
 

Enumerations

enum  ast_http_method {
  AST_HTTP_UNKNOWN = -1 , AST_HTTP_GET = 0 , AST_HTTP_POST , AST_HTTP_HEAD ,
  AST_HTTP_PUT , AST_HTTP_DELETE , AST_HTTP_OPTIONS , AST_HTTP_MAX_METHOD
}
 HTTP Request methods known by Asterisk. More...
 

Functions

const char * ast_get_http_method (enum ast_http_method method) attribute_pure
 Return http method name string.
 
enum ast_http_method ast_get_http_method_from_string (const char *method)
 Return http method from string.
 
void ast_http_auth (struct ast_tcptls_session_instance *ser, const char *realm, const unsigned long nonce, const unsigned long opaque, int stale, const char *text)
 Send http "401 Unauthorized" response and close socket.
 
int ast_http_body_discard (struct ast_tcptls_session_instance *ser)
 Read and discard any unread HTTP request body.
 
void ast_http_body_read_status (struct ast_tcptls_session_instance *ser, int read_success)
 Update the body read success status.
 
struct ast_variableast_http_create_basic_auth_header (const char *userid, const char *password)
 Create an HTTP authorization header.
 
void ast_http_create_response (struct ast_tcptls_session_instance *ser, int status_code, const char *status_title, struct ast_str *http_header_data, const char *text)
 Creates and sends a formatted http response message.
 
void ast_http_error (struct ast_tcptls_session_instance *ser, int status, const char *title, const char *text)
 Send HTTP error message and close socket.
 
const char * ast_http_ftype2mtype (const char *ftype) attribute_pure
 Return mime type based on extension.
 
struct ast_http_authast_http_get_auth (struct ast_variable *headers)
 Get HTTP authentication information from headers.
 
struct ast_variableast_http_get_cookies (struct ast_variable *headers)
 Get cookie from Request headers.
 
struct ast_jsonast_http_get_json (struct ast_tcptls_session_instance *ser, struct ast_variable *headers)
 Get JSON from client Request Entity-Body, if content type is application/json.
 
struct ast_variableast_http_get_post_vars (struct ast_tcptls_session_instance *ser, struct ast_variable *headers)
 Get post variables from client Request Entity-Body, if content type is application/x-www-form-urlencoded.
 
int ast_http_header_match (const char *name, const char *expected_name, const char *value, const char *expected_value)
 Check if the header and value match (case insensitive) their associated expected values.
 
int ast_http_header_match_in (const char *name, const char *expected_name, const char *value, const char *expected_value)
 Check if the header name matches the expected header name. If so, then check to see if the value can be located in the expected value.
 
int ast_http_header_parse (char *buf, char **name, char **value)
 Parse a header into the given name/value strings.
 
uint32_t ast_http_manid_from_vars (struct ast_variable *headers) attribute_pure
 Return manager id, if exist, from request headers.
 
struct ast_variableast_http_parse_post_form (char *buf, int content_length, const char *content_type)
 Get post variables from an application/x-www-form-urlencoded buffer.
 
void ast_http_prefix (char *buf, int len)
 Return the current prefix.
 
void ast_http_request_close_on_completion (struct ast_tcptls_session_instance *ser)
 Request the HTTP connection be closed after this HTTP request.
 
int ast_http_response_status_line (const char *buf, const char *version, int code)
 Parse the http response status line.
 
void ast_http_send (struct ast_tcptls_session_instance *ser, enum ast_http_method method, int status_code, const char *status_title, struct ast_str *http_header, struct ast_str *out, int fd, unsigned int static_content)
 Generic function for sending HTTP/1.1 response.
 
int ast_http_uri_link (struct ast_http_uri *urihandler)
 Register a URI handler.
 
void ast_http_uri_unlink (struct ast_http_uri *urihandler)
 Unregister a URI handler.
 
void ast_http_uri_unlink_all_with_key (const char *key)
 Unregister all handlers with matching key.
 

Detailed Description

Support for Private Asterisk HTTP Servers.

Note
Note: The Asterisk HTTP servers are extremely simple and minimal and only support the "GET" method.
Author
Mark Spencer marks.nosp@m.ter@.nosp@m.digiu.nosp@m.m.co.nosp@m.m
Note
In order to have TLS/SSL support, we need the openssl libraries. Still we can decide whether or not to use them by commenting in or out the DO_SSL macro. TLS/SSL support is basically implemented by reading from a config file (currently http.conf) the names of the certificate and cipher to use, and then run ssl_setup() to create an appropriate SSL_CTX (ssl_ctx) If we support multiple domains, presumably we need to read multiple certificates. When we are requested to open a TLS socket, we run make_file_from_fd() on the socket, to do the necessary setup. At the moment the context's name is hardwired in the function, but we can certainly make it into an extra parameter to the function. We declare most of ssl support variables unconditionally, because their number is small and this simplifies the code.
: the ssl-support variables (ssl_ctx, do_ssl, certfile, cipher) and their setup should be moved to a more central place, e.g. asterisk.conf and the source files that processes it. Similarly, ssl_setup() should be run earlier in the startup process so modules have it available.

Definition in file http.h.

Typedef Documentation

◆ ast_http_callback

typedef int(* ast_http_callback) (struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)

HTTP Callbacks.

Parameters
serTCP/TLS session object
urihRegistered URI handler struct for the URI.
uriRemaining request URI path (also with the get_params removed).
methodenum ast_http_method GET, POST, etc.
get_paramsURI argument list passed with the HTTP request.
headersHTTP request header-name/value pair list
Note
Should use the ast_http_send() function for sending content allocated with ast_str and/or content from an opened file descriptor.

Status and status text should be sent as arguments to the ast_http_send() function to reflect the status of the request (200 or 304, for example). Content length is calculated by ast_http_send() automatically.

Static content may be indicated to the ast_http_send() function, to indicate that it may be cached.

For a need authentication response, the ast_http_auth() function should be used.

For an error response, the ast_http_error() function should be used.

Return values
0Continue and process the next HTTP request.
-1Fatal HTTP connection error. Force the HTTP connection closed.

Definition at line 99 of file http.h.

Enumeration Type Documentation

◆ ast_http_method

HTTP Request methods known by Asterisk.

Enumerator
AST_HTTP_UNKNOWN 

Unknown response

AST_HTTP_GET 
AST_HTTP_POST 
AST_HTTP_HEAD 
AST_HTTP_PUT 
AST_HTTP_DELETE 
AST_HTTP_OPTIONS 
AST_HTTP_MAX_METHOD 

Last entry in ast_http_method enum

Definition at line 58 of file http.h.

58 {
59 AST_HTTP_UNKNOWN = -1, /*!< Unknown response */
60 AST_HTTP_GET = 0,
66 AST_HTTP_MAX_METHOD, /*!< Last entry in ast_http_method enum */
67};
@ AST_HTTP_PUT
Definition http.h:63
@ AST_HTTP_DELETE
Definition http.h:64
@ AST_HTTP_POST
Definition http.h:61
@ AST_HTTP_GET
Definition http.h:60
@ AST_HTTP_MAX_METHOD
Definition http.h:66
@ AST_HTTP_UNKNOWN
Definition http.h:59
@ AST_HTTP_OPTIONS
Definition http.h:65
@ AST_HTTP_HEAD
Definition http.h:62

Function Documentation

◆ ast_get_http_method()

const char * ast_get_http_method ( enum ast_http_method  method)

Return http method name string.

Since
1.8

Definition at line 207 of file http.c.

208{
209 int x;
210
211 for (x = 0; x < ARRAY_LEN(ast_http_methods_text); x++) {
213 return ast_http_methods_text[x].text;
214 }
215 }
216
217 return NULL;
218}
static const struct ast_cfhttp_methods_text ast_http_methods_text[]
const char * method
Definition res_pjsip.c:1273
#define NULL
Definition resample.c:96
const char * text
Definition http.c:196
#define ARRAY_LEN(a)
Definition utils.h:706

References ARRAY_LEN, ast_http_methods_text, method, NULL, and ast_cfhttp_methods_text::text.

Referenced by add_allow_header(), ast_ari_callback(), ast_ari_invoke(), auth_http_callback(), and handle_options().

◆ ast_get_http_method_from_string()

enum ast_http_method ast_get_http_method_from_string ( const char *  method)

Return http method from string.

Definition at line 220 of file http.c.

221{
222 int x;
223
224 for (x = 0; x < ARRAY_LEN(ast_http_methods_text); x++) {
227 }
228 }
229
230 return AST_HTTP_UNKNOWN;
231}
int ast_strings_equal(const char *str1, const char *str2)
Compare strings for equality checking for NULL.
Definition strings.c:238
enum ast_http_method method
Definition http.c:195

References ARRAY_LEN, ast_http_methods_text, AST_HTTP_UNKNOWN, ast_strings_equal(), ast_cfhttp_methods_text::method, method, and text.

Referenced by parse_rest_request_msg().

◆ ast_http_auth()

void ast_http_auth ( struct ast_tcptls_session_instance ser,
const char *  realm,
const unsigned long  nonce,
const unsigned long  opaque,
int  stale,
const char *  text 
)

Send http "401 Unauthorized" response and close socket.

Definition at line 688 of file http.c.

691{
692 int status_code = 401;
693 char *status_title = "Unauthorized";
694 struct ast_str *http_header_data = ast_str_create(DEFAULT_RESPONSE_HEADER_LENGTH);
695
696 if (http_header_data) {
697 ast_str_set(&http_header_data,
698 0,
699 "WWW-authenticate: Digest algorithm=MD5, realm=\"%s\", nonce=\"%08lx\", qop=\"auth\", opaque=\"%08lx\"%s\r\n"
700 "Content-type: text/html\r\n",
701 realm ? realm : "Asterisk",
702 nonce,
703 opaque,
704 stale ? ", stale=true" : "");
705 }
706
708 status_code,
709 status_title,
710 http_header_data,
711 text);
712}
void ast_http_create_response(struct ast_tcptls_session_instance *ser, int status_code, const char *status_title, struct ast_str *http_header_data, const char *text)
Creates and sends a formatted http response message.
Definition http.c:633
#define DEFAULT_RESPONSE_HEADER_LENGTH
Definition http.c:82
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition strings.h:659
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition strings.h:1113
Support for dynamic strings.
Definition strings.h:623

References ast_http_create_response(), ast_str_create, ast_str_set(), DEFAULT_RESPONSE_HEADER_LENGTH, and text.

◆ ast_http_body_discard()

int ast_http_body_discard ( struct ast_tcptls_session_instance ser)

Read and discard any unread HTTP request body.

Since
12.4.0
Parameters
serHTTP TCP/TLS session object.
Return values
0on success.
-1on error.

Definition at line 1185 of file http.c.

1186{
1188
1189 request = ser->private_data;
1192 /* No body to read or it has already been read. */
1193 return 0;
1194 }
1196
1197 ast_debug(1, "HTTP discarding unused request body\n");
1198
1199 ast_assert(request->body_length != 0);
1200 if (0 < request->body_length) {
1201 if (http_body_discard_contents(ser, request->body_length, "body")) {
1203 return -1;
1204 }
1205 return 0;
1206 }
1207
1208 /* parse chunked-body */
1209 for (;;) {
1210 int length;
1211
1212 length = http_body_get_chunk_length(ser);
1213 if (length < 0) {
1215 return -1;
1216 }
1217 if (length == 0) {
1218 /* parsed last-chunk */
1219 break;
1220 }
1221
1222 if (http_body_discard_contents(ser, length, "chunk-data")
1225 return -1;
1226 }
1227 }
1228
1229 /* Read and discard any trailer entity-header lines. */
1232 return -1;
1233 }
1234 return 0;
1235}
static int request(void *obj)
static int http_body_discard_chunk_trailer_headers(struct ast_tcptls_session_instance *ser)
Definition http.c:1165
@ HTTP_FLAG_BODY_READ
Definition http.c:509
@ HTTP_FLAG_CLOSE_ON_COMPLETION
Definition http.c:511
@ HTTP_FLAG_HAS_BODY
Definition http.c:507
static int http_body_discard_contents(struct ast_tcptls_session_instance *ser, int length, const char *what_getting)
Definition http.c:1029
static int http_body_check_chunk_sync(struct ast_tcptls_session_instance *ser)
Definition http.c:1134
static int http_body_get_chunk_length(struct ast_tcptls_session_instance *ser)
Definition http.c:1106
#define ast_debug(level,...)
Log a DEBUG message.
#define ast_test_flag(p, flag)
Definition utils.h:64
#define ast_assert(a)
Definition utils.h:779
#define ast_set_flag(p, flag)
Definition utils.h:71

References ast_assert, ast_debug, ast_set_flag, ast_test_flag, http_body_check_chunk_sync(), http_body_discard_chunk_trailer_headers(), http_body_discard_contents(), http_body_get_chunk_length(), HTTP_FLAG_BODY_READ, HTTP_FLAG_CLOSE_ON_COMPLETION, HTTP_FLAG_HAS_BODY, ast_tcptls_session_instance::private_data, and request().

Referenced by ast_http_send(), and ast_websocket_uri_cb().

◆ ast_http_body_read_status()

void ast_http_body_read_status ( struct ast_tcptls_session_instance ser,
int  read_success 
)

Update the body read success status.

Since
12.4.0
Parameters
serHTTP TCP/TLS session object.
read_successTRUE if body was read successfully.

Definition at line 964 of file http.c.

965{
967
968 request = ser->private_data;
971 /* No body to read. */
972 return;
973 }
975 if (!read_success) {
977 }
978}

References ast_set_flag, ast_test_flag, HTTP_FLAG_BODY_READ, HTTP_FLAG_CLOSE_ON_COMPLETION, HTTP_FLAG_HAS_BODY, ast_tcptls_session_instance::private_data, and request().

Referenced by http_post_callback().

◆ ast_http_create_basic_auth_header()

struct ast_variable * ast_http_create_basic_auth_header ( const char *  userid,
const char *  password 
)

Create an HTTP authorization header.

The returned ast_variable must be freed with ast_variables_destroy()

Parameters
useridUser ID or "<userid>:<password>".
passwordPassword if not in userid.
Returns
ast_variable with name="Authorization" and value="Basic <base64enc>"
Return values
NULLif memory allocation failed.

Definition at line 1726 of file http.c.

1728{
1729 int encoded_size = 0;
1730 int userinfo_len = 0;
1731 RAII_VAR(char *, userinfo, NULL, ast_free);
1732 char *encoded_userinfo = NULL;
1733 struct ast_variable *auth_header = NULL;
1734
1735 if (ast_strlen_zero(userid)) {
1736 return NULL;
1737 }
1738
1739 if (strchr(userid, ':')) {
1740 userinfo = ast_strdup(userid);
1741 userinfo_len = strlen(userinfo);
1742 } else {
1743 if (ast_strlen_zero(password)) {
1744 return NULL;
1745 }
1746 userinfo_len = ast_asprintf(&userinfo, "%s:%s", userid, password);
1747 }
1748 if (!userinfo) {
1749 return NULL;
1750 }
1751
1752 /*
1753 * The header value is "Basic " + base64(userinfo).
1754 * Doubling the userinfo length then adding the length
1755 * of the "Basic " prefix is a conservative estimate of the
1756 * final encoded size.
1757 */
1758 encoded_size = userinfo_len * 2 * sizeof(char) + 1 + BASIC_LEN;
1759 encoded_userinfo = ast_alloca(encoded_size);
1760 strcpy(encoded_userinfo, BASIC_PREFIX); /* Safe */
1761 ast_base64encode(encoded_userinfo + BASIC_LEN, (unsigned char *)userinfo,
1762 userinfo_len, encoded_size - BASIC_LEN);
1763
1764 auth_header = ast_variable_new("Authorization",
1765 encoded_userinfo, "");
1766
1767 return auth_header;
1768}
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition astmm.h:288
#define ast_free(a)
Definition astmm.h:180
#define ast_strdup(str)
A wrapper for strdup()
Definition astmm.h:241
#define ast_asprintf(ret, fmt,...)
A wrapper for asprintf()
Definition astmm.h:267
#define BASIC_PREFIX
Definition http.c:1666
#define BASIC_LEN
Definition http.c:1667
#define ast_variable_new(name, value, filename)
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition strings.h:65
Structure for variables, used for configurations and for channel variables.
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition utils.h:981
int ast_base64encode(char *dst, const unsigned char *src, int srclen, int max)
Encode data in base64.
Definition utils.c:404

References ast_alloca, ast_asprintf, ast_base64encode(), ast_free, ast_strdup, ast_strlen_zero(), ast_variable_new, BASIC_LEN, BASIC_PREFIX, NULL, and RAII_VAR.

Referenced by outbound_session_handler_thread(), and websocket_client_handshake().

◆ ast_http_create_response()

void ast_http_create_response ( struct ast_tcptls_session_instance ser,
int  status_code,
const char *  status_title,
struct ast_str http_header_data,
const char *  text 
)

Creates and sends a formatted http response message.

Parameters
serTCP/TLS session object
status_codeHTTP response code (200/401/403/404/500)
status_titleEnglish equivalent to the status_code parameter
http_header_dataThe formatted text to use in the http header
textAdditional informational text to use in the response
Note
Function constructs response headers from the status_code, status_title and http_header_data parameters.

The response body is created as HTML content, from the status_code, status_title, and the text parameters.

The http_header_data parameter will be freed as a result of calling function.

Since
13.2.0

Definition at line 633 of file http.c.

635{
636 char server_name[MAX_SERVER_NAME_LENGTH];
637 struct ast_str *server_address = ast_str_create(MAX_SERVER_NAME_LENGTH);
639
640 if (!http_header_data || !server_address || !out) {
641 ast_free(http_header_data);
642 ast_free(server_address);
643 ast_free(out);
644 if (ser) {
645 ast_debug(1, "HTTP closing session. OOM.\n");
647 }
648 return;
649 }
650
652 ast_xml_escape(http_server_name, server_name, sizeof(server_name));
653 ast_str_set(&server_address,
654 0,
655 "<address>%s</address>\r\n",
656 server_name);
657 }
658
660 0,
661 "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\r\n"
662 "<html><head>\r\n"
663 "<title>%d %s</title>\r\n"
664 "</head><body>\r\n"
665 "<h1>%s</h1>\r\n"
666 "<p>%s</p>\r\n"
667 "<hr />\r\n"
668 "%s"
669 "</body></html>\r\n",
670 status_code,
671 status_title,
672 status_title,
673 text ? text : "",
674 ast_str_buffer(server_address));
675
676 ast_free(server_address);
677
678 ast_http_send(ser,
680 status_code,
681 status_title,
682 http_header_data,
683 out,
684 0,
685 0);
686}
void ast_http_send(struct ast_tcptls_session_instance *ser, enum ast_http_method method, int status_code, const char *status_title, struct ast_str *http_header, struct ast_str *out, int fd, unsigned int static_content)
Generic function for sending HTTP/1.1 response.
Definition http.c:522
#define INITIAL_RESPONSE_BODY_BUFFER
Definition http.c:93
static char http_server_name[MAX_SERVER_NAME_LENGTH]
Definition http.c:105
#define MAX_SERVER_NAME_LENGTH
Definition http.c:80
char *attribute_pure ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition strings.h:761
void ast_tcptls_close_session_file(struct ast_tcptls_session_instance *tcptls_session)
Closes a tcptls session instance's file and/or file descriptor. The tcptls_session will be set to NUL...
Definition tcptls.c:923
FILE * out
Definition utils/frame.c:33
int ast_xml_escape(const char *string, char *outbuf, size_t buflen)
Escape reserved characters for use in XML.
Definition utils.c:898

References ast_debug, ast_free, ast_http_send(), AST_HTTP_UNKNOWN, ast_str_buffer(), ast_str_create, ast_str_set(), ast_strlen_zero(), ast_tcptls_close_session_file(), ast_xml_escape(), http_server_name, INITIAL_RESPONSE_BODY_BUFFER, MAX_SERVER_NAME_LENGTH, out, and text.

Referenced by ast_http_auth(), and ast_http_error().

◆ ast_http_error()

void ast_http_error ( struct ast_tcptls_session_instance ser,
int  status,
const char *  title,
const char *  text 
)

Send HTTP error message and close socket.

Definition at line 714 of file http.c.

716{
717 struct ast_str *http_header_data = ast_str_create(DEFAULT_RESPONSE_HEADER_LENGTH);
718
719 if (http_header_data) {
720 ast_str_set(&http_header_data, 0, "Content-type: text/html\r\n");
721 }
722
724 status_code,
725 status_title,
726 http_header_data,
727 text);
728}

References ast_http_create_response(), ast_str_create, ast_str_set(), DEFAULT_RESPONSE_HEADER_LENGTH, and text.

Referenced by ast_ari_callback(), ast_websocket_uri_cb(), auth_http_callback(), generic_http_callback(), handle_uri(), http_callback(), http_post_callback(), http_request_headers_get(), http_request_tracking_setup(), httpd_helper_thread(), httpd_process_request(), httpstatus_callback(), incoming_ws_http_callback(), phoneprov_callback(), static_callback(), and websocket_bad_request().

◆ ast_http_ftype2mtype()

const char * ast_http_ftype2mtype ( const char *  ftype)

Return mime type based on extension.

Parameters
ftypefilename extension
Returns
String containing associated MIME type
Since
1.8

Definition at line 233 of file http.c.

234{
235 int x;
236
237 if (ftype) {
238 for (x = 0; x < ARRAY_LEN(mimetypes); x++) {
239 if (!strcasecmp(ftype, mimetypes[x].ext)) {
240 return mimetypes[x].mtype;
241 }
242 }
243 }
244 return NULL;
245}
static struct @382 mimetypes[]
Limit the kinds of files we're willing to serve up.
const char * ext
Definition http.c:151

References ARRAY_LEN, ext, mimetypes, and NULL.

Referenced by build_profile(), and static_callback().

◆ ast_http_get_auth()

struct ast_http_auth * ast_http_get_auth ( struct ast_variable headers)

Get HTTP authentication information from headers.

The returned object is AO2 managed, so clean up with ao2_cleanup().

Parameters
headersHTTP request headers.
Returns
HTTP auth structure.
Return values
NULLif no supported HTTP auth headers present.
Since
12

Definition at line 1669 of file http.c.

1670{
1671 struct ast_variable *v;
1672
1673 for (v = headers; v; v = v->next) {
1674 const char *base64;
1675 char decoded[256] = {};
1676 char *username;
1677 char *password;
1678#ifdef AST_DEVMODE
1679 int cnt;
1680#endif /* AST_DEVMODE */
1681
1682 if (strcasecmp("Authorization", v->name) != 0) {
1683 continue;
1684 }
1685
1688 "Unsupported Authorization scheme\n");
1689 continue;
1690 }
1691
1692 /* Basic auth header parsing. RFC 2617, section 2.
1693 * credentials = "Basic" basic-credentials
1694 * basic-credentials = base64-user-pass
1695 * base64-user-pass = <base64 encoding of user-pass,
1696 * except not limited to 76 char/line>
1697 * user-pass = userid ":" password
1698 */
1699
1700 base64 = v->value + BASIC_LEN;
1701
1702 /* This will truncate "userid:password" lines to
1703 * sizeof(decoded). The array is long enough that this shouldn't
1704 * be a problem */
1705#ifdef AST_DEVMODE
1706 cnt =
1707#endif /* AST_DEVMODE */
1708 ast_base64decode((unsigned char*)decoded, base64,
1709 sizeof(decoded) - 1);
1710 ast_assert(cnt < sizeof(decoded));
1711
1712 /* Split the string at the colon */
1713 password = decoded;
1714 username = strsep(&password, ":");
1715 if (!password) {
1716 ast_log(LOG_WARNING, "Invalid Authorization header\n");
1717 return NULL;
1718 }
1719
1720 return auth_create(username, password);
1721 }
1722
1723 return NULL;
1724}
char * strsep(char **str, const char *delims)
#define ast_log
Definition astobj2.c:42
static struct ast_http_auth * auth_create(const char *userid, const char *password)
Definition http.c:1635
#define LOG_DEBUG
#define LOG_WARNING
static int force_inline attribute_pure ast_begins_with(const char *str, const char *prefix)
Checks whether a string begins with another.
Definition strings.h:97
struct ast_variable * next
static char base64[64]
Definition utils.c:80
int ast_base64decode(unsigned char *dst, const char *src, int max)
Decode data from base64.
Definition utils.c:296

References ast_assert, ast_base64decode(), ast_begins_with(), ast_log, auth_create(), base64, BASIC_LEN, BASIC_PREFIX, LOG_DEBUG, LOG_WARNING, ast_variable::name, ast_variable::next, NULL, strsep(), and ast_variable::value.

Referenced by authenticate_user(), and http_callback().

◆ ast_http_get_cookies()

struct ast_variable * ast_http_get_cookies ( struct ast_variable headers)

Get cookie from Request headers.

Definition at line 1622 of file http.c.

1623{
1624 struct ast_variable *v, *cookies = NULL;
1625
1626 for (v = headers; v; v = v->next) {
1627 if (!strcasecmp(v->name, "Cookie")) {
1628 ast_variables_destroy(cookies);
1629 cookies = parse_cookies(v->value);
1630 }
1631 }
1632 return cookies;
1633}
static struct ast_variable * parse_cookies(const char *cookies)
Definition http.c:1588
void ast_variables_destroy(struct ast_variable *var)
Free variable list.
Definition extconf.c:1260

References ast_variables_destroy(), ast_variable::name, ast_variable::next, NULL, parse_cookies(), and ast_variable::value.

Referenced by ast_http_manid_from_vars(), and httpstatus_callback().

◆ ast_http_get_json()

struct ast_json * ast_http_get_json ( struct ast_tcptls_session_instance ser,
struct ast_variable headers 
)

Get JSON from client Request Entity-Body, if content type is application/json.

Parameters
serTCP/TLS session object
headersList of HTTP headers
Returns
Parsed JSON content body
Return values
NULLon error, if no content, or if different content type.
Since
12

Definition at line 1380 of file http.c.

1382{
1383 int content_length = 0;
1384 struct ast_json *body;
1385 RAII_VAR(char *, buf, NULL, ast_free);
1386 RAII_VAR(char *, type, get_content_type(headers), ast_free);
1387
1388 /* Use errno to distinguish errors from no body */
1389 errno = 0;
1390
1391 if (ast_strlen_zero(type) || strcasecmp(type, "application/json")) {
1392 /* Content type is not JSON. Don't read the body. */
1393 return NULL;
1394 }
1395
1396 buf = ast_http_get_contents(&content_length, ser, headers);
1397 if (!buf || !content_length) {
1398 /*
1399 * errno already set
1400 * or it is not an error to have zero content
1401 */
1402 return NULL;
1403 }
1404
1405 body = ast_json_load_buf(buf, content_length, NULL);
1406 if (!body) {
1407 /* Failed to parse JSON; treat as an I/O error */
1408 errno = EIO;
1409 return NULL;
1410 }
1411
1412 return body;
1413}
static const char type[]
char buf[BUFSIZE]
Definition eagi_proxy.c:66
static char * get_content_type(struct ast_variable *headers)
Retrieves the content type specified in the "Content-Type" header.
Definition http.c:828
static char * ast_http_get_contents(int *return_length, struct ast_tcptls_session_instance *ser, struct ast_variable *headers)
Returns the contents (body) of the HTTP request.
Definition http.c:1247
struct ast_json * ast_json_load_buf(const char *buffer, size_t buflen, struct ast_json_error *error)
Parse buffer with known length into a JSON object or array.
Definition json.c:585
int errno
Abstract JSON element (object, array, string, int, ...).

References ast_free, ast_http_get_contents(), ast_json_load_buf(), ast_strlen_zero(), buf, errno, get_content_type(), NULL, RAII_VAR, and type.

Referenced by ast_ari_callback().

◆ ast_http_get_post_vars()

struct ast_variable * ast_http_get_post_vars ( struct ast_tcptls_session_instance ser,
struct ast_variable headers 
)

Get post variables from client Request Entity-Body, if content type is application/x-www-form-urlencoded.

Parameters
serTCP/TLS session object
headersList of HTTP headers
Returns
List of variables within the POST body
Note
Since returned list is malloc'd, list should be free'd by the calling function
Since
1.8

Definition at line 1455 of file http.c.

1457{
1458 int content_length = 0;
1459 RAII_VAR(char *, buf, NULL, ast_free);
1460 RAII_VAR(char *, type, get_content_type(headers), ast_free);
1461
1462 /* Use errno to distinguish errors from no params */
1463 errno = 0;
1464
1465 if (ast_strlen_zero(type) ||
1466 strcasecmp(type, "application/x-www-form-urlencoded")) {
1467 /* Content type is not form data. Don't read the body. */
1468 return NULL;
1469 }
1470
1471 buf = ast_http_get_contents(&content_length, ser, headers);
1472 if (!buf || !content_length) {
1473 /*
1474 * errno already set
1475 * or it is not an error to have zero content
1476 */
1477 return NULL;
1478 }
1479
1480 return ast_http_parse_post_form(buf, content_length, type);
1481}
struct ast_variable * ast_http_parse_post_form(char *buf, int content_length, const char *content_type)
Get post variables from an application/x-www-form-urlencoded buffer.
Definition http.c:1419

References ast_free, ast_http_get_contents(), ast_http_parse_post_form(), ast_strlen_zero(), buf, errno, get_content_type(), NULL, RAII_VAR, and type.

Referenced by ast_ari_callback(), auth_http_callback(), and generic_http_callback().

◆ ast_http_header_match()

int ast_http_header_match ( const char *  name,
const char *  expected_name,
const char *  value,
const char *  expected_value 
)

Check if the header and value match (case insensitive) their associated expected values.

Parameters
nameheader name to check
expected_namethe expected name of the header
valueheader value to check
expected_valuethe expected value of the header
Return values
0if the name and expected name do not match
-1if the value and expected value do not match
1if the both the name and value match their expected value
Since
13

Definition at line 1844 of file http.c.

1846{
1847 if (strcasecmp(name, expected_name)) {
1848 /* no value to validate if names don't match */
1849 return 0;
1850 }
1851
1852 if (strcasecmp(value, expected_value)) {
1853 ast_log(LOG_ERROR, "Invalid header value - expected %s "
1854 "received %s", value, expected_value);
1855 return -1;
1856 }
1857 return 1;
1858}
static const char name[]
Definition format_mp3.c:68
#define LOG_ERROR
int value
Definition syslog.c:37

References ast_log, LOG_ERROR, name, and value.

Referenced by websocket_client_handshake_get_response().

◆ ast_http_header_match_in()

int ast_http_header_match_in ( const char *  name,
const char *  expected_name,
const char *  value,
const char *  expected_value 
)

Check if the header name matches the expected header name. If so, then check to see if the value can be located in the expected value.

Note
Both header and value checks are case insensitive.
Parameters
nameheader name to check
expected_namethe expected name of the header
valueheader value to check if in expected value
expected_valuethe expected value(s)
Return values
0if the name and expected name do not match
-1if the value and is not in the expected value
1if the name matches expected name and value is in expected value
Since
13

Definition at line 1860 of file http.c.

1862{
1863 if (strcasecmp(name, expected_name)) {
1864 /* no value to validate if names don't match */
1865 return 0;
1866 }
1867
1868 if (!strcasestr(expected_value, value)) {
1869 ast_log(LOG_ERROR, "Header '%s' - could not locate '%s' "
1870 "in '%s'\n", name, value, expected_value);
1871 return -1;
1872
1873 }
1874 return 1;
1875}
char * strcasestr(const char *, const char *)

References ast_log, LOG_ERROR, name, strcasestr(), and value.

Referenced by websocket_client_handshake_get_response().

◆ ast_http_header_parse()

int ast_http_header_parse ( char *  buf,
char **  name,
char **  value 
)

Parse a header into the given name/value strings.

Note
This modifies the given buffer and the out parameters point (not allocated) to the start of the header name and header value, respectively.
Parameters
bufa string containing the name/value to point to
[out]nameheader name
[out]valueheader value
Return values
-1if buf is empty
0if buf could be separated into name and value
1if name or value portion don't exist
Since
13

Definition at line 1822 of file http.c.

1823{
1825 if (ast_strlen_zero(buf)) {
1826 return -1;
1827 }
1828
1829 *value = buf;
1830 *name = strsep(value, ":");
1831 if (!*value) {
1832 return 1;
1833 }
1834
1837 return 1;
1838 }
1839
1841 return 0;
1842}
static void remove_excess_lws(char *s)
Definition http.c:1793
char * ast_trim_blanks(char *str)
Trims trailing whitespace characters from a string.
Definition strings.h:186
char *attribute_pure ast_skip_blanks(const char *str)
Gets a pointer to the first non-whitespace character in a string.
Definition strings.h:161

References ast_skip_blanks(), ast_strlen_zero(), ast_trim_blanks(), buf, name, remove_excess_lws(), strsep(), and value.

Referenced by websocket_client_handshake_get_response().

◆ ast_http_manid_from_vars()

uint32_t ast_http_manid_from_vars ( struct ast_variable headers)

Return manager id, if exist, from request headers.

Parameters
headersList of HTTP headers
Returns
32-bit associated manager session identifier
Since
1.8

Definition at line 247 of file http.c.

248{
249 uint32_t mngid = 0;
250 struct ast_variable *v, *cookies;
251
252 cookies = ast_http_get_cookies(headers);
253 for (v = cookies; v; v = v->next) {
254 if (!strcasecmp(v->name, "mansession_id")) {
255 sscanf(v->value, "%30x", &mngid);
256 break;
257 }
258 }
259 ast_variables_destroy(cookies);
260 return mngid;
261}
struct ast_variable * ast_http_get_cookies(struct ast_variable *headers)
Get cookie from Request headers.
Definition http.c:1622

References ast_http_get_cookies(), ast_variables_destroy(), ast_variable::name, ast_variable::next, and ast_variable::value.

Referenced by generic_http_callback(), http_post_callback(), and static_callback().

◆ ast_http_parse_post_form()

struct ast_variable * ast_http_parse_post_form ( char *  buf,
int  content_length,
const char *  content_type 
)

Get post variables from an application/x-www-form-urlencoded buffer.

Parameters
bufinput buffer
content_lenBuffer length
content_typeContent type (must be "application/x-www-form-urlencoded")
Warning
The input buffer will be modified by strsep() so pass in a copy if you need to keep the original.
Returns
List of ast_variables from the buffer. Must be freed with ast_variables_destroy().

Definition at line 1419 of file http.c.

1421{
1422 struct ast_variable *v, *post_vars=NULL, *prev = NULL;
1423 char *var, *val;
1424
1425 /* Use errno to distinguish errors from no params */
1426 errno = 0;
1427
1428 if (ast_strlen_zero(content_type) ||
1429 strcasecmp(content_type, "application/x-www-form-urlencoded") != 0) {
1430 /* Content type is not form data. Don't read the body. */
1431 return NULL;
1432 }
1433
1434 while ((val = strsep(&buf, "&"))) {
1435 var = strsep(&val, "=");
1436 if (val) {
1438 } else {
1439 val = "";
1440 }
1442 if ((v = ast_variable_new(var, val, ""))) {
1443 if (post_vars) {
1444 prev->next = v;
1445 } else {
1446 post_vars = v;
1447 }
1448 prev = v;
1449 }
1450 }
1451
1452 return post_vars;
1453}
#define var
Definition ast_expr2f.c:605
void ast_uri_decode(char *s, struct ast_flags spec)
Decode URI, URN, URL (overwrite string)
Definition utils.c:760
const struct ast_flags ast_uri_http_legacy
Definition utils.c:718

References ast_strlen_zero(), ast_uri_decode(), ast_uri_http_legacy, ast_variable_new, buf, errno, NULL, strsep(), and var.

Referenced by ast_http_get_post_vars(), and parse_rest_request_msg().

◆ ast_http_prefix()

void ast_http_prefix ( char *  buf,
int  len 
)

Return the current prefix.

Parameters
[out]bufdestination buffer for previous
[in]lenlength of prefix to copy
Since
1.6.1

Definition at line 263 of file http.c.

264{
265 if (buf) {
267 }
268}
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
static char prefix[MAX_PREFIX]
Definition http.c:145
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition strings.h:425

References ast_copy_string(), buf, len(), and prefix.

◆ ast_http_request_close_on_completion()

void ast_http_request_close_on_completion ( struct ast_tcptls_session_instance ser)

Request the HTTP connection be closed after this HTTP request.

Since
12.4.0
Parameters
serHTTP TCP/TLS session object.
Note
Call before ast_http_error() to make the connection close.

Definition at line 903 of file http.c.

References ast_set_flag, HTTP_FLAG_CLOSE_ON_COMPLETION, ast_tcptls_session_instance::private_data, and request().

Referenced by ast_ari_callback(), ast_ari_invoke(), auth_http_callback(), generic_http_callback(), handle_uri(), http_callback(), http_post_callback(), httpstatus_callback(), static_callback(), and websocket_bad_request().

◆ ast_http_response_status_line()

int ast_http_response_status_line ( const char *  buf,
const char *  version,
int  code 
)

Parse the http response status line.

Parameters
bufthe http response line information
versionthe expected http version (e.g. HTTP/1.1)
codethe expected status code
Return values
-1if version didn't match or status code conversion fails.
Returns
status code (>0)
Since
13

Definition at line 1770 of file http.c.

1771{
1772 int status_code;
1773 size_t size = strlen(version);
1774
1775 if (strncmp(buf, version, size) || buf[size] != ' ') {
1776 ast_log(LOG_ERROR, "HTTP version not supported - "
1777 "expected %s\n", version);
1778 return -1;
1779 }
1780
1781 /* skip to status code (version + space) */
1782 buf += size + 1;
1783
1784 if (sscanf(buf, "%d", &status_code) != 1) {
1785 ast_log(LOG_ERROR, "Could not read HTTP status code - "
1786 "%s\n", buf);
1787 return -1;
1788 }
1789
1790 return status_code;
1791}
static char version[AST_MAX_EXTENSION]

References ast_log, buf, LOG_ERROR, and version.

Referenced by websocket_client_handshake_get_response().

◆ ast_http_send()

void ast_http_send ( struct ast_tcptls_session_instance ser,
enum ast_http_method  method,
int  status_code,
const char *  status_title,
struct ast_str http_header,
struct ast_str out,
int  fd,
unsigned int  static_content 
)

Generic function for sending HTTP/1.1 response.

Parameters
serTCP/TLS session object
methodGET/POST/HEAD
status_codeHTTP response code (200/401/403/404/500)
status_titleEnglish equivalent to the status_code parameter
http_headerAn ast_str object containing all headers
outAn ast_str object containing the body of the response
fdIf out is NULL, a file descriptor where the body of the response is held (otherwise -1)
static_contentZero if the content is dynamically generated and should not be cached; nonzero otherwise
Note
Function determines the HTTP response header from status_code, status_header, and http_header.

Extra HTTP headers MUST be present only in the http_header argument. The argument "out" should contain only content of the response (no headers!).

HTTP content can be constructed from the argument "out", if it is not NULL; otherwise, the function will read content from FD.

This function calculates the content-length http header itself.

Both the http_header and out arguments will be freed by this function; however, if FD is open, it will remain open.

Since
1.8

Definition at line 522 of file http.c.

526{
527 struct timeval now = ast_tvnow();
528 struct ast_tm tm;
529 char timebuf[80];
530 char buf[256];
531 int len;
532 int content_length = 0;
533 int close_connection;
534 struct ast_str *server_header_field = ast_str_create(MAX_SERVER_NAME_LENGTH);
535 int send_content;
536
537 if (!ser || !server_header_field) {
538 /* The connection is not open. */
539 ast_free(http_header);
540 ast_free(out);
541 ast_free(server_header_field);
542 return;
543 }
544
546 ast_str_set(&server_header_field,
547 0,
548 "Server: %s\r\n",
550 }
551
552 /*
553 * We shouldn't be sending non-final status codes to this
554 * function because we may close the connection before
555 * returning.
556 */
557 ast_assert(200 <= status_code);
558
559 if (session_keep_alive <= 0) {
560 close_connection = 1;
561 } else {
563
564 request = ser->private_data;
565 if (!request
567 || ast_http_body_discard(ser)) {
568 close_connection = 1;
569 } else {
570 close_connection = 0;
571 }
572 }
573
574 ast_strftime(timebuf, sizeof(timebuf), "%a, %d %b %Y %H:%M:%S GMT", ast_localtime(&now, &tm, "GMT"));
575
576 /* calc content length */
577 if (out) {
578 content_length += ast_str_strlen(out);
579 }
580
581 if (fd) {
582 content_length += lseek(fd, 0, SEEK_END);
583 lseek(fd, 0, SEEK_SET);
584 }
585
586 send_content = method != AST_HTTP_HEAD || status_code >= 400;
587
588 /* send http header */
590 "HTTP/1.1 %d %s\r\n"
591 "%s"
592 "Date: %s\r\n"
593 "%s"
594 "%s"
595 "%s"
596 "Content-Length: %d\r\n"
597 "\r\n"
598 "%s",
599 status_code, status_title ? status_title : "OK",
600 ast_str_buffer(server_header_field),
601 timebuf,
602 close_connection ? "Connection: close\r\n" : "",
603 static_content ? "" : "Cache-Control: no-cache, no-store\r\n",
604 http_header ? ast_str_buffer(http_header) : "",
605 content_length,
606 send_content && out && ast_str_strlen(out) ? ast_str_buffer(out) : ""
607 ) <= 0) {
608 ast_debug(1, "ast_iostream_printf() failed: %s\n", strerror(errno));
609 close_connection = 1;
610 } else if (send_content && fd) {
611 /* send file content */
612 while ((len = read(fd, buf, sizeof(buf))) > 0) {
613 if (ast_iostream_write(ser->stream, buf, len) != len) {
614 ast_debug(1, "ast_iostream_write() failed: %s\n", strerror(errno));
615 close_connection = 1;
616 break;
617 }
618 }
619 }
620
621 ast_free(http_header);
622 ast_free(out);
623 ast_free(server_header_field);
624
625 if (close_connection) {
626 ast_debug(1, "HTTP closing session. status_code:%d\n", status_code);
628 } else {
629 ast_debug(1, "HTTP keeping session open. status_code:%d\n", status_code);
630 }
631}
int ast_http_body_discard(struct ast_tcptls_session_instance *ser)
Read and discard any unread HTTP request body.
Definition http.c:1185
static int session_keep_alive
Definition http.c:109
ssize_t ast_iostream_printf(struct ast_iostream *stream, const char *format,...)
Write a formatted string to an iostream.
Definition iostream.c:502
ssize_t ast_iostream_write(struct ast_iostream *stream, const void *buffer, size_t count)
Write data to an iostream.
Definition iostream.c:385
struct ast_tm * ast_localtime(const struct timeval *timep, struct ast_tm *p_tm, const char *zone)
Timezone-independent version of localtime_r(3).
Definition localtime.c:1739
int ast_strftime(char *buf, size_t len, const char *format, const struct ast_tm *tm)
Special version of strftime(3) that handles fractions of a second. Takes the same arguments as strfti...
Definition localtime.c:2524
size_t attribute_pure ast_str_strlen(const struct ast_str *buf)
Returns the current length of the string stored within buf.
Definition strings.h:730
struct ast_iostream * stream
Definition tcptls.h:162
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition time.h:159

References ast_assert, ast_debug, ast_free, ast_http_body_discard(), AST_HTTP_HEAD, ast_iostream_printf(), ast_iostream_write(), ast_localtime(), ast_str_buffer(), ast_str_create, ast_str_set(), ast_str_strlen(), ast_strftime(), ast_strlen_zero(), ast_tcptls_close_session_file(), ast_test_flag, ast_tvnow(), buf, errno, HTTP_FLAG_CLOSE_ON_COMPLETION, http_server_name, len(), MAX_SERVER_NAME_LENGTH, method, out, ast_tcptls_session_instance::private_data, request(), session_keep_alive, and ast_tcptls_session_instance::stream.

Referenced by ast_ari_callback(), ast_http_create_response(), auth_http_callback(), generic_http_callback(), handle_uri(), http_callback(), http_callback(), httpstatus_callback(), phoneprov_callback(), static_callback(), and websocket_bad_request().

◆ ast_http_uri_link()

int ast_http_uri_link ( struct ast_http_uri urih)

Register a URI handler.

Register a URI handler.

They are sorted by length of the string, not alphabetically. Duplicate entries are not replaced, but the insertion order (using <= and not just <) makes sure that more recent insertions hide older ones. On a lookup, we just scan the list and stop at the first matching entry.

Definition at line 739 of file http.c.

740{
741 struct ast_http_uri *uri;
742 int len = strlen(urih->uri);
743
745
746 urih->prefix = prefix;
747
748 if ( AST_RWLIST_EMPTY(&uris) || strlen(AST_RWLIST_FIRST(&uris)->uri) <= len ) {
751 return 0;
752 }
753
755 if (AST_RWLIST_NEXT(uri, entry) &&
756 strlen(AST_RWLIST_NEXT(uri, entry)->uri) <= len) {
759
760 return 0;
761 }
762 }
763
765
767
768 return 0;
769}
#define AST_RWLIST_EMPTY
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition linkedlists.h:52
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
#define AST_RWLIST_INSERT_AFTER
#define AST_RWLIST_NEXT
#define AST_RWLIST_FIRST
#define AST_RWLIST_TRAVERSE
#define AST_RWLIST_INSERT_HEAD
#define AST_RWLIST_INSERT_TAIL
Definition of a URI handler.
Definition http.h:102
struct ast_http_uri::@237 entry
const char * prefix
Definition http.h:106
const char * uri
Definition http.h:105
Definition http.c:142

References AST_RWLIST_EMPTY, AST_RWLIST_FIRST, AST_RWLIST_INSERT_AFTER, AST_RWLIST_INSERT_HEAD, AST_RWLIST_INSERT_TAIL, AST_RWLIST_NEXT, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_http_uri::entry, len(), ast_http_uri::prefix, prefix, and ast_http_uri::uri.

Referenced by __ast_http_load(), __ast_http_post_load(), __init_manager(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), reload_module(), and reload_module().

◆ ast_http_uri_unlink()

void ast_http_uri_unlink ( struct ast_http_uri urihandler)

◆ ast_http_uri_unlink_all_with_key()

void ast_http_uri_unlink_all_with_key ( const char *  key)

Unregister all handlers with matching key.

Definition at line 778 of file http.c.

779{
780 struct ast_http_uri *urih;
783 if (!strcmp(urih->key, key)) {
785 if (urih->dmallocd) {
786 ast_free(urih->data);
787 }
788 if (urih->mallocd) {
789 ast_free(urih);
790 }
791 }
792 }
795}
#define AST_RWLIST_REMOVE_CURRENT
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
#define AST_RWLIST_TRAVERSE_SAFE_END
unsigned int dmallocd
Definition http.h:112
void * data
Definition http.h:116
const char * key
Definition http.h:118
unsigned int mallocd
Definition http.h:110

References ast_free, AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_http_uri::data, ast_http_uri::dmallocd, ast_http_uri::entry, ast_http_uri::key, and ast_http_uri::mallocd.

Referenced by __ast_http_post_load(), and unload_module().