<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> 
<base href="https://wiki.asterisk.org/wiki" /> 
<title>Message Title</title>  
<style type="text/css">@media only screen and (max-device-width: 480px) {.mobile-only {
        width: auto !important;
        height: auto !important;
        overflow: visible !important;
        line-height: normal !important;
        font-size: inherit !important;
        mso-hide: all;
}

.desktop-only {
        display: none !important;
}

/* iPhone 3GS fix for unwanted 20px right margin */
body { min-width: 100% !important; padding: 0; margin: 0; }

#center-content-table { max-width: none; !important; }
#header-pattern-container { padding: 10px 10px 10px 10px !important; line-height: 20px !important; }
#header-avatar-image-container { padding-right: 8px !important; }
#email-content-container { padding: 0 !important; }
.mobile-expand { border-radius: 0 !important; border-left: 0 !important; border-right: 0 !important; padding-left: 26px !important;}
.mobile-resize-text { font-size: 16px !important; line-height: 22px !important; }
#page-title-pattern-header { font-size: 20px !important; line-height: 28px !important; }
#page-title-pattern-icon-image-container-cell { padding-top: 7px !important; }
#inline-user-pattern { display: block !important; }
#inline-user-pattern-avatar { padding-top: 3px !important; }
.contextual-area-pattern { border-bottom: 1px solid #ccc !important; padding: 15px 10px 0 10px !important;}
.users-involved-pattern-column-table { width: 100% !important;  }
.users-involved-pattern-avatar-table-cell { padding: 3px 5px 5px 0 !important; }
.users-involved-pattern-column-container { padding-right: 0 !important; }
.contextual-excerpt-pattern, #users-involved-pattern { border: 0 !important; }

/** Aui Typography upsized for mobile **/
#content-excerpt-pattern-container, #contextual-excerpt-pattern-text-container { font-size: 16px !important; line-height: 22px !important; }
#content-excerpt-pattern-container h1, #contextual-excerpt-pattern-text-container h1 { font-size: 24px !important; line-height: 28px !important; }
#content-excerpt-pattern-container h2, #contextual-excerpt-pattern-text-container h2 { font-size: 20px !important; line-height: 28px !important; }
#content-excerpt-pattern-container h3, #contextual-excerpt-pattern-text-container h3 { font-size: 18px !important; line-height: 24px !important; }
#content-excerpt-pattern-container h4, #contextual-excerpt-pattern-text-container h4 { font-size: 16px !important; line-height: 22px !important; }
#content-excerpt-pattern-container h5, #contextual-excerpt-pattern-text-container h5 { font-size: 14px !important; line-height: 20px !important; }
#content-excerpt-pattern-container h6, #contextual-excerpt-pattern-text-container h6 { font-size: 14px !important; line-height: 20px !important; }
.user-mention { line-height: 18px !important; }
/** Aui Typography end **/

/* Show appropriate footer logo on mobile, display links vertically */
#footer-pattern { padding: 15px 10px !important; }
#footer-pattern-logo-desktop-container { padding: 0 !important; }
#footer-pattern-logo-desktop { width: 0 !important; height: 0 !important; }
#footer-pattern-logo-mobile {
    padding-top: 10px !important;
    width: 30px !important;
    height: 27px !important;
    display: inline !important;
}
#footer-pattern-text {
    display: block !important;
}
#footer-pattern-links-container { line-height: 0 !important;}
.footer-pattern-links.mobile-resize-text,
.footer-pattern-links.mobile-resize-text,
#footer-pattern-text.mobile-resize-text,
#footer-pattern-links-container.no-footer-links {
    font-size: 14px !important;
    line-height: 20px !important;
}
.footer-link { display: block !important; }
#footer-pattern-links-container table { display: inline-block !important; float: none !important; }
#footer-pattern-links-container, #footer-pattern-text { text-align: center !important; }
#footer-pattern-links { padding-bottom: 5px !important; }

/** Team Calendar overrides, these should be removed when notifications are updated in Team Calendars. For now CSS
    overrides are being used because the structure of the content can't change without rereleasing the plugin */
.mail-calendar-container .day-header + table tr td:first-child {
    vertical-align: top !important;
    padding-top: 5px !important;
}}
@media (min-width: 900px) {#center-content-table { width: 900px; }}
@media all {#outlook a {padding:0;} /* Force Outlook to provide a "view in browser" menu link. */
/* Prevent Webkit and Windows Mobile platforms from changing default font sizes.*/
body{-webkit-text-size-adjust:100%; -ms-text-size-adjust:100%;}
.ExternalClass {width:100%;} /* Force Hotmail to display emails at full width */
#background-table {margin:0; padding:0; width:100% !important; }
/* Needed to override highlighting on date and time links in iOS */
.grey a {color: #707070; text-decoration: none; }}
</style> 
</head>
<body>
<table id="background-table" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333; background-color: #f5f5f5"> 
<tbody> 
<tr> 
<td id="header-pattern-container" style="padding: 0px; border-collapse: collapse; padding: 10px 20px"> 
<table id="header-pattern" cellspacing="0" cellpadding="0" border="0" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333"> 
<tbody> 
<tr> 
<td id="header-avatar-image-container" valign="top" style="padding: 0px; border-collapse: collapse; vertical-align: top; width: 32px; padding-right: 9px"><a href="https://wiki.asterisk.org/wiki/display/~mmichelson?src=email" style="color: #3b73af; text-decoration: none"><img id="header-avatar-image" class="image_fix" src="cid:avatar_99ed0aa29d6f204db4785296f8170422" height="32" width="32" border="0" style="border-radius: 3px; vertical-align: top" /></a></td>
<td id="header-text-container" valign="middle" style="padding: 0px; border-collapse: collapse; vertical-align: middle; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 1px">Mark Michelson <strong>created</strong> a page</td> 
</tr> 
</tbody> 
</table> </td> 
</tr> 
<!-- End Header pattern --> 
<tr> 
<td id="email-content-container" style="padding: 0px; border-collapse: collapse; padding: 0 20px"> 
<table id="email-content-table" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333; border-spacing: 0; border-collapse: separate"> 
<tbody> 
<tr> 
<td class="email-content-rounded-top mobile-expand" style="padding: 0px; border-collapse: collapse; color: #fff; padding: 0 15px 0 16px; height: 15px; background-color: #fff; border-left: 1px solid #ccc; border-top: 1px solid #ccc; border-right: 1px solid #ccc; border-bottom: 0; border-top-right-radius: 5px; border-top-left-radius: 5px"> </td> 
</tr> 
<tr> 
<td class="email-content-main mobile-expand" style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 15px 16px; background-color: #fff"> 
<table id="page-title-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333"> 
<tbody> 
<tr> 
<td id="page-title-pattern-icon-image-container" valign="top" style="padding: 0px; border-collapse: collapse; width: 16px; vertical-align: top"> 
<table cellspacing="0" cellpadding="0" border="0" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333"> 
<tbody> 
<tr> 
<td id="page-title-pattern-icon-image-container-cell" style="padding: 0px; border-collapse: collapse; width: 16px; padding: 9px 8px 0px 0px; mso-text-raise: 5px; mso-line-height-rule: exactly"><a href="https://wiki.asterisk.org/wiki/display/AST/cURL?src=email" title="page icon" style="vertical-align: top;; color: #3b73af; text-decoration: none"><img style="vertical-align: top; display: block;" src="cid:page-icon" alt="page icon" title="page icon" height="16" width="16" border="0" /></a></td> 
</tr> 
</tbody> 
</table> </td>
<td style="vertical-align: top;; padding: 0px; border-collapse: collapse; padding-right: 5px; font-size: 20px; line-height: 30px; mso-line-height-rule: exactly" id="page-title-pattern-header-container"><span id="page-title-pattern-header" style="font-family: Arial, sans-serif; padding: 0; font-size: 20px; line-height: 30px; mso-text-raise: 2px; mso-line-height-rule: exactly; vertical-align: middle"><a href="https://wiki.asterisk.org/wiki/display/AST/cURL?src=email" title="cURL" style="color: #3b73af; text-decoration: none">cURL</a></span></td> 
</tr> 
</tbody> 
</table> </td> 
</tr> 
<tr> 
<td class="email-content-main mobile-expand" style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 15px 16px; background-color: #fff"> 
<table class="content-excerpt-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 1px"> 
<tbody> 
<tr> 
<td class="content-excerpt-pattern-container mobile-resize-text " style="padding: 0px; border-collapse: collapse; padding: 0 0 0 24px"> 
<div class="aui-message warning shadowed information-macro"> 
<span class="aui-icon icon-warning">Icon</span> 
<div class="message-content"> 
<p style="margin: 10px 0 0 0; margin-top: 0">This page is under construction and may be incomplete or missing information in some areas. If you have questions, please wait until this notice is removed before asking, since it is possible your question will be answered by the time this page is completed.</p> 
</div> 
</div> <p style="margin: 10px 0 0 0"> </p> <p style="margin: 10px 0 0 0">Asterisk's ability to retrieve and store data to realtime backends is most commonly associated with relational databases. One of the lesser-known realtime backends available in Asterisk is <a href="http://curl.haxx.se/" class="external-link" rel="nofollow" style="color: #3b73af; text-decoration: none">cURL</a>. Using this realtime backend makes Asterisk use HTTP GET and POST requests in order to retrieve data from and store data to an HTTP server.</p> <p style="margin: 10px 0 0 0"> <style type="text/css">/**/
div.rbtoc1394917918785 {padding: 0px;}
div.rbtoc1394917918785 ul {list-style: disc;margin-left: 0px;}
div.rbtoc1394917918785 li {margin-left: 0px;padding-left: 0px;}

/**/</style> </p> 
<div class="toc-macro rbtoc1394917918785" style="padding: 0px; padding: 0px"> 
<ul class="toc-indentation" style="margin: 10px 0 0 0; margin-top: 0; list-style: disc; margin-left: 0px; list-style: disc; margin-left: 0px"> 
<li style="margin-left: 0px; padding-left: 0px; margin-left: 0px; padding-left: 0px"> <a href="#cURL-Justification" style="color: #3b73af; text-decoration: none">Justification</a> </li> 
<li style="margin-left: 0px; padding-left: 0px; margin-left: 0px; padding-left: 0px"> <a href="#cURL-DependenciesandInstallation" style="color: #3b73af; text-decoration: none">Dependencies and Installation</a> 
<ul class="toc-indentation" style="margin: 10px 0 0 0; list-style: disc; margin-left: 0px; list-style: disc; margin-left: 0px"> 
<li style="margin-left: 0px; padding-left: 0px; margin-left: 0px; padding-left: 0px"> <a href="#cURL-Troubleshooting" style="color: #3b73af; text-decoration: none">Troubleshooting</a> </li> 
</ul> </li> 
<li style="margin-left: 0px; padding-left: 0px; margin-left: 0px; padding-left: 0px"> <a href="#cURL-Configuration" style="color: #3b73af; text-decoration: none">Configuration</a> </li> 
<li style="margin-left: 0px; padding-left: 0px; margin-left: 0px; padding-left: 0px"> <a href="#cURL-Operations" style="color: #3b73af; text-decoration: none">Operations</a> 
<ul class="toc-indentation" style="margin: 10px 0 0 0; list-style: disc; margin-left: 0px; list-style: disc; margin-left: 0px"> 
<li style="margin-left: 0px; padding-left: 0px; margin-left: 0px; padding-left: 0px"> <a href="#cURL-single" style="color: #3b73af; text-decoration: none">single</a> </li> 
<li style="margin-left: 0px; padding-left: 0px; margin-left: 0px; padding-left: 0px"> <a href="#cURL-multi" style="color: #3b73af; text-decoration: none">multi</a> </li> 
<li style="margin-left: 0px; padding-left: 0px; margin-left: 0px; padding-left: 0px"> <a href="#cURL-store" style="color: #3b73af; text-decoration: none">store</a> </li> 
<li style="margin-left: 0px; padding-left: 0px; margin-left: 0px; padding-left: 0px"> <a href="#cURL-update" style="color: #3b73af; text-decoration: none">update</a> </li> 
<li style="margin-left: 0px; padding-left: 0px; margin-left: 0px; padding-left: 0px"> <a href="#cURL-destroy" style="color: #3b73af; text-decoration: none">destroy</a> </li> 
<li style="margin-left: 0px; padding-left: 0px; margin-left: 0px; padding-left: 0px"> <a href="#cURL-static" style="color: #3b73af; text-decoration: none">static</a> </li> 
<li style="margin-left: 0px; padding-left: 0px; margin-left: 0px; padding-left: 0px"> <a href="#cURL-require" style="color: #3b73af; text-decoration: none">require</a> </li> 
</ul> </li> 
<li style="margin-left: 0px; padding-left: 0px; margin-left: 0px; padding-left: 0px"> <a href="#cURL-OtherInformation" style="color: #3b73af; text-decoration: none">Other Information</a> </li> 
</ul> 
</div> <p style="margin: 10px 0 0 0"></p> <h1 id="cURL-Justification" style="margin: 10px 0 0 0; font-size: 24px; font-weight: normal; line-height: 30px; margin: 40px 0 0 0">Justification</h1> <p style="margin: 10px 0 0 0">If Asterisk is capable of using a relational database as a store for realtime data, then what is the need for using HTTP? There are several potential reasons:</p> 
<ul style="margin: 10px 0 0 0"> 
<li>Your setup hinges on a web service such as Django or something else, and you would prefer that Asterisk go through this service instead of skirting it to get directly at the data.</li> 
<li>You are forced to use a database that Asterisk does not have a native backend for and whose ODBC support is subpar.</li> 
<li>A relational database carries too much overhead</li> 
</ul> <h1 id="cURL-DependenciesandInstallation" style="margin: 10px 0 0 0; font-size: 24px; font-weight: normal; line-height: 30px; margin: 40px 0 0 0">Dependencies and Installation</h1> <p style="margin: 10px 0 0 0">Asterisk's realtime cURL backend is provided by the module <code style="font-family: monospace">res_config_curl.so</code>. In order to build this module, you will first need to have the libcurl development library installed on your machine. If you wish to install the library from source, you can find it <a href="http://curl.haxx.se/download.html" class="external-link" rel="nofollow" style="color: #3b73af; text-decoration: none">here</a>. If you would rather use your Linux distribution's package management, then you should be able to download the development libraries that way instead.</p> <p style="margin: 10px 0 0 0">If you use a distribution with aptitude-based packaging (Debian, Ubuntu, Mint, et al), then use this command to install:</p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">apt-get install libcurl4-openssl-dev</pre> 
</div> 
</div> <p style="margin: 10px 0 0 0"> </p> <p style="margin: 10px 0 0 0">If you use a distribution with yum-based packaging (CentOS, RHEL, Fedora, et al), then use this command to install:</p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">yum -y install libcurl-devel</pre> 
</div> 
</div> <p style="margin: 10px 0 0 0">Both of the above commands assume that you have permission to install the packages. You may need to prepend the command with "sudo" in order to be able to install the packages.</p> <p style="margin: 10px 0 0 0">Once you have the libcurl development libraries installed, you need to run Asterisk's configure script in order for Asterisk to detect the installed library:</p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">$ ./configure</pre> 
</div> 
</div> <p style="margin: 10px 0 0 0">In addition to the libcurl development library, <code style="font-family: monospace">res_config_curl.so</code> relies on two other modules within Asterisk: <code style="font-family: monospace">res_curl.so</code> and <code style="font-family: monospace">func_curl.so</code>. <code style="font-family: monospace">res_curl.so</code> initializes the cURL library within Asterisk. <code style="font-family: monospace">func_curl.so</code> provides dialplan functions ( <code style="font-family: monospace">CURL</code> and <code style="font-family: monospace">CURLOPT</code>) that are used directly by <code style="font-family: monospace">res_config_curl.so</code>.</p> <p style="margin: 10px 0 0 0">After running the configure script, run</p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">$ make menuselect</pre> 
</div> 
</div> <p style="margin: 10px 0 0 0">to select which modules to build. Ensure that you can select <code style="font-family: monospace">res_curl</code> and <code style="font-family: monospace">res_config_curl</code> from the "Resource Modules" menu and that you can select <code style="font-family: monospace">func_curl</code> from the "Dialplan Functions" menu. Once you have ensured that these have been selected, save your changes ('x' key if using curses-based menuselect or select the "Save & Exit" option if using newt-based or gtk-based menuselect). After, you just need to run</p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">$ make && make install</pre> 
</div> 
</div> <p style="margin: 10px 0 0 0">in order to build Asterisk and install it on the system. You may need to prepend the "sudo" to the "make install" command if there are permission problems when attempting to install. Once you have installed Asterisk, you can test that <code style="font-family: monospace">res_config_curl.so</code> has been installed properly by starting Asterisk:</p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">$ asterisk -c</pre> 
</div> 
</div> <p style="margin: 10px 0 0 0">Once Asterisk has started, type the following on the CLI:</p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">*CLI> module show like res_config_curl
Module                         Description                              Use Count  Status
res_config_curl.so             Realtime Curl configuration              0          Running
1 modules loaded

</pre> 
</div> 
</div> <p style="margin: 10px 0 0 0">The output when you run the command should look like what is shown above. If it does, then Asterisk is capable of using cURL for realtime.</p> <h3 id="cURL-Troubleshooting" style="margin: 10px 0 0 0; font-size: 16px; line-height: 25px; margin: 30px 0 0 0">Troubleshooting</h3> <p style="margin: 10px 0 0 0">If you encounter problems along the way, here are some tips to help you get back on track.</p> 
<ul style="margin: 10px 0 0 0"> 
<li>If the required modules in Asterisk are unselectable when you run <code style="font-family: monospace">make menuselect</code>, then Asterisk did not detect the libcurl development library on your machine. If you installed the libcurl development library in a nonstandard place, then when running Asterisk's configure script, specify <code style="font-family: monospace">--with-curl=/path/to/library</code> so that Asterisk can know where to look.</li> 
<li>If you built the required Asterisk modules but the <code style="font-family: monospace">res_config_curl.so</code> module is not properly loaded, then check your <code style="font-family: monospace">modules.conf</code> file to ensure that the necessary modules are being loaded. If you are noloading any of the required modules, then <code style="font-family: monospace">res_config_curl.so</code> will not be able to load. If you are loading modules individually, be sure to list <code style="font-family: monospace">res_curl.so</code> and <code style="font-family: monospace">func_curl.so</code> before <code style="font-family: monospace">res_config_curl.so</code> in your configuration.</li> 
</ul> <h1 id="cURL-Configuration" style="margin: 10px 0 0 0; font-size: 24px; font-weight: normal; line-height: 30px; margin: 40px 0 0 0">Configuration</h1> <p style="margin: 10px 0 0 0">Unlike other realtime backends, Asterisk does not have a specific configuration file for the realtime cURL backend. Instead, Asterisk gets the information it needs by reading the <code style="font-family: monospace">extconfig.conf</code> file that it typically uses for general static and realtime configuration. The name of the realtime engine that Asterisk uses for cURL is called "curl" in <code style="font-family: monospace">extconfig.conf</code>. Here is a sample:</p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">[settings]
voicemail = curl,http://myserver.com:8000/voicemail
sippeers = curl,http://myserver.com:8000/sippeers
queues = curl,http://myserver.com:8000/my_queues</pre> 
</div> 
</div> <p style="margin: 10px 0 0 0">The basic syntax when using cURL is:</p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">realtime_data = curl,<HTTP URL></pre> 
</div> 
</div> <p style="margin: 10px 0 0 0">There are no hard-and-fast rules on what URL you place here. In the above sample, each of the various realtime stores correspond to resources on the same HTTP server. However, it would be perfectly valid to specify completely different servers for different realtime stores. Notice also that there is no requirement for the name of the realtime store to appear in the HTTP URL. In the above example the "queues" realtime store maps to the resource "my_queues" on the HTTP server.</p> <h1 id="cURL-Operations" style="margin: 10px 0 0 0; font-size: 24px; font-weight: normal; line-height: 30px; margin: 40px 0 0 0">Operations</h1> <p style="margin: 10px 0 0 0">The way Asterisk performs operations on your data is to send HTTP requests to different resources on your HTTP server. For instance, let's say that, based on your <code style="font-family: monospace">extconfig.conf</code> file, you have mapped the "queues" realtime store to http://myserver.com:8000/queues. Asterisk will append whatever realtime operation it wishes to perform as a resource onto the end of the URL that you have provided. If Asterisk wanted to perform the "single" realtime operation, then Asterisk would send an HTTP request to <a href="http://myserver.com:8000/queues/single." class="external-link" rel="nofollow" style="color: #3b73af; text-decoration: none">http://myserver.com:8000/queues/single.</a> </p> <p style="margin: 10px 0 0 0">If your server is able to provide a response, then your server should return that response as the body of a 200-class HTTP response. If the request is unservable, then an appropriate HTTP error code should be sent.</p> <p style="margin: 10px 0 0 0">The operations, as well as what is expected in response, are defined below.</p> <p style="margin: 10px 0 0 0">For the first five examples, we will be using external MWI as the sample realtime store that Asterisk will be interacting with. The realtime MWI store stores the following data for each object</p> 
<ul style="margin: 10px 0 0 0"> 
<li>id: The name of the mailbox for which MWI is being provided</li> 
<li>msgs_new: The number of new messages the mailbox currently has</li> 
<li>msgs_old: The number of old messages the mailbox currently has</li> 
</ul> <p style="margin: 10px 0 0 0">We will operate with the assumption that the following two objects exist in the realtime store:</p> 
<ul style="margin: 10px 0 0 0"> 
<li>Object 1 
<ul style="margin: 10px 0 0 0; margin-top: 0"> 
<li>id: "Dazed"</li> 
<li>msgs_new: 5</li> 
<li>msgs_old: 4</li> 
</ul> </li> 
<li>Object 2 
<ul style="margin: 10px 0 0 0; margin-top: 0"> 
<li>id: "Confused"</li> 
<li>msgs_new: 6</li> 
<li>msgs_old: 8</li> 
</ul> </li> 
</ul> <h3 id="cURL-single" style="margin: 10px 0 0 0; font-size: 16px; line-height: 25px; margin: 30px 0 0 0">single</h3> <p style="margin: 10px 0 0 0">The "single" resource is used for Asterisk to retrieve a single object from realtime.</p> <p style="margin: 10px 0 0 0">Asterisk sends an HTTP POST request, using the body to indicate what data it wants. Here is an example of such a request:</p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">POST /mwi/single HTTP/1.1
User-Agent: asterisk-libcurl-agent/1.0
Host: localhost:8000
Accept: */*
Content-Length: 8
Content-Type: application/x-www-form-urlencoded
id=Dazed</pre> 
</div> 
</div> <p style="margin: 10px 0 0 0">  In this case, the request from Asterisk wants a single object whose id is "Dazed". Given the data we have stored, we would respond like so:</p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">HTTP/1.1 200 OK
Date: Sat, 15 Mar 2014 18:23:21 GMT
Content-Length: 30
Content-Type: text/html
 
msgs_new=5&msgs_old=4&id=Dazed</pre> 
</div> 
</div> <p style="margin: 10px 0 0 0">The parameters describing the requested mailbox are returned on a single line in the HTTP response body. The order that the parameters are listed in is irrelevant.</p> <p style="margin: 10px 0 0 0">If a "single" query from Asterisk matches more than one entity, you may choose to either respond with an HTTP error or simply return one of the matching records. </p> <h3 id="cURL-multi" style="margin: 10px 0 0 0; font-size: 16px; line-height: 25px; margin: 30px 0 0 0">multi</h3> <p style="margin: 10px 0 0 0">The "multi" resource is used to retrieve multiple objects from the realtime store.</p> <p style="margin: 10px 0 0 0">Asterisk sends an HTTP POST request, using the body to indicate what data it wants. Here is an example of such a request:</p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">POST /mwi/multi HTTP/1.1
User-Agent: asterisk-libcurl-agent/1.0
Host: localhost:8000
Accept: */*
Content-Length: 13
Content-Type: application/x-www-form-urlencoded
id%20LIKE=%25</pre> 
</div> 
</div> <p style="margin: 10px 0 0 0">The "multi" resource is one where Asterisk shows a weakness when not dealing with a relational database as its realtime backend. In this case, Asterisk has requested multiple rows with "id LIKE=%". What this means is that Asterisk wants to retrieve every object from the particular realtime store with an id equal to anything. Other queries Asterisk may send may be more like "foo LIKE=%bar%". In this case, Asterisk would be requesting all objects with a foo parameter that has "bar" as part of its value (so something with foo=barbara would match the query).</p> <p style="margin: 10px 0 0 0">For this particular request, we would respond with the following:</p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">HTTP/1.1 200 OK
Date: Sat, 15 Mar 2014 18:40:58 GMT
Content-Length: 65
Content-Type: text/html
 
msgs_new=5&msgs_old=4&id=Dazed
msgs_new=6&msgs_old=8&id=Confused</pre> 
</div> 
</div> <p style="margin: 10px 0 0 0">Each returned object is on its own line of the response.</p> <h3 id="cURL-store" style="margin: 10px 0 0 0; font-size: 16px; line-height: 25px; margin: 30px 0 0 0">store</h3> <p style="margin: 10px 0 0 0">The "store" resource is used to save an object into the realtime store.</p> <p style="margin: 10px 0 0 0">Asterisk sends an HTTP POST request, using the body to indicate what new object to store. Here is an example of such a request:</p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">POST /mwi/store HTTP/1.1
User-Agent: asterisk-libcurl-agent/1.0
Host: localhost:8000
Accept: */*
Content-Length: 30
Content-Type: application/x-www-form-urlencoded

id=Shocked&msgs_old=5&msgs_new=7</pre> 
</div> 
</div> <p style="margin: 10px 0 0 0">In this case, Asterisk is attempting to store a new object with id "Shocked", 5 old messages and 7 new messages. Our realtime backend should reply with the number of objects stored.</p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">HTTP/1.1 200 OK
Date: Sat, 15 Mar 2014 18:46:54 GMT
Content-Length: 1
Content-Type: text/html
 
1</pre> 
</div> 
</div> <p style="margin: 10px 0 0 0">Since we have stored one new object, we return "1" as our response.</p> <p style="margin: 10px 0 0 0">If attempting to store an item that already exists in the database, you may either return an HTTP error or overwrite the old object with the new, depending on your policy.</p> <h3 id="cURL-update" style="margin: 10px 0 0 0; font-size: 16px; line-height: 25px; margin: 30px 0 0 0">update</h3> <p style="margin: 10px 0 0 0">The "update" resource is used to change the values of parameters of objects in the realtime store.</p> <p style="margin: 10px 0 0 0">Asterisk sends an HTTP POST request, using URL parameters to indicate what objects to update and using the body to indicate what values within those objects to update. Here is an example of such a request:</p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">POST /mwi/update?id=Dazed HTTP/1.1
User-Agent: asterisk-libcurl-agent/1.0
Host: localhost:8000
Accept: */*
Content-Length: 24
Content-Type: application/x-www-form-urlencoded
msgs_old=25&msgs_new=300</pre> 
</div> 
</div> <p style="margin: 10px 0 0 0">In this case, the URL parameter "id=Dazed" tells us that Asterisk wants us to update all objects whose id is "Dazed". For any objects that match the criteria, we should update the number of old messages to 25 and the number of new messages to 300.</p> <p style="margin: 10px 0 0 0">Our response indicates how many objects we updated. In this case, since we have updated one object, we respond with "1".</p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">HTTP/1.1 200 OK
Date: Sat, 15 Mar 2014 18:52:26 GMT
Content-Length: 1
Content-Type: text/html

1</pre> 
</div> 
</div> <p style="margin: 10px 0 0 0">If there are no items that match the criteria, you may either respond with a "0" response body or return an HTTP error.</p> <h3 id="cURL-destroy" style="margin: 10px 0 0 0; font-size: 16px; line-height: 25px; margin: 30px 0 0 0">destroy</h3> <p style="margin: 10px 0 0 0">The "destroy" resource is used to delete objects in the realtime store.</p> <p style="margin: 10px 0 0 0">Asterisk sends an HTTP POST request, using the body to indicate what object to delete. Here is an example of such a request:</p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">POST /mwi/destroy HTTP/1.1
User-Agent: asterisk-libcurl-agent/1.0
Host: localhost:8000
Accept: */*
Content-Length: 9
Content-Type: application/x-www-form-urlencoded
id=Dazed</pre> 
</div> 
</div> <p style="margin: 10px 0 0 0">In this case, Asterisk has requested that we delete the object with the id of "Dazed".</p> <p style="margin: 10px 0 0 0">The body of our response indicates the number of items we deleted. Since we have deleted one object, we put "1" in our response body:</p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">HTTP/1.1 200 OK
Date: Sat, 15 Mar 2014 18:57:23 GMT
Content-Length: 1
Content-Type: text/html

1</pre> 
</div> 
</div> <p style="margin: 10px 0 0 0">If asked to delete an object that does not exist, you may either respond with a "0" body or with an HTTP error.</p> <h3 id="cURL-static" style="margin: 10px 0 0 0; font-size: 16px; line-height: 25px; margin: 30px 0 0 0">static</h3> <p style="margin: 10px 0 0 0">The "static" resource is used for static realtime requests.</p> <p style="margin: 10px 0 0 0">Static realtime is a different realm from the more common dynamic realtime. Whereas dynamic realtime is restricted to certain configuration types that are designed to be used this way, static realtime uses a generic construct that can be substituted for any configuration file in Asterisk. The downside to static realtime is that Asterisk only ever interacts with the static realtime backend when the module that uses the configuration is reloaded. Internally, the Asterisk module thinks that it is reading its configuration from a configuration file, but under the hood, the configuration is actually retrieved from a realtime backend.</p> <p style="margin: 10px 0 0 0">Static realtime "objects" are all the same, no matter what configuration file the static realtime store is standing in for. Object has been placed in quotation marks in that previous sentence because each static realtime object does not represent an entire configuration object, but rather represents a line in a configuration file. Here are the parameters for each static realtime object:</p> 
<ul style="margin: 10px 0 0 0"> 
<li>id: A unique numerical id for the static realtime object</li> 
<li>filename: The configuration file that this static realtime object belongs to</li> 
<li>cat_metric: Numerical id for a configuration category. Used by Asterisk to order categories for evaluation.</li> 
<li>category: Name of the configuration category</li> 
<li>var_metric: Numerical id for a variable within a category. Used by Asterisk to order variables for evaluation.</li> 
<li>var_name: Parameter name</li> 
<li>var_val: Parameter value</li> 
<li>commented: If non-zero, indicates this object should be ignored</li> 
</ul> <p style="margin: 10px 0 0 0">For our example, we will have the following objects stored in our static realtime store:</p> 
<ul style="margin: 10px 0 0 0"> 
<li>- 
<ul style="margin: 10px 0 0 0; margin-top: 0"> 
<li>id: 0</li> 
<li>cat_metric: 0</li> 
<li>var_metric: 0</li> 
<li>filename: pjsip.conf</li> 
<li>category: alice</li> 
<li>var_name: type</li> 
<li>var_val: endpoint</li> 
<li>commented: 0</li> 
</ul> </li> 
<li>- 
<ul style="margin: 10px 0 0 0; margin-top: 0"> 
<li>id: 1</li> 
<li>cat_metric: 0</li> 
<li>var_metric: 1</li> 
<li>filename: pjsip.conf</li> 
<li>category: alice</li> 
<li>var_name: allow</li> 
<li>var_val: ulaw</li> 
<li>commented: 0</li> 
</ul> </li> 
<li>- 
<ul style="margin: 10px 0 0 0; margin-top: 0"> 
<li>id: 2</li> 
<li>cat_metric: 0</li> 
<li>var_metric: 2</li> 
<li>filename: pjsip.conf</li> 
<li>category: alice</li> 
<li>var_name: context</li> 
<li>var_val: fabulous</li> 
<li>commented: 0</li> 
</ul> </li> 
</ul> <p style="margin: 10px 0 0 0"> <span style="line-height: 1.4285715;">This schema is identical to the <code style="font-family: monospace">pjsip.conf</code> configuration file:</span> </p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">[alice]
type=endpoint
allow=ulaw
context=fabulous</pre> 
</div> 
</div> <p style="margin: 10px 0 0 0"> <span style="line-height: 1.4285715;"> Asterisk uses an HTTP GET to request static realtime data, using a URL parameter to indicate which filename it cares about. Here is an example of such a request:</span> </p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">GET /astconfig/static?file=pjsip.conf HTTP/1.1
User-Agent: asterisk-libcurl-agent/1.0
Host: localhost:8000
Accept: */*</pre> 
</div> 
</div> <p style="margin: 10px 0 0 0">In this case, Asterisk wants all static realtime objects whose filename is "pjsip.conf". Note that the HTTP request calls the parameter "file", whereas the actual name of the parameter returned from the realtime store is called "filename".</p> <p style="margin: 10px 0 0 0">Our response contains all matching static realtime objects:</p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">HTTP/1.1 200 OK
Date: Sat, 15 Mar 2014 19:13:41 GMT
Content-Length: 328
Content-Type: text/html

category=alice&commented=0&var_metric=0&var_name=type&var_val=endpoint&id=0&filename=pjsip.conf&cat_metric=0
category=alice&commented=0&var_metric=1&var_name=allow&var_val=ulaw&id=1&filename=pjsip.conf&cat_metric=0
category=alice&commented=0&var_metric=2&var_name=context&var_val=fabulous&id=2&filename=pjsip.conf&cat_metric=0</pre> 
</div> 
</div> <p style="margin: 10px 0 0 0">Unlike other realtime responses, the static realtime response needs to present the data in a particular order:</p> 
<ul style="margin: 10px 0 0 0"> 
<li>First order: by descending cat_metric</li> 
<li>Second order: by ascending var_metric</li> 
<li>Third: lexicographically by category name</li> 
<li>Fourth: lexicographically by variable name</li> 
</ul> <p style="margin: 10px 0 0 0">Note that Asterisk only pays attention to the "cat_metric", "var_metric", "category", "var_name", and "var_value" you return here, but you are free to return the entire object if you want. Note that Asterisk will not pay attention to the "commented" field, so be sure not to return any objects that have a non-zero "commented" value.</p> <p style="margin: 10px 0 0 0">In summary, static realtime is cumbersome, confusing, and not worth it. Stay clear unless you just really need to use it.</p> <p style="margin: 10px 0 0 0">If your realtime store does not provide objects for the specified file, then you may either return an empty body or an HTTP error.</p> <h3 id="cURL-require" style="margin: 10px 0 0 0; font-size: 16px; line-height: 25px; margin: 30px 0 0 0">require</h3> <p style="margin: 10px 0 0 0">The "require" resource is used by Asterisk to test that a particular parameter for a realtime object is of a type it expects.</p> <p style="margin: 10px 0 0 0">Asterisk sends an HTTP POST with body parameters describing what type it expects for a specific parameter. Here is an example of such a request:</p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">POST /queue_members/require HTTP/1.1
User-Agent: asterisk-libcurl-agent/1.0
Host: localhost:8000
Accept: */*
Content-Length: 9
Content-Type: application/x-www-form-urlencoded


paused=integer1%3A1&uniqueid=uinteger2%3A5</pre> 
</div> 
</div> <p style="margin: 10px 0 0 0">Decoded, the body is "paused=integer1:1&uniqueid=uinteger2:5". The types that Asterisk can ask for are the following:</p> 
<ul style="margin: 10px 0 0 0"> 
<li>An integer type can be indicated by any of the following 
<ul style="margin: 10px 0 0 0; margin-top: 0"> 
<li>integer1</li> 
<li>integer2</li> 
<li>integer3</li> 
<li>integer4</li> 
<li>integer8</li> 
</ul> </li> 
<li>An unsigned integer type can be indicated by any of the following 
<ul style="margin: 10px 0 0 0; margin-top: 0"> 
<li>uinteger1</li> 
<li>uinteger2</li> 
<li>uinteger3</li> 
<li>uinteger4</li> 
<li>uinteger8</li> 
</ul> </li> 
<li>char: A string</li> 
<li>date: A date</li> 
<li>datetime: A datetime</li> 
<li>float: a floating point number</li> 
</ul> <p style="margin: 10px 0 0 0">It is undocumented what the meaning of the number after each of the "integer" and "uinteger" types means. If I'm guessing, it's the number of bytes allocated for the type.</p> <p style="margin: 10px 0 0 0">The number after the colon for each parameter represents the minimum width, in digits for integer types and characters for char types, for each parameter.</p> <p style="margin: 10px 0 0 0">In the example above, Asterisk is requiring that queue members' "paused" parameter be an integer type that can hold at least 1 digit and their "uniqueid" parameter be an unsigned integer type that can hold at least 5 digits.</p> <p style="margin: 10px 0 0 0"> Note that the purpose of Asterisk sending to the "require" resource is because Asterisk is going to attempt to <strong>send</strong> data of the type indicated to the realtime store. When receiving such a request, it is completely up to how you are storing your data to determine how to respond. If you are using a schema-less store for your data, then trying to test for width and type for each parameter is pointless, so you may as well just return successfully. If you are using something that has a schema you can check, then you should be sure that your realtime store can accommodate the data Asterisk will send. If your schema cannot accommodate the data, then this is an ideal time to modify the data schema if it is possible.</p> <p style="margin: 10px 0 0 0">Respond with a "0" body to indicate success or a "-1" body to indicate failure. Here is an example response:</p> 
<div class="preformatted panel" style="border-width: 1px;"> 
<div class="preformattedContent panelContent"> 
<pre style="margin: 10px 0 0 0; margin-top: 0">HTTP/1.1 200 OK
Date: Sat, 15 Mar 2014 18:57:23 GMT
Content-Length: 1
Content-Type: text/html

0</pre> 
</div> 
</div> <h1 id="cURL-OtherInformation" style="margin: 10px 0 0 0; font-size: 24px; font-weight: normal; line-height: 30px; margin: 40px 0 0 0">Other Information</h1> <p style="margin: 10px 0 0 0">If you are interested in looking more in-depth into Asterisk's cURL realtime backend, you can find a reference example of an HTTP server in <code style="font-family: monospace">contrib/scripts/dbsep.cgi</code> written by Tilghman Lesher, who also wrote Asterisk's realtime cURL support.</p> </td> 
</tr> 
</tbody> 
</table> </td> 
</tr> 
<tr> 
<td class="email-content-main mobile-expand action-padding last-row-padding" style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 15px 16px; background-color: #fff; padding-bottom: 10px; padding-bottom: 10px"> 
<table id="actions-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 1px"> 
<tbody> 
<tr> 
<td id="actions-pattern-container" valign="middle" style="padding: 0px; border-collapse: collapse; padding: 15px 0 0 24px; vertical-align: middle"> 
<table align="left" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333"> 
<tbody> 
<tr> 
<td class="actions-pattern-action-icon-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 0px; vertical-align: middle"><a href="https://wiki.asterisk.org/wiki/display/AST/cURL?src=email" title="View page" style="color: #3b73af; text-decoration: none"><img class="actions-pattern-action-icon-image" src="cid:confluence.mail.templates.view.page" alt="View page-icon" title="View page-icon" height="16" width="16" border="0" style="vertical-align: middle" /></a></td>
<td class="actions-pattern-action-text-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 4px; padding-left: 5px; white-space: nowrap"><a href="https://wiki.asterisk.org/wiki/display/AST/cURL?src=email" title="View page" style="color: #3b73af; text-decoration: none">View page</a></td>
<td class="actions-pattern-action-bull" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 4px; color: #999; padding: 0 5px">•</td> 
</tr> 
</tbody> 
</table> 
<table align="left" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333"> 
<tbody> 
<tr> 
<td class="actions-pattern-action-icon-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 0px; vertical-align: middle"><a href="https://wiki.asterisk.org/wiki/display/AST/cURL?showComments=true&showCommentArea=true#addcomment" title="Add comment" style="color: #3b73af; text-decoration: none"><img class="actions-pattern-action-icon-image" src="cid:confluence.mail.templates.add.comment" alt="Add comment-icon" title="Add comment-icon" height="16" width="16" border="0" style="vertical-align: middle" /></a></td>
<td class="actions-pattern-action-text-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 4px; padding-left: 5px; white-space: nowrap"><a href="https://wiki.asterisk.org/wiki/display/AST/cURL?showComments=true&showCommentArea=true#addcomment" title="Add comment" style="color: #3b73af; text-decoration: none">Add comment</a></td>
<td class="actions-pattern-action-bull" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 4px; color: #999; padding: 0 5px">•</td> 
</tr> 
</tbody> 
</table> 
<table style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333"> 
<tbody> 
<tr> 
<td class="actions-pattern-action-icon-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 0px; vertical-align: middle"><a href="https://wiki.asterisk.org/wiki/plugins/likes/like.action?contentId=28314908&src=email" title="Like" style="color: #3b73af; text-decoration: none"><img class="actions-pattern-action-icon-image" src="cid:likes.like" alt="Like-icon" title="Like-icon" height="16" width="16" border="0" style="vertical-align: middle" /></a></td>
<td class="actions-pattern-action-text-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 4px; padding-left: 5px; white-space: nowrap"><a href="https://wiki.asterisk.org/wiki/plugins/likes/like.action?contentId=28314908&src=email" title="Like" style="color: #3b73af; text-decoration: none">Like</a></td> 
</tr> 
</tbody> 
</table> </td> 
</tr> 
</tbody> 
</table> </td> 
</tr> 
<tr> 
<td class="email-content-rounded-bottom mobile-expand" style="padding: 0px; border-collapse: collapse; color: #fff; height: 5px; line-height: 5px; padding: 0 15px 0 16px; background-color: #fff; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; border-top: 0; border-left: 1px solid #ccc; border-bottom: 1px solid #ccc; border-right: 1px solid #ccc; mso-line-height-rule: exactly"> </td> 
</tr> 
</tbody> 
</table> </td> 
</tr> 
<tr> 
<td id="footer-pattern" style="padding: 0px; border-collapse: collapse; padding: 12px 20px"> 
<table id="footer-pattern-container" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333"> 
<tbody> 
<tr> 
<td id="footer-pattern-links-container" width="100%" style="padding: 0px; border-collapse: collapse; color: #999; font-size: 12px; line-height: 18px; font-family: Arial, sans-serif; mso-line-height-rule: exactly; mso-text-raise: 2px"> 
<table align="left" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333; font-size: 12px; line-height: 18px; font-family: Arial, sans-serif; mso-line-height-rule: exactly; mso-text-raise: 2px"> 
<tbody> 
<tr> 
<td class="footer-pattern-links mobile-resize-text" style="padding: 0px; border-collapse: collapse"><a href="https://wiki.asterisk.org/wiki/users/removespacenotification.action?spaceKey=AST&src=email" title="" style="color: #3b73af; text-decoration: none">Stop watching space</a></td>
<td class="footer-pattern-links-bull" style="padding: 0px; border-collapse: collapse; padding: 0 5px; color: #999">•</td> 
</tr> 
</tbody> 
</table> 
<table style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333; font-size: 12px; line-height: 18px; font-family: Arial, sans-serif; mso-line-height-rule: exactly; mso-text-raise: 2px"> 
<tbody> 
<tr> 
<td class="footer-pattern-links mobile-resize-text" style="padding: 0px; border-collapse: collapse"><a href="https://wiki.asterisk.org/wiki/users/editmyemailsettings.action?src=email" title="" style="color: #3b73af; text-decoration: none">Manage notifications</a></td> 
</tr> 
</tbody> 
</table> </td> 
</tr> 
<tr> 
<td id="footer-pattern-text" class="mobile-resize-text" width="100%" style="padding: 0px; border-collapse: collapse; color: #999; font-size: 12px; line-height: 18px; font-family: Arial, sans-serif; mso-line-height-rule: exactly; mso-text-raise: 2px; display: none">This message was sent by Atlassian Confluence 5.4.3</td> 
</tr> 
</tbody> 
</table> </td> 
</tr> 
</tbody> 
</table> 
<table id="sealed-section" border="0" cellpadding="0" cellspacing="0" width="0" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333; display: none"> 
<tbody> 
<tr> 
<td style="padding: 0px; border-collapse: collapse; border: 0; font-size: 0px; line-height: 0; mso-line-height-rule: exactly"></td> 
</tr> 
</tbody> 
</table>
</body>
</html>