Asterisk - The Open Source Telephony Project  GIT-master-a24979a
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. More...
 

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. More...
 
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. More...
 
int ast_http_body_discard (struct ast_tcptls_session_instance *ser)
 Read and discard any unread HTTP request body. More...
 
void ast_http_body_read_status (struct ast_tcptls_session_instance *ser, int read_success)
 Update the body read success status. More...
 
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. More...
 
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. More...
 
const char * ast_http_ftype2mtype (const char *ftype) attribute_pure
 Return mime type based on extension. More...
 
struct ast_http_authast_http_get_auth (struct ast_variable *headers)
 Get HTTP authentication information from headers. More...
 
struct ast_variableast_http_get_cookies (struct ast_variable *headers)
 Get cookie from Request headers. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
int ast_http_header_parse (char *buf, char **name, char **value)
 Parse a header into the given name/value strings. More...
 
uint32_t ast_http_manid_from_vars (struct ast_variable *headers) attribute_pure
 Return manager id, if exist, from request headers. More...
 
void ast_http_prefix (char *buf, int len)
 Return the current prefix. More...
 
void ast_http_request_close_on_completion (struct ast_tcptls_session_instance *ser)
 Request the HTTP connection be closed after this HTTP request. More...
 
int ast_http_response_status_line (const char *buf, const char *version, int code)
 Parse the http response status line. More...
 
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. More...
 
int ast_http_uri_link (struct ast_http_uri *urihandler)
 Register a URI handler. More...
 
void ast_http_uri_unlink (struct ast_http_uri *urihandler)
 Unregister a URI handler. More...
 
void ast_http_uri_unlink_all_with_key (const char *key)
 Unregister all handlers with matching key. More...
 

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 193 of file http.c.

194 {
195  int x;
196 
197  for (x = 0; x < ARRAY_LEN(ast_http_methods_text); x++) {
198  if (ast_http_methods_text[x].method == method) {
199  return ast_http_methods_text[x].text;
200  }
201  }
202 
203  return NULL;
204 }
static const struct ast_cfhttp_methods_text ast_http_methods_text[]
const char * method
Definition: res_pjsip.c:1130
#define NULL
Definition: resample.c:96
const char * text
Definition: http.c:182
#define ARRAY_LEN(a)
Definition: utils.h:661

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

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

◆ 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 625 of file http.c.

628 {
629  int status_code = 401;
630  char *status_title = "Unauthorized";
631  struct ast_str *http_header_data = ast_str_create(DEFAULT_RESPONSE_HEADER_LENGTH);
632 
633  if (http_header_data) {
634  ast_str_set(&http_header_data,
635  0,
636  "WWW-authenticate: Digest algorithm=MD5, realm=\"%s\", nonce=\"%08lx\", qop=\"auth\", opaque=\"%08lx\"%s\r\n"
637  "Content-type: text/html\r\n",
638  realm ? realm : "Asterisk",
639  nonce,
640  opaque,
641  stale ? ", stale=true" : "");
642  }
643 
645  status_code,
646  status_title,
647  http_header_data,
648  text);
649 }
char * text
Definition: app_queue.c:1641
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:570
#define DEFAULT_RESPONSE_HEADER_LENGTH
Definition: http.c:81
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition: strings.h:640
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:1091
Support for dynamic strings.
Definition: strings.h:604

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

Referenced by auth_http_callback().

◆ 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 1122 of file http.c.

1123 {
1125 
1126  request = ser->private_data;
1128  || ast_test_flag(&request->flags, HTTP_FLAG_BODY_READ)) {
1129  /* No body to read or it has already been read. */
1130  return 0;
1131  }
1133 
1134  ast_debug(1, "HTTP discarding unused request body\n");
1135 
1136  ast_assert(request->body_length != 0);
1137  if (0 < request->body_length) {
1138  if (http_body_discard_contents(ser, request->body_length, "body")) {
1140  return -1;
1141  }
1142  return 0;
1143  }
1144 
1145  /* parse chunked-body */
1146  for (;;) {
1147  int length;
1148 
1149  length = http_body_get_chunk_length(ser);
1150  if (length < 0) {
1152  return -1;
1153  }
1154  if (length == 0) {
1155  /* parsed last-chunk */
1156  break;
1157  }
1158 
1159  if (http_body_discard_contents(ser, length, "chunk-data")
1160  || http_body_check_chunk_sync(ser)) {
1162  return -1;
1163  }
1164  }
1165 
1166  /* Read and discard any trailer entity-header lines. */
1169  return -1;
1170  }
1171  return 0;
1172 }
static int request(void *obj)
Definition: chan_pjsip.c:2580
static int http_body_discard_chunk_trailer_headers(struct ast_tcptls_session_instance *ser)
Definition: http.c:1102
@ HTTP_FLAG_BODY_READ
Definition: http.c:446
@ HTTP_FLAG_CLOSE_ON_COMPLETION
Definition: http.c:448
@ HTTP_FLAG_HAS_BODY
Definition: http.c:444
static int http_body_discard_contents(struct ast_tcptls_session_instance *ser, int length, const char *what_getting)
Definition: http.c:966
static int http_body_check_chunk_sync(struct ast_tcptls_session_instance *ser)
Definition: http.c:1071
static int http_body_get_chunk_length(struct ast_tcptls_session_instance *ser)
Definition: http.c:1043
#define ast_debug(level,...)
Log a DEBUG message.
#define ast_test_flag(p, flag)
Definition: utils.h:63
#define ast_assert(a)
Definition: utils.h:734
#define ast_set_flag(p, flag)
Definition: utils.h:70

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 901 of file http.c.

902 {
904 
905  request = ser->private_data;
908  /* No body to read. */
909  return;
910  }
912  if (!read_success) {
914  }
915 }

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_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 570 of file http.c.

572 {
573  char server_name[MAX_SERVER_NAME_LENGTH];
574  struct ast_str *server_address = ast_str_create(MAX_SERVER_NAME_LENGTH);
576 
577  if (!http_header_data || !server_address || !out) {
578  ast_free(http_header_data);
579  ast_free(server_address);
580  ast_free(out);
581  if (ser) {
582  ast_debug(1, "HTTP closing session. OOM.\n");
584  }
585  return;
586  }
587 
589  ast_xml_escape(http_server_name, server_name, sizeof(server_name));
590  ast_str_set(&server_address,
591  0,
592  "<address>%s</address>\r\n",
593  server_name);
594  }
595 
596  ast_str_set(&out,
597  0,
598  "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\r\n"
599  "<html><head>\r\n"
600  "<title>%d %s</title>\r\n"
601  "</head><body>\r\n"
602  "<h1>%s</h1>\r\n"
603  "<p>%s</p>\r\n"
604  "<hr />\r\n"
605  "%s"
606  "</body></html>\r\n",
607  status_code,
608  status_title,
609  status_title,
610  text ? text : "",
611  ast_str_buffer(server_address));
612 
613  ast_free(server_address);
614 
615  ast_http_send(ser,
617  status_code,
618  status_title,
619  http_header_data,
620  out,
621  0,
622  0);
623 }
#define ast_free(a)
Definition: astmm.h:180
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:459
#define INITIAL_RESPONSE_BODY_BUFFER
Definition: http.c:92
static char http_server_name[MAX_SERVER_NAME_LENGTH]
Definition: http.c:104
#define MAX_SERVER_NAME_LENGTH
Definition: http.c:79
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:739
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
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:903
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: main/utils.c:864

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 651 of file http.c.

653 {
654  struct ast_str *http_header_data = ast_str_create(DEFAULT_RESPONSE_HEADER_LENGTH);
655 
656  if (http_header_data) {
657  ast_str_set(&http_header_data, 0, "Content-type: text/html\r\n");
658  }
659 
661  status_code,
662  status_title,
663  http_header_data,
664  text);
665 }

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

Referenced by ast_ari_callback(), ast_ari_events_event_websocket_ws_attempted_cb(), ast_websocket_uri_cb(), auth_http_callback(), event_session_allocation_error_handler(), 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(), 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 206 of file http.c.

207 {
208  int x;
209 
210  if (ftype) {
211  for (x = 0; x < ARRAY_LEN(mimetypes); x++) {
212  if (!strcasecmp(ftype, mimetypes[x].ext)) {
213  return mimetypes[x].mtype;
214  }
215  }
216  }
217  return NULL;
218 }
static struct @389 mimetypes[]
Limit the kinds of files we're willing to serve up.
const char * ext
Definition: http.c:150

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 1582 of file http.c.

1583 {
1584  struct ast_variable *v;
1585 
1586  for (v = headers; v; v = v->next) {
1587  const char *base64;
1588  char decoded[256] = {};
1589  char *username;
1590  char *password;
1591 #ifdef AST_DEVMODE
1592  int cnt;
1593 #endif /* AST_DEVMODE */
1594 
1595  if (strcasecmp("Authorization", v->name) != 0) {
1596  continue;
1597  }
1598 
1599  if (!ast_begins_with(v->value, BASIC_PREFIX)) {
1601  "Unsupported Authorization scheme\n");
1602  continue;
1603  }
1604 
1605  /* Basic auth header parsing. RFC 2617, section 2.
1606  * credentials = "Basic" basic-credentials
1607  * basic-credentials = base64-user-pass
1608  * base64-user-pass = <base64 encoding of user-pass,
1609  * except not limited to 76 char/line>
1610  * user-pass = userid ":" password
1611  */
1612 
1613  base64 = v->value + BASIC_LEN;
1614 
1615  /* This will truncate "userid:password" lines to
1616  * sizeof(decoded). The array is long enough that this shouldn't
1617  * be a problem */
1618 #ifdef AST_DEVMODE
1619  cnt =
1620 #endif /* AST_DEVMODE */
1621  ast_base64decode((unsigned char*)decoded, base64,
1622  sizeof(decoded) - 1);
1623  ast_assert(cnt < sizeof(decoded));
1624 
1625  /* Split the string at the colon */
1626  password = decoded;
1627  username = strsep(&password, ":");
1628  if (!password) {
1629  ast_log(LOG_WARNING, "Invalid Authorization header\n");
1630  return NULL;
1631  }
1632 
1633  return auth_create(username, password);
1634  }
1635 
1636  return NULL;
1637 }
#define ast_log
Definition: astobj2.c:42
static struct ast_http_auth * auth_create(const char *userid, const char *password)
Definition: http.c:1548
#define BASIC_PREFIX
Definition: http.c:1579
#define BASIC_LEN
Definition: http.c:1580
char * strsep(char **str, const char *delims)
#define LOG_DEBUG
#define LOG_WARNING
static char base64[64]
Definition: main/utils.c:80
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
Structure for variables, used for configurations and for channel variables.
struct ast_variable * next
int ast_base64decode(unsigned char *dst, const char *src, int max)
Decode data from base64.
Definition: main/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 1535 of file http.c.

1536 {
1537  struct ast_variable *v, *cookies = NULL;
1538 
1539  for (v = headers; v; v = v->next) {
1540  if (!strcasecmp(v->name, "Cookie")) {
1541  ast_variables_destroy(cookies);
1542  cookies = parse_cookies(v->value);
1543  }
1544  }
1545  return cookies;
1546 }
static struct ast_variable * parse_cookies(const char *cookies)
Definition: http.c:1501
void ast_variables_destroy(struct ast_variable *var)
Free variable list.
Definition: extconf.c:1262

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 1317 of file http.c.

1319 {
1320  int content_length = 0;
1321  struct ast_json *body;
1322  RAII_VAR(char *, buf, NULL, ast_free);
1323  RAII_VAR(char *, type, get_content_type(headers), ast_free);
1324 
1325  /* Use errno to distinguish errors from no body */
1326  errno = 0;
1327 
1328  if (ast_strlen_zero(type) || strcasecmp(type, "application/json")) {
1329  /* Content type is not JSON. Don't read the body. */
1330  return NULL;
1331  }
1332 
1333  buf = ast_http_get_contents(&content_length, ser, headers);
1334  if (!buf || !content_length) {
1335  /*
1336  * errno already set
1337  * or it is not an error to have zero content
1338  */
1339  return NULL;
1340  }
1341 
1342  body = ast_json_load_buf(buf, content_length, NULL);
1343  if (!body) {
1344  /* Failed to parse JSON; treat as an I/O error */
1345  errno = EIO;
1346  return NULL;
1347  }
1348 
1349  return body;
1350 }
static const char type[]
Definition: chan_ooh323.c:109
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
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:1184
static char * get_content_type(struct ast_variable *headers)
Retrieves the content type specified in the "Content-Type" header.
Definition: http.c:765
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:564
int errno
Abstract JSON element (object, array, string, int, ...).
#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:936

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 1356 of file http.c.

1358 {
1359  int content_length = 0;
1360  struct ast_variable *v, *post_vars=NULL, *prev = NULL;
1361  char *var, *val;
1362  RAII_VAR(char *, buf, NULL, ast_free);
1363  RAII_VAR(char *, type, get_content_type(headers), ast_free);
1364 
1365  /* Use errno to distinguish errors from no params */
1366  errno = 0;
1367 
1368  if (ast_strlen_zero(type) ||
1369  strcasecmp(type, "application/x-www-form-urlencoded")) {
1370  /* Content type is not form data. Don't read the body. */
1371  return NULL;
1372  }
1373 
1374  buf = ast_http_get_contents(&content_length, ser, headers);
1375  if (!buf || !content_length) {
1376  /*
1377  * errno already set
1378  * or it is not an error to have zero content
1379  */
1380  return NULL;
1381  }
1382 
1383  while ((val = strsep(&buf, "&"))) {
1384  var = strsep(&val, "=");
1385  if (val) {
1387  } else {
1388  val = "";
1389  }
1391  if ((v = ast_variable_new(var, val, ""))) {
1392  if (post_vars) {
1393  prev->next = v;
1394  } else {
1395  post_vars = v;
1396  }
1397  prev = v;
1398  }
1399  }
1400 
1401  return post_vars;
1402 }
#define var
Definition: ast_expr2f.c:614
#define ast_variable_new(name, value, filename)
Definition: ast_expr2.c:325
void ast_uri_decode(char *s, struct ast_flags spec)
Decode URI, URN, URL (overwrite string)
Definition: main/utils.c:762
const struct ast_flags ast_uri_http_legacy
Definition: main/utils.c:720

References ast_free, ast_http_get_contents(), ast_strlen_zero(), ast_uri_decode(), ast_uri_http_legacy, ast_variable_new, buf, errno, get_content_type(), NULL, RAII_VAR, strsep(), type, and var.

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 1713 of file http.c.

1715 {
1716  if (strcasecmp(name, expected_name)) {
1717  /* no value to validate if names don't match */
1718  return 0;
1719  }
1720 
1721  if (strcasecmp(value, expected_value)) {
1722  ast_log(LOG_ERROR, "Invalid header value - expected %s "
1723  "received %s", value, expected_value);
1724  return -1;
1725  }
1726  return 1;
1727 }
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.

◆ 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 1729 of file http.c.

1731 {
1732  if (strcasecmp(name, expected_name)) {
1733  /* no value to validate if names don't match */
1734  return 0;
1735  }
1736 
1737  if (!strcasestr(expected_value, value)) {
1738  ast_log(LOG_ERROR, "Header '%s' - could not locate '%s' "
1739  "in '%s'\n", name, value, expected_value);
1740  return -1;
1741 
1742  }
1743  return 1;
1744 }
char * strcasestr(const char *, const char *)

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

◆ 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 1691 of file http.c.

1692 {
1694  if (ast_strlen_zero(buf)) {
1695  return -1;
1696  }
1697 
1698  *value = buf;
1699  *name = strsep(value, ":");
1700  if (!*value) {
1701  return 1;
1702  }
1703 
1706  return 1;
1707  }
1708 
1710  return 0;
1711 }
static void remove_excess_lws(char *s)
Definition: http.c:1662
char * ast_trim_blanks(char *str)
Trims trailing whitespace characters from a string.
Definition: strings.h:186
char * 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.

◆ 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 220 of file http.c.

221 {
222  uint32_t mngid = 0;
223  struct ast_variable *v, *cookies;
224 
225  cookies = ast_http_get_cookies(headers);
226  for (v = cookies; v; v = v->next) {
227  if (!strcasecmp(v->name, "mansession_id")) {
228  sscanf(v->value, "%30x", &mngid);
229  break;
230  }
231  }
232  ast_variables_destroy(cookies);
233  return mngid;
234 }
struct ast_variable * ast_http_get_cookies(struct ast_variable *headers)
Get cookie from Request headers.
Definition: http.c:1535

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_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 236 of file http.c.

237 {
238  if (buf) {
240  }
241 }
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:144
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:406

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 840 of file http.c.

841 {
843 
845 }

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

Referenced by ast_ari_callback(), 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 1639 of file http.c.

1640 {
1641  int status_code;
1642  size_t size = strlen(version);
1643 
1644  if (strncmp(buf, version, size) || buf[size] != ' ') {
1645  ast_log(LOG_ERROR, "HTTP version not supported - "
1646  "expected %s\n", version);
1647  return -1;
1648  }
1649 
1650  /* skip to status code (version + space) */
1651  buf += size + 1;
1652 
1653  if (sscanf(buf, "%d", &status_code) != 1) {
1654  ast_log(LOG_ERROR, "Could not read HTTP status code - "
1655  "%s\n", buf);
1656  return -1;
1657  }
1658 
1659  return status_code;
1660 }
static char version[AST_MAX_EXTENSION]
Definition: chan_ooh323.c:391

References ast_log, buf, LOG_ERROR, and version.

◆ 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 459 of file http.c.

463 {
464  struct timeval now = ast_tvnow();
465  struct ast_tm tm;
466  char timebuf[80];
467  char buf[256];
468  int len;
469  int content_length = 0;
470  int close_connection;
471  struct ast_str *server_header_field = ast_str_create(MAX_SERVER_NAME_LENGTH);
472  int send_content;
473 
474  if (!ser || !server_header_field) {
475  /* The connection is not open. */
476  ast_free(http_header);
477  ast_free(out);
478  ast_free(server_header_field);
479  return;
480  }
481 
483  ast_str_set(&server_header_field,
484  0,
485  "Server: %s\r\n",
487  }
488 
489  /*
490  * We shouldn't be sending non-final status codes to this
491  * function because we may close the connection before
492  * returning.
493  */
494  ast_assert(200 <= status_code);
495 
496  if (session_keep_alive <= 0) {
497  close_connection = 1;
498  } else {
500 
501  request = ser->private_data;
502  if (!request
504  || ast_http_body_discard(ser)) {
505  close_connection = 1;
506  } else {
507  close_connection = 0;
508  }
509  }
510 
511  ast_strftime(timebuf, sizeof(timebuf), "%a, %d %b %Y %H:%M:%S GMT", ast_localtime(&now, &tm, "GMT"));
512 
513  /* calc content length */
514  if (out) {
515  content_length += ast_str_strlen(out);
516  }
517 
518  if (fd) {
519  content_length += lseek(fd, 0, SEEK_END);
520  lseek(fd, 0, SEEK_SET);
521  }
522 
523  send_content = method != AST_HTTP_HEAD || status_code >= 400;
524 
525  /* send http header */
526  if (ast_iostream_printf(ser->stream,
527  "HTTP/1.1 %d %s\r\n"
528  "%s"
529  "Date: %s\r\n"
530  "%s"
531  "%s"
532  "%s"
533  "Content-Length: %d\r\n"
534  "\r\n"
535  "%s",
536  status_code, status_title ? status_title : "OK",
537  ast_str_buffer(server_header_field),
538  timebuf,
539  close_connection ? "Connection: close\r\n" : "",
540  static_content ? "" : "Cache-Control: no-cache, no-store\r\n",
541  http_header ? ast_str_buffer(http_header) : "",
542  content_length,
543  send_content && out && ast_str_strlen(out) ? ast_str_buffer(out) : ""
544  ) <= 0) {
545  ast_debug(1, "ast_iostream_printf() failed: %s\n", strerror(errno));
546  close_connection = 1;
547  } else if (send_content && fd) {
548  /* send file content */
549  while ((len = read(fd, buf, sizeof(buf))) > 0) {
550  if (ast_iostream_write(ser->stream, buf, len) != len) {
551  ast_debug(1, "ast_iostream_write() failed: %s\n", strerror(errno));
552  close_connection = 1;
553  break;
554  }
555  }
556  }
557 
558  ast_free(http_header);
559  ast_free(out);
560  ast_free(server_header_field);
561 
562  if (close_connection) {
563  ast_debug(1, "HTTP closing session. status_code:%d\n", status_code);
565  } else {
566  ast_debug(1, "HTTP keeping session open. status_code:%d\n", status_code);
567  }
568 }
int ast_http_body_discard(struct ast_tcptls_session_instance *ser)
Read and discard any unread HTTP request body.
Definition: http.c:1122
static int session_keep_alive
Definition: http.c:108
ssize_t ast_iostream_printf(struct ast_iostream *stream, const char *format,...)
Write a formatted string to an iostream.
Definition: iostream.c:491
ssize_t ast_iostream_write(struct ast_iostream *stream, const void *buffer, size_t count)
Write data to an iostream.
Definition: iostream.c:374
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
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
size_t ast_str_strlen(const struct ast_str *buf)
Returns the current length of the string stored within buf.
Definition: strings.h:711
struct ast_iostream * stream
Definition: tcptls.h:161
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:157

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(), 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 676 of file http.c.

677 {
678  struct ast_http_uri *uri;
679  int len = strlen(urih->uri);
680 
682 
683  urih->prefix = prefix;
684 
685  if ( AST_RWLIST_EMPTY(&uris) || strlen(AST_RWLIST_FIRST(&uris)->uri) <= len ) {
688  return 0;
689  }
690 
692  if (AST_RWLIST_NEXT(uri, entry) &&
693  strlen(AST_RWLIST_NEXT(uri, entry)->uri) <= len) {
696 
697  return 0;
698  }
699  }
700 
702 
704 
705  return 0;
706 }
#define AST_RWLIST_EMPTY
Definition: linkedlists.h:452
#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.
Definition: linkedlists.h:151
#define AST_RWLIST_INSERT_AFTER
Definition: linkedlists.h:702
#define AST_RWLIST_NEXT
Definition: linkedlists.h:441
#define AST_RWLIST_FIRST
Definition: linkedlists.h:423
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:494
#define AST_RWLIST_INSERT_HEAD
Definition: linkedlists.h:718
#define AST_RWLIST_INSERT_TAIL
Definition: linkedlists.h:741
Definition of a URI handler.
Definition: http.h:102
const char * prefix
Definition: http.h:106
const char * uri
Definition: http.h:105
Definition: search.h:40
Definition: http.c:141

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, len(), ast_http_uri::prefix, prefix, and ast_http_uri::uri.

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

◆ ast_http_uri_unlink()

void ast_http_uri_unlink ( struct ast_http_uri urihandler)

Unregister a URI handler.

Definition at line 708 of file http.c.

709 {
711  AST_RWLIST_REMOVE(&uris, urih, entry);
713 }
#define AST_RWLIST_REMOVE
Definition: linkedlists.h:885

References AST_RWLIST_REMOVE, AST_RWLIST_UNLOCK, and AST_RWLIST_WRLOCK.

Referenced by __ast_http_load(), __init_manager(), reload_module(), and unload_module().

◆ 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 715 of file http.c.

716 {
717  struct ast_http_uri *urih;
720  if (!strcmp(urih->key, key)) {
722  if (urih->dmallocd) {
723  ast_free(urih->data);
724  }
725  if (urih->mallocd) {
726  ast_free(urih);
727  }
728  }
729  }
732 }
#define AST_RWLIST_REMOVE_CURRENT
Definition: linkedlists.h:570
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
Definition: linkedlists.h:545
#define AST_RWLIST_TRAVERSE_SAFE_END
Definition: linkedlists.h:617
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::key, and ast_http_uri::mallocd.

Referenced by __ast_http_post_load(), and unload_module().