base
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
<refentry id="refalloc">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_malloc</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_malloc">ne_malloc</refname>
|
||||
<refname id="ne_calloc">ne_calloc</refname>
|
||||
<refname id="ne_realloc">ne_realloc</refname>
|
||||
<refname id="ne_strdup">ne_strdup</refname>
|
||||
<refname id="ne_strndup">ne_strndup</refname>
|
||||
<refname id="ne_oom_callback">ne_oom_callback</refname>
|
||||
<refpurpose>memory allocation wrappers</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_alloc.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void *<function>ne_malloc</function></funcdef>
|
||||
<paramdef>size_t <parameter>size</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void *<function>ne_calloc</function></funcdef>
|
||||
<paramdef>size_t <parameter>size</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void *<function>ne_realloc</function></funcdef>
|
||||
<paramdef>void *<parameter>size</parameter></paramdef>
|
||||
<paramdef>size_t <parameter>len</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>char *<function>ne_strdup</function></funcdef>
|
||||
<paramdef>const char *<parameter>s</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>char *<function>ne_strndup</function></funcdef>
|
||||
<paramdef>const char *<parameter>s</parameter></paramdef>
|
||||
<paramdef>size_t <parameter>size</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_oom_callback</function></funcdef>
|
||||
<paramdef>void (*<parameter>callback</parameter>)(void)</paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The functions <function>ne_malloc</function>,
|
||||
<function>ne_calloc</function>, <function>ne_realloc</function>,
|
||||
<function>ne_strdup</function> and <function>ne_strdnup</function>
|
||||
provide wrappers for the equivalent functions in the standard C
|
||||
library. The wrappers provide the extra guarantee that if the C
|
||||
library equivalent returns &null; when no memory is available, an
|
||||
optional callback will be called, and the library will then call
|
||||
<function>abort</function>().</para>
|
||||
|
||||
<para><function>ne_oom_callback</function> registers a callback
|
||||
which will be invoked if an out of memory error is detected.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Notes</title>
|
||||
|
||||
<para>If the operating system uses optimistic memory
|
||||
allocation, the C library memory allocation routines will not return
|
||||
&null;, so it is not possible to gracefully handle memory allocation
|
||||
failures.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,114 @@
|
||||
<refentry id="refauth">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_set_server_auth</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_set_server_auth">ne_set_server_auth</refname>
|
||||
<refname id="ne_set_proxy_auth">ne_set_proxy_auth</refname>
|
||||
<refname id="ne_forget_auth">ne_forget_auth</refname>
|
||||
<refpurpose>register authentication callbacks</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_auth.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>typedef int (*<function>ne_auth_creds</function>)</funcdef>
|
||||
<paramdef>void *<parameter>userdata</parameter></paramdef>
|
||||
<paramdef>const char *<parameter>realm</parameter></paramdef>
|
||||
<paramdef>int <parameter>attempt</parameter></paramdef>
|
||||
<paramdef>char *<parameter>username</parameter></paramdef>
|
||||
<paramdef>char *<parameter>password</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_set_server_auth</function></funcdef>
|
||||
<paramdef>ne_session *<parameter>session</parameter></paramdef>
|
||||
<paramdef>ne_auth_creds <parameter>callback</parameter></paramdef>
|
||||
<paramdef>void *<parameter>userdata</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_set_proxy_auth</function></funcdef>
|
||||
<paramdef>ne_session *<parameter>session</parameter></paramdef>
|
||||
<paramdef>ne_auth_creds <parameter>callback</parameter></paramdef>
|
||||
<paramdef>void *<parameter>userdata</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_forget_auth</function></funcdef>
|
||||
<paramdef>ne_session *<parameter>session</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The <type>ne_auth_creds</type> function type defines a
|
||||
callback which is invoked when a server or proxy server requires user
|
||||
authentication for a particular request. The
|
||||
<parameter>realm</parameter> string is supplied by the server. <!--
|
||||
FIXME --> The <parameter>attempt</parameter> is a counter giving the
|
||||
number of times the request has been retried with different
|
||||
authentication credentials. The first time the callback is invoked
|
||||
for a particular request, <parameter>attempt</parameter> will be zero.</para>
|
||||
|
||||
<para>To retry the request using new authentication
|
||||
credentials, the callback should return zero, and the
|
||||
<parameter>username</parameter> and <parameter>password</parameter>
|
||||
buffers must contain &nul;-terminated strings. The
|
||||
<literal>NE_ABUFSIZ</literal> constant gives the size of these
|
||||
buffers.</para>
|
||||
|
||||
<tip>
|
||||
<para>If you only wish to allow the user one attempt to enter
|
||||
credentials, use the value of the <parameter>attempt</parameter>
|
||||
parameter as the return value of the callback.</para>
|
||||
</tip>
|
||||
|
||||
<para>To abort the request, the callback should return a
|
||||
non-zero value; in which case the contents of the
|
||||
<parameter>username</parameter> and <parameter>password</parameter>
|
||||
buffers are ignored.</para>
|
||||
|
||||
<para>The <function>ne_forget_auth</function> function can be
|
||||
used to discard the cached authentication credentials.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
|
||||
<programlisting>
|
||||
/* Function which prompts for a line of user input: */
|
||||
extern char *prompt_for(const char *prompt);
|
||||
|
||||
static int
|
||||
my_auth(void *userdata, const char *realm, int attempts,
|
||||
char *username, char *password)
|
||||
{
|
||||
strncpy(username, prompt_for("Username: "), NE_ABUFSIZ);
|
||||
strncpy(password, prompt_for("Password: "), NE_ABUFSIZ);
|
||||
return attempts;
|
||||
}
|
||||
|
||||
int main(...)
|
||||
{
|
||||
&egsess;
|
||||
|
||||
ne_set_server_auth(sess, my_auth, NULL);
|
||||
|
||||
/* ... */
|
||||
}</programlisting>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,53 @@
|
||||
<refentry id="refbuf">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_buffer</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_buffer">ne_buffer</refname>
|
||||
<refpurpose>string buffer handling</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis><funcsynopsisinfo>#include <ne_string.h>
|
||||
|
||||
typedef struct {
|
||||
char *data;
|
||||
size_t used;
|
||||
size_t length;
|
||||
} <type>ne_buffer</type>;</funcsynopsisinfo></funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The <type>ne_buffer</type> type represents an expandable
|
||||
memory buffer for holding &nul;-terminated strings. The
|
||||
<structfield>data</structfield> field points to the beginnning of the
|
||||
string, the length of which is given by the
|
||||
<structfield>used</structfield> field. The current size of memory
|
||||
allocated is given by the <structfield>length</structfield> field. It
|
||||
is not recommended that the fields of a buffer are manipulated
|
||||
directly. The <structfield>data</structfield> pointer may change when
|
||||
the buffer is modified.</para>
|
||||
|
||||
<para>A buffer is created using <xref
|
||||
linkend="ne_buffer_create"/> or <xref
|
||||
linkend="ne_buffer_create_sized"/>, and destroyed using <xref
|
||||
linkend="ne_buffer_destroy"/> or <xref linkend="ne_buffer_finish"/>.
|
||||
The functions <xref linkend="ne_buffer_append"/>, <xref
|
||||
linkend="ne_buffer_zappend"/> and <xref linkend="ne_buffer_concat"/> are
|
||||
used to append data to a buffer.</para>
|
||||
|
||||
<para>If the string referenced by the
|
||||
<structfield>data</structfield> pointer is modified directly (rather
|
||||
than using one of the functions listed above),
|
||||
<function>ne_buffer_altered</function> must be called.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,89 @@
|
||||
<refentry id="refbufapp">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_buffer_append</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_buffer_append">ne_buffer_append</refname>
|
||||
<refname id="ne_buffer_zappend">ne_buffer_zappend</refname>
|
||||
<refname id="ne_buffer_concat">ne_buffer_concat</refname>
|
||||
<refpurpose>append data to a string buffer</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_string.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_buffer_append</function></funcdef>
|
||||
<paramdef>ne_buffer *<parameter>buf</parameter></paramdef>
|
||||
<paramdef>const char *<parameter>string</parameter></paramdef>
|
||||
<paramdef>size_t <parameter>len</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_buffer_zappend</function></funcdef>
|
||||
<paramdef>ne_buffer *<parameter>buf</parameter></paramdef>
|
||||
<paramdef>const char *<parameter>string</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_buffer_concat</function></funcdef>
|
||||
<paramdef>ne_buffer *<parameter>buf</parameter></paramdef>
|
||||
<paramdef>const char *<parameter>str</parameter></paramdef>
|
||||
<paramdef>...</paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The <function>ne_buffer_append</function> and
|
||||
<function>ne_buffer_zappend</function> functions append a string to
|
||||
the end of a buffer; extending the buffer as necessary. The
|
||||
<parameter>len</parameter> passed to
|
||||
<function>ne_buffer_append</function> specifies the length of the
|
||||
string to append; there must be no &nul; terminator in the first
|
||||
<parameter>len</parameter> bytes of the string.
|
||||
<function>ne_buffer_zappend</function> must be passed a
|
||||
&nul;-terminated string.</para>
|
||||
|
||||
<para>The <function>ne_buffer_concat</function> function takes
|
||||
a variable-length argument list following <parameter>str</parameter>;
|
||||
each argument must be a <type>char *</type> pointer to a
|
||||
&nul;-terminated string. A &null; pointer must be given as the last
|
||||
argument to mark the end of the list. The strings (including
|
||||
<parameter>str</parameter>) are appended to the buffer in the order
|
||||
given. None of the strings passed to
|
||||
<function>ne_buffer_concat</function> are modified.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
|
||||
<para>The following code will output "<literal>Hello, world.
|
||||
And goodbye.</literal>".</para>
|
||||
|
||||
<programlisting>ne_buffer *buf = ne_buffer_create();
|
||||
ne_buffer_zappend(buf, "Hello");
|
||||
ne_buffer_concat(buf, ", world. ", "And ", "goodbye.", NULL);
|
||||
puts(buf->data);
|
||||
ne_buffer_destroy(buf);</programlisting>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="ne_buffer"/>, <xref linkend="ne_buffer_create"/>,
|
||||
<xref linkend="ne_buffer_destroy"/></para>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,60 @@
|
||||
<refentry id="refbufcr">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_buffer_create</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_buffer_create">ne_buffer_create</refname>
|
||||
<refname id="ne_buffer_create_sized">ne_buffer_ncreate</refname>
|
||||
<refpurpose>create a string buffer</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_alloc.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>ne_buffer *<function>ne_buffer_create</function></funcdef>
|
||||
<void/>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>ne_buffer *<function>ne_buffer_ncreate</function></funcdef>
|
||||
<paramdef>size_t <parameter>size</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para><function>ne_buffer_create</function> creates a new
|
||||
buffer object, with an implementation-defined initial size.
|
||||
<function>ne_buffer_ncreate</function> creates an
|
||||
<type>ne_buffer</type> where the minimum initial size is given in the
|
||||
<parameter>size</parameter> parameter. The buffer created will
|
||||
contain the empty string (<literal>""</literal>).</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Return value</title>
|
||||
|
||||
<para>Both functions return a pointer to a new buffer object,
|
||||
and never &null;.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="ne_buffer"/></para>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,81 @@
|
||||
<refentry id="refbufdest">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_buffer_destroy</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_buffer_destroy">ne_buffer_destroy</refname>
|
||||
<refname id="ne_buffer_finish">ne_buffer_finish</refname>
|
||||
<refpurpose>destroy a buffer object</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_string.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_buffer_destroy</function></funcdef>
|
||||
<paramdef>ne_buffer *<parameter>buf</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>char *<function>ne_buffer_finish</function></funcdef>
|
||||
<paramdef>ne_buffer *<parameter>buf</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para><function>ne_buffer_destroy</function> frees all memory
|
||||
associated with the buffer. <function>ne_buffer_finish</function>
|
||||
frees the buffer structure, but not the actual string stored in the
|
||||
buffer, which is returned and must be <function>free</function>()d by
|
||||
the caller.</para>
|
||||
|
||||
<para>Any use of the buffer object after calling either of these
|
||||
functions gives undefined behaviour.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Return value</title>
|
||||
|
||||
<para><function>ne_buffer_finish</function> returns the
|
||||
<function>malloc</function>-allocated string stored in the buffer.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
|
||||
<para>An example use of <function>ne_buffer_finish</function>;
|
||||
the <function>duplicate</function> function returns a string made up of
|
||||
<parameter>n</parameter> copies of <parameter>str</parameter>:</para>
|
||||
|
||||
<programlisting>static char *duplicate(int n, const char *str)
|
||||
{
|
||||
ne_buffer *buf = ne_buffer_create();
|
||||
while (n--) {
|
||||
ne_buffer_zappend(buf, str);
|
||||
}
|
||||
return ne_buffer_finish(buf);
|
||||
}</programlisting>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="ne_buffer"/>, <xref linkend="ne_buffer_create"/>,
|
||||
<xref linkend="ne_buffer_zappend"/></para>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,62 @@
|
||||
<refentry id="refbufutil">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_buffer_clear</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_buffer_clear">ne_buffer_clear</refname>
|
||||
<refname id="ne_buffer_grow">ne_buffer_grow</refname>
|
||||
<refname id="ne_buffer_altered">ne_buffer_altered</refname>
|
||||
<refpurpose>clear, grow, or mark as altered a string buffer</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_string.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_buffer_clear</function></funcdef>
|
||||
<paramdef>ne_buffer *<parameter>buf</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_buffer_altered</function></funcdef>
|
||||
<paramdef>ne_buffer *<parameter>buf</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_buffer_grow</function></funcdef>
|
||||
<paramdef>ne_buffer *<parameter>buf</parameter></paramdef>
|
||||
<paramdef>size_t <parameter>size</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The <function>ne_buffer_clear</function> function sets
|
||||
the string stored in <parameter>buf</parameter> to be the empty string
|
||||
(<literal>""</literal>).</para>
|
||||
|
||||
<para>The <function>ne_buffer_altered</function> function must
|
||||
be used after the string stored in the buffer
|
||||
<parameter>buf</parameter> is modified by directly rather than using
|
||||
<xref linkend="ne_buffer_append"/>, <xref linkend="ne_buffer_zappend"/>
|
||||
or <xref linkend="ne_buffer_concat"/>.</para>
|
||||
|
||||
<para>The <function>ne_buffer_grow</function> function
|
||||
ensures that at least <parameter>size</parameter> bytes are allocated
|
||||
for the string; this can be used if a large amount of data is going to
|
||||
be appended to the buffer and may result in more efficient memory
|
||||
allocation.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,153 @@
|
||||
<refentry id="refclicert">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_ssl_client_cert</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_ssl_clicert_read">ne_ssl_clicert_read</refname>
|
||||
<refname id="ne_ssl_clicert_name">ne_ssl_clicert_name</refname>
|
||||
<refname id="ne_ssl_clicert_encrypted">ne_ssl_clicert_encrypted</refname>
|
||||
<refname id="ne_ssl_clicert_decrypt">ne_ssl_clicert_decrypt</refname>
|
||||
<refname id="ne_ssl_clicert_owner">ne_ssl_clicert_owner</refname>
|
||||
<refname id="ne_ssl_clicert_free">ne_ssl_clicert_free</refname>
|
||||
<refpurpose>SSL client certificate handling</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_ssl.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>ne_ssl_client_cert *<function>ne_ssl_clicert_read</function></funcdef>
|
||||
<paramdef>const char *<parameter>filename</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>const char *<function>ne_ssl_clicert_name</function></funcdef>
|
||||
<paramdef>const ne_ssl_client_cert *<parameter>ccert</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>int <function>ne_ssl_clicert_encrypted</function></funcdef>
|
||||
<paramdef>const ne_ssl_client_cert *<parameter>ccert</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>int <function>ne_ssl_clicert_decrypt</function></funcdef>
|
||||
<paramdef>ne_ssl_client_cert *<parameter>ccert</parameter></paramdef>
|
||||
<paramdef>const char *<parameter>password</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>const ne_ssl_certificate *<function>ne_ssl_clicert_owner</function></funcdef>
|
||||
<paramdef>const ne_ssl_client_cert *<parameter>ccert</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_ssl_clicert_free</function></funcdef>
|
||||
<paramdef>ne_ssl_client_cert *<parameter>ccert</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The <function>ne_ssl_clicert_read</function> function reads
|
||||
a <firstterm>client certificate</firstterm> from a
|
||||
PKCS#12-formatted file, and returns an
|
||||
<type>ne_ssl_client_cert</type> object. If the client
|
||||
certificate is encrypted, it must be decrypted before it is used.
|
||||
An <type>ne_ssl_client_cert</type> object holds a client
|
||||
certificate and the associated private key, not just a
|
||||
certificate; the term "<glossterm>client certificate</glossterm>"
|
||||
will used to refer to this pair.</para>
|
||||
|
||||
<para>A client certificate can be in one of two states:
|
||||
<emphasis>encrypted</emphasis> or <emphasis>decrypted</emphasis>.
|
||||
The <function>ne_ssl_clicert_encrypted</function> function will
|
||||
return non-zero if the client certificate is in the
|
||||
<emphasis>encrypted</emphasis> state. A client certificate object
|
||||
returned by <function>ne_ssl_clicert_read</function> may be
|
||||
initially in either state, depending on whether the file was
|
||||
encrypted or not.</para>
|
||||
|
||||
<para><function>ne_ssl_clicert_decrypt</function> can be used to
|
||||
decrypt a client certificate using the appropriate password. This
|
||||
function must only be called if the object is in the
|
||||
<emphasis>encrypted</emphasis> state; if decryption fails, the
|
||||
certificate state does not change, so decryption can be attempted
|
||||
more than once using different passwords.</para>
|
||||
|
||||
<para>A client certificate can be given a "friendly name" when it
|
||||
is created; <function>ne_ssl_clicert_name</function> will return
|
||||
this name (or &null; if no friendly name was specified).
|
||||
<function>ne_ssl_clicert_name</function> can be used when the
|
||||
client certificate is in either the encrypted or decrypted state,
|
||||
and will return the same string for the lifetime of the
|
||||
object.</para>
|
||||
|
||||
<para>The function <function>ne_ssl_clicert_owner</function>
|
||||
returns the certificate part of the client certificate; it must
|
||||
only be called if the client certificate is in the
|
||||
<emphasis>decrypted</emphasis> state.</para>
|
||||
|
||||
<para>When the client certificate is no longer needed, the
|
||||
<function>ne_ssl_clicert_free</function> function should be used
|
||||
to destroy the object.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Return value</title>
|
||||
|
||||
<para><function>ne_ssl_clicert_read</function> returns a client
|
||||
certificate object, or &null; if the file could not be read.
|
||||
<function>ne_ssl_clicert_encrypted</function> returns zero if the
|
||||
object is in the decrypted state, or non-zero if it is in the
|
||||
encrypted state. <function>ne_ssl_clicert_name</function> returns
|
||||
a &nul;-terminated friendly name string, or &null;.
|
||||
<function>ne_ssl_clicert_owner</function> returns a certificate
|
||||
object.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
|
||||
<para>The following code reads a client certificate and decrypts
|
||||
it if necessary, then loads it into an HTTP session.</para>
|
||||
|
||||
<programlisting>ne_ssl_client_cert *ccert;
|
||||
|
||||
ccert = ne_ssl_clicert_read("/path/to/client.p12");
|
||||
|
||||
if (ccert == NULL) {
|
||||
/* handle error... */
|
||||
} else if (ne_ssl_clicert_encrypted(ccert)) {
|
||||
char *password = prompt_for_password();
|
||||
|
||||
if (ne_ssl_clicert_decrypt(ccert, password)) {
|
||||
/* could not decrypt! handle error... */
|
||||
}
|
||||
}
|
||||
|
||||
ne_ssl_set_clicert(sess, ccert);
|
||||
</programlisting>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="ne_ssl_cert_read"/></para>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
<refentry id="refconfig">
|
||||
|
||||
<refentryinfo><title>neon</title></refentryinfo>
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>neon-config</refentrytitle>
|
||||
<manvolnum>1</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="neon-config">neon-config</refname>
|
||||
|
||||
<refpurpose>script providing information about installed copy
|
||||
of neon library</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<cmdsynopsis>
|
||||
<command>neon-config</command>
|
||||
<arg choice="opt"><option>--prefix</option></arg>
|
||||
<group>
|
||||
<arg><option>--cflags</option></arg>
|
||||
<arg><option>--libs</option></arg>
|
||||
<arg><option>--la-file</option></arg>
|
||||
<arg><option>--support</option> <replaceable>feature</replaceable></arg>
|
||||
<arg><option>--help</option></arg>
|
||||
<arg><option>--version</option></arg>
|
||||
</group>
|
||||
</cmdsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The <command>neon-config</command> script provides
|
||||
information about an installed copy of the neon library. The
|
||||
<option>--cflags</option> and <option>--libs</option> options instruct
|
||||
how to compile and link an application against the library; the
|
||||
<option>--version</option> and <option>--support</option> options can
|
||||
help determine whether the library meets the applications
|
||||
requirements.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Options</title>
|
||||
|
||||
<variablelist>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--cflags</option></term>
|
||||
<listitem><simpara>Print the flags which should be passed to
|
||||
the C compiler when compiling object files, when the object files use
|
||||
neon header files.</simpara></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--libs</option></term>
|
||||
<listitem><simpara>Print the flags which should be passed to
|
||||
the linker when linking an application which uses the neon
|
||||
library</simpara></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--la-file</option></term>
|
||||
<listitem><simpara>Print the location of the libtool library
|
||||
script, <filename>libneon.la</filename>, which can be used to link against
|
||||
&neon; by applications using libtool.</simpara></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--version</option></term>
|
||||
<listitem><simpara>Print the version of the library</simpara></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--prefix</option> <replaceable>dir</replaceable></term>
|
||||
<listitem><simpara>If <replaceable>dir</replaceable> is given; relocate output of
|
||||
<option>--cflags</option> and <option>--libs</option> as if neon was
|
||||
installed in given prefix directory. Otherwise, print the
|
||||
installation prefix of the library.</simpara></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--support</option> <replaceable>feature</replaceable></term>
|
||||
<listitem><simpara>The script exits with success if
|
||||
<replaceable>feature</replaceable> is supported by the
|
||||
library.</simpara></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--help</option></term>
|
||||
<listitem><simpara>Print help message; includes list of known
|
||||
features and whether they are supported or not.</simpara></listitem>
|
||||
</varlistentry>
|
||||
|
||||
</variablelist>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1 id="example">
|
||||
<title>Example</title>
|
||||
|
||||
<para>Below is a Makefile fragment which could be used to
|
||||
build an application against an installed neon library, when the
|
||||
<command>neon-config</command> script can be found in
|
||||
<envar>$PATH</envar>.</para>
|
||||
|
||||
<programlisting>CFLAGS = `neon-config --cflags`
|
||||
LIBS = `neon-config --libs`
|
||||
OBJECTS = myapp.o
|
||||
TARGET = myapp
|
||||
|
||||
$(TARGET): $(OBJECTS)
|
||||
$(CC) $(LDFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS)
|
||||
|
||||
myapp.o: myapp.c
|
||||
$(CC) $(CFLAGS) -c myapp.c -o myapp.o</programlisting>
|
||||
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,80 @@
|
||||
<refentry id="referr">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_get_error</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_get_error">ne_get_error</refname>
|
||||
<refname id="ne_set_error">ne_set_error</refname>
|
||||
<refpurpose>error handling for HTTP sessions</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_session.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>const char *<function>ne_get_error</function></funcdef>
|
||||
<paramdef>ne_sesssion *<parameter>session</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_set_error</function></funcdef>
|
||||
<paramdef>ne_sesssion *<parameter>session</parameter></paramdef>
|
||||
<paramdef>const char *<parameter>format</parameter></paramdef>
|
||||
<paramdef>...</paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The session error string is used to store any
|
||||
human-readable error information associated with any errors which
|
||||
occur whilst using the HTTP session.</para>
|
||||
|
||||
<para>The <function>ne_get_error</function> function returns
|
||||
the current session error string. This string persists only
|
||||
until it is changed by a subsequent operation on the session.
|
||||
If localisation was enabled at build time, and if necessary
|
||||
enabled at run-time if necessary using <xref
|
||||
linkend="ne_i18n_init"/>, the returned string may have been
|
||||
translated into the user's current locale.</para>
|
||||
|
||||
<para>The <function>ne_set_error</function> function can be
|
||||
used to set a new session error string, using a
|
||||
<function>printf</function>-style format string
|
||||
interface.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Return value</title>
|
||||
|
||||
<para><function>ne_set_error</function> returns a constant
|
||||
&nul;-terminated string. In the default English locale, the
|
||||
returned string will <emphasis>not</emphasis> have a
|
||||
terminating <quote>.</quote> period character.</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
<para>Retrieve the current error string:</para>
|
||||
<programlisting>&egsess;
|
||||
...
|
||||
printf("Error was: %s\n", ne_get_error(sess));</programlisting>
|
||||
|
||||
<para>Set a new error string:</para>
|
||||
<programlisting>&egsess;
|
||||
...
|
||||
ne_set_error(sess, "Response missing header %s", "somestring");</programlisting>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,95 @@
|
||||
<refentry id="reffeat">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_has_support</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_has_support">ne_has_support</refname>
|
||||
<refpurpose>determine feature support status</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_utils.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>int <function>ne_has_support</function></funcdef>
|
||||
<paramdef>int <parameter>feature</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The <function>ne_has_support</function> function can be used
|
||||
to determine whether a particular optional feature, given by the
|
||||
feature code <parameter>feature</parameter>, is supported. The
|
||||
following feature codes are available:
|
||||
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term><constant>NE_FEATURE_SSL</constant></term>
|
||||
<listitem>
|
||||
<simpara>Indicates support for SSL/TLS</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><constant>NE_FEATURE_ZLIB</constant></term>
|
||||
<listitem>
|
||||
<simpara>Indicates support for compressed responses</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><constant>NE_FEATURE_IPV6</constant></term>
|
||||
<listitem>
|
||||
<simpara>Indicates support for IPv6</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><constant>NE_FEATURE_LFS</constant></term>
|
||||
<listitem>
|
||||
<simpara>Indicates support for large files</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><constant>NE_FEATURE_SOCKS</constant></term>
|
||||
<listitem>
|
||||
<simpara>Indicates support for SOCKSv5</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><constant>NE_FEATURE_TS_SSL</constant></term>
|
||||
<listitem>
|
||||
<simpara>Indicates support for thread-safe SSL
|
||||
initialization — see <xref linkend="ne_sock_init"/></simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
|
||||
</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Return value</title>
|
||||
|
||||
<para><function>ne_has_support</function> returns non-zero if
|
||||
the given feature is supported, or zero otherwise.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="refvers"/>, <xref linkend="refsockinit"/></para>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
<refentry id="refgetst">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_get_status</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_get_status">ne_get_status</refname>
|
||||
<refpurpose>retrieve HTTP response status for request</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_request.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>const ne_status *<function>ne_get_status</function></funcdef>
|
||||
<paramdef>const ne_request *<parameter>request</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The <function>ne_get_status</function> function returns
|
||||
a pointer to the HTTP status object giving the result of a request.
|
||||
The object returned only becomes valid once the request has been
|
||||
<emphasis>successfully</emphasis> dispatched (the return value of
|
||||
<function>ne_request_dispatch</function> or
|
||||
<function>ne_begin_request</function> was zero). The object remains
|
||||
valid until the associated request object is destroyed.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="ne_status"/>, <xref
|
||||
linkend="ne_request_create"/></para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Example</title>
|
||||
|
||||
<para>Display the response status code of applying the
|
||||
<literal>HEAD</literal> method to some resource.</para>
|
||||
|
||||
<programlisting>ne_request *req = ne_request_create(sess, "HEAD", "/foo/bar");
|
||||
if (ne_request_dispatch(req))
|
||||
/* handle errors... */
|
||||
else
|
||||
printf("Response status code was %d\n", ne_get_status(req)->code);
|
||||
ne_request_destroy(req);</programlisting>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,71 @@
|
||||
<refentry id="refi18n">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_i18n_init</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_i18n_init">ne_i18n_init</refname>
|
||||
<refpurpose>functions to initialize internationalization support</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_i18n.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_i18n_init</function></funcdef>
|
||||
<paramdef>const char *<parameter>encoding</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The <function>ne_i18n_init</function> function can be used
|
||||
to enable support for translated messages in the &neon; library.
|
||||
The <parameter>encoding</parameter> parameter, if non-&null;,
|
||||
specifies the character encoding required for generated translated
|
||||
string. If it is &null;, the appropriate character encoding for
|
||||
the process locale will be used.</para>
|
||||
|
||||
<para>This call is only strictly necessary if either:
|
||||
|
||||
<orderedlist numeration="loweralpha">
|
||||
|
||||
<listitem><simpara>&neon; has been installed into a different
|
||||
prefix than the <literal>gettext</literal> implementation on
|
||||
which it depends for i18n purposes, or</simpara></listitem>
|
||||
|
||||
<listitem><simpara>the caller requires that translated messages
|
||||
are in a particular character encoding.</simpara></listitem>
|
||||
|
||||
</orderedlist></para>
|
||||
|
||||
<para>If <function>ne_i18n_init</function> is never called, the
|
||||
message catalogs will not be found if case (a) applies (and so
|
||||
English error messages will be used), and will use the default
|
||||
character encoding specified by the process locale. The library
|
||||
will otherwise operate correctly.</para>
|
||||
|
||||
<para>Note that the encoding used is a process-global setting and
|
||||
so results may be unexpected if other users of &neon; within the
|
||||
process call <function>ne_i18n_init</function> with a different
|
||||
encoding parameter.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="ne_sock_init"/></para>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
|
||||
@@ -0,0 +1,133 @@
|
||||
<refentry id="refiaddr">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_iaddr_make</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_iaddr_make">ne_iaddr_make</refname>
|
||||
<refname id="ne_iaddr_cmp">ne_iaddr_cmp</refname>
|
||||
<refname id="ne_iaddr_print">ne_iaddr_print</refname>
|
||||
<refname id="ne_iaddr_typeof">ne_iaddr_typeof</refname>
|
||||
<refname id="ne_iaddr_free">ne_iaddr_free</refname>
|
||||
<refpurpose>functions to manipulate and compare network addresses</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_socket.h>
|
||||
|
||||
typedef enum {
|
||||
ne_iaddr_ipv4 = 0,
|
||||
ne_iaddr_ipv6
|
||||
} <type>ne_iaddr_type</type>;</funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>ne_inet_addr *<function>ne_iaddr_make</function></funcdef>
|
||||
<paramdef>ne_iaddr_type <parameter>type</parameter></paramdef>
|
||||
<paramdef>const unsigned char *<parameter>raw</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>int <function>ne_iaddr_cmp</function></funcdef>
|
||||
<paramdef>const ne_inet_addr *<parameter>ia1</parameter></paramdef>
|
||||
<paramdef>const ne_inet_addr *<parameter>ia2</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>char *<function>ne_iaddr_print</function></funcdef>
|
||||
<paramdef>const ne_inet_addr *<parameter>ia</parameter></paramdef>
|
||||
<paramdef>char *<parameter>buffer</parameter></paramdef>
|
||||
<paramdef>size_t <parameter>bufsiz</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>ne_iaddr_type <function>ne_iaddr_typeof</function></funcdef>
|
||||
<paramdef>const ne_inet_addr *<parameter>ia</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_iaddr_free</function></funcdef>
|
||||
<paramdef>const ne_inet_addr *<parameter>ia</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para><function>ne_iaddr_make</function> creates an
|
||||
<type>ne_inet_addr</type> object from a raw binary network
|
||||
address; for instance the four bytes <literal>0x7f 0x00 0x00
|
||||
0x01</literal> represent the IPv4 address
|
||||
<literal>127.0.0.1</literal>. The object returned is suitable for
|
||||
passing to <function>ne_sock_connect</function>. A binary IPv4
|
||||
address contains four bytes; a binary IPv6 address contains
|
||||
sixteen bytes; addresses passed must be in network byte
|
||||
order.</para>
|
||||
|
||||
<para><function>ne_iaddr_cmp</function> can be used to compare two
|
||||
network addresses; returning zero only if they are identical. The
|
||||
addresses need not be of the same address type; if the addresses
|
||||
are not of the same type, the return value is guaranteed to be
|
||||
non-zero.</para>
|
||||
|
||||
<para><function>ne_iaddr_print</function> can be used to print the
|
||||
human-readable string representation of a network address into a
|
||||
buffer, for instance the string
|
||||
<literal>"127.0.0.1"</literal>.</para>
|
||||
|
||||
<para><function>ne_iaddr_typeof</function> returns the type of the
|
||||
given network address.</para>
|
||||
|
||||
<para><function>ne_iaddr_free</function> releases the memory
|
||||
associated with a network address object.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Return value</title>
|
||||
|
||||
<para><function>ne_iaddr_make</function> returns &null; if the
|
||||
address type passed is not supported (for instance on a platform
|
||||
which does not support IPv6).</para>
|
||||
|
||||
|
||||
<para><function>ne_iaddr_print</function> returns the
|
||||
<parameter>buffer</parameter> pointer, and never &null;.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
|
||||
<para>The following example connects a socket to port 80 at the
|
||||
address <literal>127.0.0.1</literal>.</para>
|
||||
|
||||
<programlisting>unsigned char addr[] = "\0x7f\0x00\0x00\0x01";
|
||||
ne_inet_addr *ia;
|
||||
|
||||
ia = ne_iaddr_make(ne_iaddr_ipv4, addr);
|
||||
if (ia != NULL) {
|
||||
ne_socket *sock = ne_sock_connect(ia, 80);
|
||||
ne_iaddr_free(ia);
|
||||
/* ... */
|
||||
} else {
|
||||
/* ... */
|
||||
}</programlisting>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="ne_addr_resolve"/></para>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
|
||||
@@ -0,0 +1,132 @@
|
||||
<refentry id="refsockinit">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_sock_init</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_sock_init">ne_sock_init</refname>
|
||||
<refname id="ne_sock_exit">ne_sock_exit</refname>
|
||||
<refpurpose>perform library initialization</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_socket.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>int <function>ne_sock_init</function></funcdef>
|
||||
<void/>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_sock_exit</function></funcdef>
|
||||
<void/>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>In some platforms and configurations, &neon; may be using
|
||||
some socket or SSL libraries which require global initialization
|
||||
before use. To perform this initialization, the
|
||||
<function>ne_sock_init</function> function must be called before
|
||||
any other library functions are used.</para>
|
||||
|
||||
<para>Once all use of &neon; is complete,
|
||||
<function>ne_sock_exit</function> can be called to perform
|
||||
de-initialization of socket or SSL libraries, if necessary. Uses
|
||||
of <function>ne_sock_init</function> and
|
||||
<function>ne_sock_exit</function> are "reference counted"; if N
|
||||
calls to <function>ne_sock_init</function> are made, only the Nth
|
||||
call to <function>ne_sock_exit</function> will have effect.</para>
|
||||
|
||||
<para><function>ne_sock_init</function> will set the disposition
|
||||
of the <literal>SIGPIPE</literal> signal to
|
||||
<emphasis>ignored</emphasis>. No change is made to the
|
||||
<literal>SIGPIPE</literal> disposition by
|
||||
<function>ne_sock_exit</function>.</para>
|
||||
|
||||
<para>Both the SSL libraries supported by &neon; — OpenSSL
|
||||
and GnuTLS — require callbacks to be registered to allow
|
||||
thread-safe use of SSL. These callbacks are stored as global
|
||||
variables and so their state persists for as long as the library
|
||||
in question is loaded into the process. If multiple users of the
|
||||
SSL library exist within the process, this can be problematic,
|
||||
particularly if one is dynamically loaded (and may subsequently be
|
||||
unloaded).</para>
|
||||
|
||||
<para>If &neon; is configured using the
|
||||
<literal>--enable-threadsafe-ssl</literal> flag, thread-safe SSL
|
||||
support will be enabled automatically, as covered in the following
|
||||
section. Otherwise, it is not safe to use &neon; with SSL in a
|
||||
multi-threaded process. The <xref linkend="ne_has_support"/>
|
||||
function can be used to determine whether &neon; is built to
|
||||
enable thread-safety support in the SSL library.</para>
|
||||
|
||||
<refsect2>
|
||||
<title>Thread-safe SSL with OpenSSL</title>
|
||||
|
||||
<para>&neon; follows two simple rules when dealing with the
|
||||
OpenSSL locking callbacks:
|
||||
|
||||
<itemizedlist>
|
||||
|
||||
<listitem><simpara><function>ne_sock_init</function> will set
|
||||
thread-safety locking callbacks if and only if no locking
|
||||
callbacks are already registered.</simpara></listitem>
|
||||
|
||||
<listitem><simpara><function>ne_sock_exit</function> will
|
||||
unset the thread-safety locking callbacks if and only if the
|
||||
locking callbacks registered are those registered by
|
||||
<function>ne_sock_init</function>.</simpara></listitem>
|
||||
|
||||
</itemizedlist>
|
||||
|
||||
Applications and libraries should be able to co-operate to
|
||||
ensure that SSL use is always thread-safe if similar rules are
|
||||
always followed.</para>
|
||||
|
||||
</refsect2>
|
||||
|
||||
<refsect2>
|
||||
<title>Thread-safe SSL with GnuTLS</title>
|
||||
|
||||
<para>The cryptography library used by GnuTLS, libgcrypt, only
|
||||
supports an initialization operation to register thread-safety
|
||||
callbacks. <function>ne_sock_init</function> will register the
|
||||
thread-safe locking callbacks on first use;
|
||||
<function>ne_sock_exit</function> cannot unregister them. If
|
||||
multiple users of GnuTLS are present within the process, it is
|
||||
unsafe to dynamically unload &neon; from the process if &neon;
|
||||
is configured with thread-safe SSL support enabled (since the
|
||||
callbacks would be left pointing at unmapped memory once &neon;
|
||||
is unloaded).</para>
|
||||
|
||||
</refsect2>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Return value</title>
|
||||
|
||||
<para><function>ne_sock_init</function> returns zero on success,
|
||||
or non-zero on error. If an error occurs, no further use of the
|
||||
&neon; library should be attempted.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="refneon"/>, <xref linkend="reffeat"/></para>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,287 @@
|
||||
<refentry id="refneon">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>neon</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname>neon</refname>
|
||||
<refpurpose>HTTP and WebDAV client library</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>neon is an HTTP and WebDAV client library. The major
|
||||
abstractions exposed are the HTTP <emphasis>session</emphasis>,
|
||||
created by <xref linkend="ne_session_create"/>; and the HTTP
|
||||
<emphasis>request</emphasis>, created by <xref
|
||||
linkend="ne_request_create"/>. HTTP authentication is handled
|
||||
transparently for server and proxy servers, see <xref
|
||||
linkend="ne_set_server_auth"/>; complete SSL/TLS support is also
|
||||
included, see <xref linkend="ne_ssl_set_verify"/>.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Conventions</title>
|
||||
|
||||
<para>Some conventions are used throughout the neon API, to
|
||||
provide a consistent and simple interface; these are documented
|
||||
below.</para>
|
||||
|
||||
<refsect2>
|
||||
<title>Thread-safeness and global initialization</title>
|
||||
|
||||
<para>&neon; itself is implemented to be thread-safe (avoiding any
|
||||
use of global state), but relies on the operating system providing
|
||||
a thread-safe resolver interface. Modern operating systems offer
|
||||
the thread-safe <function>getaddrinfo</function> interface, which
|
||||
&neon; supports; some others implement
|
||||
<function>gethostbyname</function> using thread-local
|
||||
storage.</para>
|
||||
|
||||
<para>To allow thread-safe use of SSL in the OpenSSL and GnuTLS
|
||||
libraries &neon; must be configured using the
|
||||
<literal>--enable-threadsafe-ssl</literal>; if this is done,
|
||||
locking callbacks will be registered by <xref
|
||||
linkend="ne_sock_init"/>; note that care must be exercised if
|
||||
&neon; is used in conjunction with another library which uses
|
||||
OpenSSL or GnuTLS.</para>
|
||||
|
||||
<para>Some platforms and libraries used by &neon; require global
|
||||
initialization before use; notably:
|
||||
|
||||
<itemizedlist>
|
||||
<listitem><simpara>The <literal>SIGPIPE</literal> signal
|
||||
disposition must be set to <emphasis>ignored</emphasis> or
|
||||
otherwise handled to avoid process termination when writing to a
|
||||
socket which has been shutdown by the peer.</simpara></listitem>
|
||||
|
||||
<listitem><simpara>OpenSSL and GnuTLS require global
|
||||
initialization to load shared lookup
|
||||
tables.</simpara></listitem>
|
||||
|
||||
<listitem><simpara>The Win32 socket library requires
|
||||
initialization before use.</simpara></listitem>
|
||||
</itemizedlist>
|
||||
|
||||
The <xref linkend="ne_sock_init"/> function should be called
|
||||
before any other use of &neon; to perform any necessary
|
||||
initialization needed for the particular platform. Applications
|
||||
wishing to perform all the necessary process-global initialization
|
||||
steps themselves may omit to call <xref linkend="ne_sock_init"/>
|
||||
(and <xref linkend="ne_sock_exit"/>); &neon; neither checks whether
|
||||
these functions are called nor calls them itself.</para>
|
||||
|
||||
<para>For some applications and configurations it may be necessary
|
||||
to call <xref linkend="ne_i18n_init"/> to initialize the support
|
||||
for internationalization in &neon;.</para>
|
||||
|
||||
</refsect2>
|
||||
|
||||
<refsect2>
|
||||
<title>Asynchronous signal safety</title>
|
||||
|
||||
<para>No function in &neon; is defined to be <quote>async-signal safe</quote> -
|
||||
that is, no function is safe to call from a signal handler. Any
|
||||
call into the &neon; library from a signal handler will have
|
||||
undefined behaviour - in other words, it may crash the
|
||||
process.</para>
|
||||
</refsect2>
|
||||
|
||||
<refsect2>
|
||||
<title>Functions using global state</title>
|
||||
|
||||
<para>Any function in &neon; may modify the
|
||||
<literal>errno</literal> global variable as a side-effect. Except
|
||||
where explicitly documented, the value of <literal>errno</literal>
|
||||
is unspecified after any &neon; function call.</para>
|
||||
|
||||
<para>Other than in the use of <literal>errno</literal>, the only
|
||||
functions which use or modify process-global state in &neon; are
|
||||
as follows:
|
||||
|
||||
<itemizedlist>
|
||||
<listitem><simpara><xref linkend="ne_sock_init"/>, <xref
|
||||
linkend="ne_i18n_init"/>, and <xref linkend="ne_sock_exit"/>, as
|
||||
described above</simpara></listitem>
|
||||
|
||||
<listitem><simpara><function>ne_debug_init</function> and
|
||||
<function>ne_debug</function>, if enabled at compile time; for
|
||||
debugging output</simpara></listitem>
|
||||
|
||||
<listitem><simpara><xref linkend="ne_oom_callback"/> for
|
||||
installing a process-global callback to be invoked on
|
||||
<function>malloc</function> failure</simpara></listitem>
|
||||
|
||||
</itemizedlist></para>
|
||||
|
||||
</refsect2>
|
||||
|
||||
<refsect2>
|
||||
<title>Namespaces</title>
|
||||
|
||||
<para>To avoid possible collisions between names used for symbols
|
||||
and preprocessor macros by an application and the libraries it
|
||||
uses, it is good practice for each library to reserve a particular
|
||||
<emphasis>namespace prefix</emphasis>. An application which
|
||||
ensures it uses no names with these prefixes is then guaranteed to
|
||||
avoid such collisions.</para>
|
||||
|
||||
<para>The &neon; library reserves the use of the namespace
|
||||
prefixes <literal>ne_</literal> and <literal>NE_</literal>. The
|
||||
libraries used by &neon; may also reserve certain namespaces;
|
||||
collisions between these libraries and a &neon;-based application
|
||||
will not be detected at compile time, since the underlying library
|
||||
interfaces are not exposed through the &neon; header files. Such
|
||||
collisions can only be detected at link time, when the linker
|
||||
attempts to resolve symbols. The following list documents some of
|
||||
the namespaces claimed by libraries used by &neon;; this list may
|
||||
be incomplete.</para>
|
||||
|
||||
<variablelist>
|
||||
|
||||
<varlistentry>
|
||||
<term>SSL, ssl, TLS, tls, ERR_, BIO_, d2i_, i2d_, ASN1_</term>
|
||||
<listitem><simpara>Some of the many prefixes used by the OpenSSL
|
||||
library; little attempt has been made to keep exported symbols
|
||||
within any particular prefixes for this
|
||||
library.</simpara></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>gnutls_, gcry_, gpg_</term>
|
||||
<listitem><simpara>Namespaces used by the GnuTLS library (and
|
||||
dependencies thereof)</simpara></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>XML_, Xml[A-Z]</term> <listitem><simpara>Namespaces
|
||||
used by the expat library.</simpara></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>xml[A-Z], html[A-Z], docb[A-Z]</term>
|
||||
<listitem><simpara>Namespaces used by the libxml2 library; a
|
||||
relatively small number of symbols are used without these
|
||||
prefixes.</simpara></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>inflate, deflate, crc32, compress, uncompres, adler32,
|
||||
zlib</term>
|
||||
<listitem><simpara>Namespaces used by the zlib library; a
|
||||
relatively small number of symbols are used without these
|
||||
prefixes.</simpara></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>krb5, gss, GSS, asn1, decode_krb5, encode_krb5, profile,
|
||||
mit</term>
|
||||
|
||||
<listitem><simpara>Some of the prefixes used by the MIT GSSAPI
|
||||
library and dependencies thereof; a number of symbols lie
|
||||
outside these prefixes.</simpara></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>pakchois_</term>
|
||||
<listitem><simpara>Namespace used by the pakchois
|
||||
library.</simpara></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>px_</term>
|
||||
<listitem><simpara>Namespace used by the libproxy
|
||||
library.</simpara></listitem>
|
||||
</varlistentry>
|
||||
|
||||
</variablelist>
|
||||
|
||||
</refsect2>
|
||||
|
||||
<refsect2>
|
||||
<title>Argument validation</title>
|
||||
|
||||
<para>&neon; does not attempt to validate that the parameters
|
||||
passed to functions conform to the API (for instance, checking
|
||||
that pointer arguments are not &null;). Any use of the &neon; API
|
||||
which is not documented to produce a certain behaviour results is
|
||||
said to produce <emphasis>undefined behaviour</emphasis>; it is
|
||||
likely that &neon; will segfault under these conditions.</para>
|
||||
|
||||
</refsect2>
|
||||
|
||||
<refsect2>
|
||||
<title>URI paths, WebDAV metadata</title>
|
||||
|
||||
<para>The path strings passed to any function must be
|
||||
<emphasis>URI-encoded</emphasis> by the application; &neon; never
|
||||
performs any URI encoding or decoding internally. WebDAV property
|
||||
names and values must be valid UTF-8 encoded Unicode
|
||||
strings.</para>
|
||||
|
||||
</refsect2>
|
||||
|
||||
<refsect2>
|
||||
<title>User interaction</title>
|
||||
|
||||
<para>As a pure library interface, &neon; will never produce
|
||||
output on <constant>stdout</constant> or
|
||||
<constant>stderr</constant>; all user interaction is the
|
||||
responsibilty of the application.</para>
|
||||
</refsect2>
|
||||
|
||||
<refsect2>
|
||||
<title>Memory handling</title>
|
||||
|
||||
<para>neon does not attempt to cope gracefully with an
|
||||
out-of-memory situation; instead, by default, the
|
||||
<function>abort</function> function is called to immediately
|
||||
terminate the process. An application may register a custom
|
||||
function which will be called before <function>abort</function> in
|
||||
such a situation; see <xref linkend="ne_oom_callback"/>.</para>
|
||||
|
||||
</refsect2>
|
||||
|
||||
<refsect2>
|
||||
<title>Callbacks and userdata</title>
|
||||
|
||||
<para>Whenever a callback is registered, a
|
||||
<literal>userdata</literal> pointer is also used to allow the
|
||||
application to associate a context with the callback. The
|
||||
userdata is of type <type>void *</type>, allowing any pointer to
|
||||
be used.</para>
|
||||
|
||||
</refsect2>
|
||||
|
||||
<refsect2>
|
||||
<title>Large File Support</title>
|
||||
|
||||
<para>Since version 0.27.0, &neon; transparently uses the "LFS
|
||||
transitional" interfaces in places where file-backed file
|
||||
descriptors are manipulated. This means files larger than 2GiB
|
||||
can be handled on platforms with a native 32-bit
|
||||
<literal>off_t</literal> type, where LFS support is
|
||||
available.</para>
|
||||
|
||||
<para>Some interfaces use the <literal>ne_off_t</literal> type,
|
||||
which is defined to be either <literal>off_t</literal> or
|
||||
<literal>off64_t</literal> according to whether LFS support is
|
||||
detected at build time. &neon; does not use or require the
|
||||
<literal>-D_FILE_OFFSET_BITS=64</literal> macro definition.</para>
|
||||
|
||||
</refsect2>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="refsess"/>, <xref linkend="ne_oom_callback"/></para>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
<refentry id="refopts">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_set_useragent</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_set_useragent">ne_set_useragent</refname>
|
||||
<refname id="ne_set_read_timeout">ne_set_read_timeout</refname>
|
||||
<refname id="ne_set_connect_timeout">ne_set_connect_timeout</refname>
|
||||
<refname id="ne_get_scheme">ne_get_scheme</refname>
|
||||
<refname id="ne_get_server_hostport">ne_get_server_hostport</refname>
|
||||
<refpurpose>common properties for HTTP sessions</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_session.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_set_useragent</function></funcdef>
|
||||
<paramdef>ne_session *<parameter>session</parameter></paramdef>
|
||||
<paramdef>const char *<parameter>product</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_set_read_timeout</function></funcdef>
|
||||
<paramdef>ne_session *<parameter>session</parameter></paramdef>
|
||||
<paramdef>int <parameter>timeout</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_set_connect_timeout</function></funcdef>
|
||||
<paramdef>ne_session *<parameter>session</parameter></paramdef>
|
||||
<paramdef>int <parameter>timeout</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>const char *<function>ne_get_scheme</function></funcdef>
|
||||
<paramdef>ne_sesssion *<parameter>session</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>const char *<function>ne_get_server_hostport</function></funcdef>
|
||||
<paramdef>ne_sesssion *<parameter>session</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The <literal>User-Agent</literal> request header is used
|
||||
to identify the software which generated the request for statistical
|
||||
or debugging purposes. neon does not send a
|
||||
<literal>User-Agent</literal> header unless a call is made to the
|
||||
<function>ne_set_useragent</function>.
|
||||
<function>ne_set_useragent</function> must be passed a product string
|
||||
conforming to RFC2616's product token grammar; of the form
|
||||
<literal>"Product/Version"</literal>.</para>
|
||||
|
||||
<para>When neon reads from a socket, by default the read
|
||||
operation will time out after 60 seconds, and the request will fail
|
||||
giving an <errorcode>NE_TIMEOUT</errorcode> error. To configure this
|
||||
timeout interval, call <function>ne_set_read_timeout</function> giving
|
||||
the desired number of seconds as the <parameter>timeout</parameter>
|
||||
parameter.</para>
|
||||
|
||||
<para>When a connection is being established to a server,
|
||||
normally only the system's TCP timeout handling will apply.
|
||||
To configure a specific (and probably shorter) timeout, the
|
||||
<function>ne_set_connect_timeout</function> can be used,
|
||||
giving the desired number of seconds as the
|
||||
<parameter>timeout</parameter> parameter. If
|
||||
<literal>0</literal> is passed, then the default behaviour of
|
||||
using the system TCP timeout will be used.</para>
|
||||
|
||||
<para>The scheme used to initially create the session will be
|
||||
returned by <function>ne_get_scheme</function>.</para>
|
||||
|
||||
<para>The hostport pair with which the session is associated
|
||||
will be returned by the
|
||||
<function>ne_get_server_hostport</function>; for example
|
||||
<literal>www.example.com:8080</literal>. Note that the
|
||||
<literal>:port</literal> will be omitted if the default port
|
||||
for the scheme is used.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
<para>Set a user-agent string:</para>
|
||||
<programlisting>&egsess;
|
||||
ne_set_useragent(sess, "MyApplication/2.1");</programlisting>
|
||||
|
||||
<para>Set a 30 second read timeout:</para>
|
||||
<programlisting>&egsess;
|
||||
ne_set_read_timeout(sess, 30);</programlisting>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="ne_session_create"/>, <xref
|
||||
linkend="ne_set_session_flag"/>.</para>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,175 @@
|
||||
<refentry id="refreq">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_request_create</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_request_create">ne_request_create</refname>
|
||||
<refname id="ne_request_dispatch">ne_request_dispatch</refname>
|
||||
<refname id="ne_request_destroy">ne_request_destroy</refname>
|
||||
<refpurpose>low-level HTTP request handling</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_request.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>ne_request *<function>ne_request_create</function></funcdef>
|
||||
<paramdef>ne_session *<parameter>session</parameter></paramdef>
|
||||
<paramdef>const char *<parameter>method</parameter></paramdef>
|
||||
<paramdef>const char *<parameter>path</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>int <function>ne_request_dispatch</function></funcdef>
|
||||
<paramdef>ne_request *<parameter>req</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_request_destroy</function></funcdef>
|
||||
<paramdef>ne_request *<parameter>req</parameter></paramdef>
|
||||
</funcprototype>
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>An HTTP request, represented by the
|
||||
<type>ne_request</type> type, specifies that some operation is to be
|
||||
performed on some resource. The
|
||||
<function>ne_request_create</function> function creates a request
|
||||
object, specifying the operation in the <parameter>method</parameter>
|
||||
parameter. The location of the resource is determined by the server in
|
||||
use for the session given by the <parameter>sess</parameter>
|
||||
parameter, combined with the <parameter>path</parameter> parameter.</para>
|
||||
|
||||
<para>The <parameter>path</parameter> string used must conform to the
|
||||
<literal>abs_path</literal> definition given in RFC2396, with an
|
||||
optional "?query" part, and must be URI-escaped by the caller (for
|
||||
instance, using <function>ne_path_escape</function>). If the string
|
||||
comes from an untrusted source, failure to perform URI-escaping
|
||||
results in a security vulnerability.</para>
|
||||
|
||||
<para>To dispatch a request, and process the response, the
|
||||
<function>ne_request_dispatch</function> function can be used. An
|
||||
alternative is to use the (more complex, but more flexible)
|
||||
combination of the <function>ne_begin_request</function>,
|
||||
<function>ne_end_request</function>, and
|
||||
<function>ne_read_response_block</function> functions; see
|
||||
<function>ne_begin_request</function>.</para>
|
||||
|
||||
<para>To add extra headers in the request, the functions <xref
|
||||
linkend="ne_add_request_header"/> and <xref
|
||||
linkend="ne_print_request_header"/> can be used. To include a message
|
||||
body with the request, one of the functions
|
||||
<function>ne_set_request_body_buffer</function>, <xref
|
||||
linkend="ne_set_request_body_fd"/>, or
|
||||
<function>ne_set_request_body_provider</function> can be used.</para>
|
||||
|
||||
<para>The return value of
|
||||
<function>ne_request_dispatch</function> indicates merely whether the
|
||||
request was sent and the response read successfully. To discover the
|
||||
result of the operation, <xref linkend="ne_get_status"/>, along with
|
||||
any processing of the response headers and message body.</para>
|
||||
|
||||
<para>A request can only be dispatched once: calling
|
||||
<function>ne_request_dispatch</function> more than once on a
|
||||
single <type>ne_request</type> object produces undefined
|
||||
behaviour. Once all processing associated with the request
|
||||
object is complete, use the
|
||||
<function>ne_request_destroy</function> function to destroy
|
||||
the resources associated with it. Any subsequent use of the
|
||||
request object produces undefined behaviour.</para>
|
||||
|
||||
<para>If a request is being using a non-idempotent method such
|
||||
as <literal>POST</literal>, the
|
||||
<literal>NE_REQFLAG_IDEMPOTENT</literal> flag should be
|
||||
disabled; see <xref linkend="ne_set_request_flag"/>.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Return value</title>
|
||||
|
||||
<para>The <function>ne_request_create</function> function
|
||||
returns a pointer to a request object (and never &null;).</para>
|
||||
|
||||
<para>The <function>ne_request_dispatch</function> function
|
||||
returns zero if the request was dispatched successfully, and a
|
||||
non-zero error code otherwise.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<!-- TODO: abs_path description in a NOTES section -->
|
||||
|
||||
<refsect1>
|
||||
<title>Errors</title>
|
||||
|
||||
<variablelist>
|
||||
<varlistentry><term><errorcode>NE_ERROR</errorcode></term>
|
||||
<listitem>
|
||||
<simpara>Request failed (see session error string)</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry><term><errorcode>NE_LOOKUP</errorcode></term>
|
||||
<listitem>
|
||||
<simpara>The DNS lookup for the server (or proxy server) failed.</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry><term><errorcode>NE_AUTH</errorcode></term>
|
||||
<listitem>
|
||||
<simpara>Authentication failed on the server.</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry><term><errorcode>NE_PROXYAUTH</errorcode></term>
|
||||
<listitem>
|
||||
<simpara>Authentication failed on the proxy server.</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry><term><errorcode>NE_CONNECT</errorcode></term>
|
||||
<listitem>
|
||||
<simpara>A connection to the server could not be established.</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry><term><errorcode>NE_TIMEOUT</errorcode></term>
|
||||
<listitem>
|
||||
<simpara>A timeout occurred while waiting for the server to respond.</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Example</title>
|
||||
|
||||
<para>An example of applying a <literal>MKCOL</literal>
|
||||
operation to the resource at the location
|
||||
<literal>http://www.example.com/foo/bar/</literal>:</para>
|
||||
|
||||
<programlisting>ne_session *sess = ne_session_create("http", "www.example.com", 80);
|
||||
ne_request *req = ne_request_create(sess, "MKCOL", "/foo/bar/");
|
||||
if (ne_request_dispatch(req)) {
|
||||
printf("Request failed: %s\n", ne_get_error(sess));
|
||||
}
|
||||
ne_request_destroy(req);</programlisting>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="ne_get_error"/>, <xref
|
||||
linkend="ne_set_error"/>, <xref linkend="ne_get_status"/>, <xref
|
||||
linkend="ne_add_request_header"/>, <xref
|
||||
linkend="ne_set_request_body_buffer"/>, <xref linkend="ne_set_request_flag"/>.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,73 @@
|
||||
<refentry id="refreqbody">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_set_request_body_buffer</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_set_request_body_buffer">ne_set_request_body_buffer</refname>
|
||||
<refname id="ne_set_request_body_fd">ne_set_request_body_fd</refname>
|
||||
<refname id="ne_set_request_body_fd64">ne_set_request_body_fd64</refname>
|
||||
<refpurpose>include a message body with a request</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_request.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_set_request_body_buffer</function></funcdef>
|
||||
<paramdef>ne_request *<parameter>req</parameter></paramdef>
|
||||
<paramdef>const char *<parameter>buf</parameter></paramdef>
|
||||
<paramdef>size_t <parameter>count</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>int <function>ne_set_request_body_fd</function></funcdef>
|
||||
<paramdef>ne_request *<parameter>req</parameter></paramdef>
|
||||
<paramdef>int <parameter>fd</parameter></paramdef>
|
||||
<paramdef>off_t <parameter>begin</parameter></paramdef>
|
||||
<paramdef>off_t <parameter>length</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The <function>ne_set_request_body_buffer</function>
|
||||
function specifies that a message body should be included with the
|
||||
body, which is stored in the <parameter>count</parameter> bytes buffer
|
||||
<parameter>buf</parameter>.</para>
|
||||
|
||||
<para>The <function>ne_set_request_body_fd</function> function
|
||||
can be used to include a message body with a request which is read
|
||||
from a file descriptor. The body is read from the file descriptor
|
||||
<parameter>fd</parameter>, which must be a associated with a seekable
|
||||
file (not a pipe, socket, or FIFO). <parameter>count</parameter>
|
||||
bytes are read, beginning at offset <parameter>begin</parameter>
|
||||
(hence, passing <parameter>begin</parameter> as zero means the body is read
|
||||
from the beginning of the file).</para>
|
||||
|
||||
<para>For all the above functions, the source of the request
|
||||
body must survive until the request has been dispatched;
|
||||
neither the memory buffer passed to
|
||||
<function>ne_set_request_body_buffer</function> nor the file
|
||||
descriptor passed to
|
||||
<function>ne_set_request_body_fd</function> are copied
|
||||
internally.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="ne_request_create"/></para>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,86 @@
|
||||
<refentry id="refreqflags">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_set_request_flag</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_set_request_flag">ne_set_request_flag</refname>
|
||||
<refname id="ne_get_request_flag">ne_get_request_flag</refname>
|
||||
<refpurpose>set and retrieve per-request flags</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_request.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_set_request_flag</function></funcdef>
|
||||
<paramdef>ne_request *<parameter>req</parameter></paramdef>
|
||||
<paramdef>ne_request_flag <parameter>flag</parameter></paramdef>
|
||||
<paramdef>int <parameter>value</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>int <function>ne_get_request_flag</function></funcdef>
|
||||
<paramdef>ne_request *<parameter>req</parameter></paramdef>
|
||||
<paramdef>ne_request_flag <parameter>flag</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The <function>ne_set_request_flag</function> function
|
||||
enables or disables a per-request flag. Passing a non-zero
|
||||
<parameter>value</parameter> argument enables the flag, and zero
|
||||
disables it.</para>
|
||||
|
||||
<para>The following flags are defined:</para>
|
||||
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term><constant>NE_REQFLAG_EXPECT100</constant></term>
|
||||
<listitem>
|
||||
<simpara>enable this flag to use the "Expect:
|
||||
100-continue" feature of HTTP/1.1, which allows the
|
||||
server to process request headers without reading the
|
||||
entire request body. This saves time and bandwidth if
|
||||
the server gives an authentication challenge (requiring
|
||||
the request to be resent), but has interoperability
|
||||
problems with some older servers.</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><constant>NE_REQFLAG_IDEMPOTENT</constant></term>
|
||||
<listitem>
|
||||
<simpara>disable this flag if the request uses a
|
||||
non-idempotent method such as
|
||||
<literal>POST</literal></simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Return value</title>
|
||||
|
||||
<para>The <function>ne_get_request_flag</function> function returns
|
||||
zero if a flag is disabled, less than zero if the flag is not
|
||||
supported, or greater than zero if the flag is enabled.</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="ne_request_create"/>.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,63 @@
|
||||
<refentry id="refreqhdr">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_add_request_header</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_add_request_header">ne_add_request_header</refname>
|
||||
<refname id="ne_print_request_header">ne_print_request_header</refname>
|
||||
<refpurpose>add headers to a request</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_request.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_add_request_header</function></funcdef>
|
||||
<paramdef>ne_request *<parameter>request</parameter></paramdef>
|
||||
<paramdef>const char *<parameter>name</parameter></paramdef>
|
||||
<paramdef>const char *<parameter>value</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_print_request_header</function></funcdef>
|
||||
<paramdef>ne_request *<parameter>request</parameter></paramdef>
|
||||
<paramdef>const char *<parameter>name</parameter></paramdef>
|
||||
<paramdef>const char *<parameter>format</parameter></paramdef>
|
||||
<paramdef>...</paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The functions <function>ne_add_request_header</function>
|
||||
and <function>ne_print_request_header</function> can be used to add
|
||||
headers to a request, before it is sent.</para>
|
||||
|
||||
<para><function>ne_add_request_header</function> simply adds a
|
||||
header of given <parameter>name</parameter>, with given
|
||||
<parameter>value</parameter>.</para>
|
||||
|
||||
<para><function>ne_print_request_header</function> adds a
|
||||
header of given <parameter>name</parameter>, taking the value from the
|
||||
<function>printf</function>-like <parameter>format</parameter> string
|
||||
parameter and subsequent variable-length argument list.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="ne_request_create"/></para>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,145 @@
|
||||
<refentry id="refresolve">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_addr_resolve</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_addr_resolve">ne_addr_resolve</refname>
|
||||
<refname id="ne_addr_result">ne_addr_result</refname>
|
||||
<refname id="ne_addr_first">ne_addr_first</refname>
|
||||
<refname id="ne_addr_next">ne_addr_next</refname>
|
||||
<refname id="ne_addr_error">ne_addr_error</refname>
|
||||
<refname id="ne_addr_destroy">ne_addr_destroy</refname>
|
||||
<refpurpose>functions to resolve hostnames to addresses</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_socket.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>ne_sock_addr *<function>ne_addr_resolve</function></funcdef>
|
||||
<paramdef>const char *<parameter>hostname</parameter></paramdef>
|
||||
<paramdef>int <parameter>flags</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>int <function>ne_addr_result</function></funcdef>
|
||||
<paramdef>const ne_sock_addr *<parameter>addr</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>const ne_inet_addr *<function>ne_addr_first</function></funcdef>
|
||||
<paramdef>ne_sock_addr *<parameter>addr</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>const ne_inet_addr *<function>ne_addr_next</function></funcdef>
|
||||
<paramdef>ne_sock_addr *<parameter>addr</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>char *<function>ne_addr_error</function></funcdef>
|
||||
<paramdef>const ne_sock_addr *<parameter>addr</parameter></paramdef>
|
||||
<paramdef>char *<parameter>buffer</parameter></paramdef>
|
||||
<paramdef>size_t <parameter>bufsiz</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_addr_destroy</function></funcdef>
|
||||
<paramdef>ne_sock_addr *<parameter>addr</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The <function>ne_addr_resolve</function> function resolves
|
||||
the given <parameter>hostname</parameter>, returning an
|
||||
<type>ne_sock_addr</type> object representing the address (or
|
||||
addresses) associated with the hostname. The
|
||||
<parameter>flags</parameter> parameter is currently unused, and
|
||||
must be passed as 0.</para>
|
||||
|
||||
<para>The <parameter>hostname</parameter> passed to
|
||||
<function>ne_addr_resolve</function> can be a DNS hostname
|
||||
(e.g. <literal>"www.example.com"</literal>) or an IPv4 dotted quad
|
||||
(e.g. <literal>"192.0.34.72"</literal>); or, on systems which
|
||||
support IPv6, an IPv6 hex address, which may be enclosed in
|
||||
brackets, e.g. <literal>"[::1]"</literal>.</para>
|
||||
|
||||
<para>To determine whether the hostname was successfully resolved,
|
||||
the <function>ne_addr_result</function> function is used, which
|
||||
returns non-zero if an error occurred. If an error did occur, the
|
||||
<function>ne_addr_error</function> function can be used, which
|
||||
will copy the error string into a given
|
||||
<parameter>buffer</parameter> (of size
|
||||
<parameter>bufsiz</parameter>).</para>
|
||||
|
||||
<para>The functions <function>ne_addr_first</function> and
|
||||
<function>ne_addr_next</function> are used to retrieve the
|
||||
Internet addresses associated with an address object which has
|
||||
been successfully resolved. <function>ne_addr_first</function>
|
||||
returns the first address; <function>ne_addr_next</function>
|
||||
returns the next address after the most recent call to
|
||||
<function>ne_addr_next</function> or
|
||||
<function>ne_addr_first</function>, or &null; if there are no more
|
||||
addresses. The <type>ne_inet_addr</type> pointer returned by
|
||||
these functions can be passed to
|
||||
<function>ne_sock_connect</function> to connect a socket.</para>
|
||||
|
||||
<para>After the address object has been used, it should be
|
||||
destroyed using <function>ne_addr_destroy</function>.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Return value</title>
|
||||
|
||||
<para><function>ne_addr_resolve</function> returns a pointer to an
|
||||
address object, and never &null;.
|
||||
<function>ne_addr_error</function> returns the
|
||||
<parameter>buffer</parameter> parameter .</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
|
||||
<para>The code below prints out the set of addresses associated
|
||||
with the hostname <literal>www.google.com</literal>.</para>
|
||||
|
||||
<programlisting>ne_sock_addr *addr;
|
||||
char buf[256];
|
||||
|
||||
addr = ne_addr_resolve("www.google.com", 0);
|
||||
if (ne_addr_result(addr)) {
|
||||
printf("Could not resolve www.google.com: %s\n",
|
||||
ne_addr_error(addr, buf, sizeof buf));
|
||||
} else {
|
||||
const ne_inet_addr *ia;
|
||||
printf("www.google.com:");
|
||||
for (ia = ne_addr_first(addr); ia != NULL; ia = ne_addr_next(addr)) {
|
||||
printf(" %s", ne_iaddr_print(ia, buf, sizeof buf));
|
||||
}
|
||||
putchar('\n');
|
||||
}
|
||||
ne_addr_destroy(addr);
|
||||
</programlisting>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="ne_iaddr_print"/></para>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
|
||||
@@ -0,0 +1,98 @@
|
||||
<refentry id="refresphdr">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_get_response_header</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_get_response_header">ne_get_response_header</refname>
|
||||
<refname id="ne_response_header_iterate">ne_response_header_iterate</refname>
|
||||
<refpurpose>functions to access response headers</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_request.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>const char *<function>ne_get_response_header</function></funcdef>
|
||||
<paramdef>ne_request *<parameter>request</parameter></paramdef>
|
||||
<paramdef>const char *<parameter>name</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void *<function>ne_response_header_iterate</function></funcdef>
|
||||
<paramdef>ne_request *<parameter>request</parameter></paramdef>
|
||||
<paramdef>void *<parameter>cursor</parameter></paramdef>
|
||||
<paramdef>const char **<parameter>name</parameter></paramdef>
|
||||
<paramdef>const char **<parameter>value</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>To retrieve the value of a response header field, the
|
||||
<function>ne_get_response_header</function> function can be used,
|
||||
and is given the name of the header to return.</para>
|
||||
|
||||
<para>To iterate over all the response headers returned, the
|
||||
<function>ne_response_header_iterate</function> function can be
|
||||
used. This function takes a <parameter>cursor</parameter>
|
||||
parameter which should be &null; to retrieve the first header. The
|
||||
function stores the name and value of the next header header in
|
||||
the <parameter>name</parameter> and <parameter>value</parameter>
|
||||
parameters, and returns a new cursor pointer which can be passed
|
||||
to <function>ne_response_header_iterate</function> to retrieve the
|
||||
next header.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Return value</title>
|
||||
|
||||
<para><function>ne_get_response_header</function> returns a
|
||||
string, or &null; if no header with that name was given. If used
|
||||
during request processing, the return value pointer is valid only
|
||||
until the next call to <function>ne_begin_request</function>, or
|
||||
else, until the request object is destroyed.</para>
|
||||
|
||||
<para>Likewise, the cursor, names, and values returned by
|
||||
<function>ne_response_header_iterate</function> are only valid
|
||||
until the next call to <function>ne_begin_request</function> or
|
||||
until the request object is destroyed.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
|
||||
<para>The following code will output the value of the
|
||||
<literal>Last-Modified</literal> header for a resource:</para>
|
||||
|
||||
<programlisting>ne_request *req = ne_request_create(sess, "GET", "/foo.txt");
|
||||
if (ne_request_dispatch(req) == NE_OK) {
|
||||
const char *mtime = ne_get_response_header(req, "Last-Modified");
|
||||
if (mtime) {
|
||||
printf("/foo.txt has last-modified value %s\n", mtime);
|
||||
}
|
||||
}
|
||||
ne_request_destroy(req);</programlisting>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="ne_request_create"/>, <xref
|
||||
linkend="ne_request_destroy"/>.</para>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
|
||||
@@ -0,0 +1,126 @@
|
||||
<refentry id="refsess">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_session_create</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_session_create">ne_session_create</refname>
|
||||
<refname id="ne_close_connection">ne_close_connection</refname>
|
||||
<refname id="ne_session_proxy">ne_session_proxy</refname>
|
||||
<refname id="ne_session_destroy">ne_session_destroy</refname>
|
||||
<refpurpose>set up HTTP sessions</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
<funcsynopsisinfo>#include <ne_session.h></funcsynopsisinfo>
|
||||
<funcprototype>
|
||||
<funcdef>ne_session *<function>ne_session_create</function></funcdef>
|
||||
<paramdef>const char *<parameter>scheme</parameter></paramdef>
|
||||
<paramdef>const char *<parameter>hostname</parameter></paramdef>
|
||||
<paramdef>unsigned int <parameter>port</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_session_proxy</function></funcdef>
|
||||
<paramdef>ne_session *<parameter>session</parameter></paramdef>
|
||||
<paramdef>const char *<parameter>hostname</parameter></paramdef>
|
||||
<paramdef>unsigned int <parameter>port</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_close_connection</function></funcdef>
|
||||
<paramdef>ne_session *<parameter>session</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_session_destroy</function></funcdef>
|
||||
<paramdef>ne_session *<parameter>session</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>An <type>ne_session</type> object represents an HTTP
|
||||
session - a logical grouping of a sequence of HTTP requests made to a
|
||||
certain server. Any requests made using the session can use a
|
||||
persistent connection, share cached authentication credentials and any
|
||||
other common attributes.</para>
|
||||
|
||||
<para>A new HTTP session is created using
|
||||
<function>ne_session_create</function>, giving the
|
||||
<parameter>hostname</parameter> and <parameter>port</parameter> of the
|
||||
server to use, along with the <parameter>scheme</parameter> used to
|
||||
contact the server (usually <literal>"http"</literal>). Before the
|
||||
first use of <function>ne_session_create</function> in a process,
|
||||
<xref linkend="ne_sock_init"/> must have been called to perform any
|
||||
global initialization needed by any libraries used by &neon;.</para>
|
||||
|
||||
<para>To enable SSL/TLS for the session, pass the string
|
||||
<literal>"https"</literal> as the <parameter>scheme</parameter>
|
||||
parameter, and either register a certificate verification function
|
||||
(see <xref linkend="ne_ssl_set_verify"/>) or trust the appropriate
|
||||
certificate (see <xref linkend="ne_ssl_trust_cert"/>, <xref
|
||||
linkend="ne_ssl_trust_default_ca"/>).</para>
|
||||
|
||||
<para>If an HTTP proxy server should be used for the session,
|
||||
<function>ne_session_proxy</function> must be called giving
|
||||
the hostname and port on which to contact the proxy.</para>
|
||||
|
||||
<para>Further per-session options may be changed using the
|
||||
<xref linkend="ne_set_request_flag"/> interface.</para>
|
||||
|
||||
<para>If it is known that the session will not be used for a
|
||||
significant period of time, <function>ne_close_connection</function>
|
||||
can be called to close the connection, if one remains open. Use of
|
||||
this function is entirely optional, but it must not be called if there
|
||||
is a request active using the session.</para>
|
||||
|
||||
<para>Once a session has been completed,
|
||||
<function>ne_session_destroy</function> must be called to destroy the
|
||||
resources associated with the session. Any subsequent use of the
|
||||
session pointer produces undefined behaviour.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Notes</title>
|
||||
|
||||
<para>The hostname passed to
|
||||
<function>ne_session_create</function> is resolved when the first
|
||||
request using the session is dispatched; a DNS resolution failure can
|
||||
only be detected at that time (using the <literal>NE_LOOKUP</literal>
|
||||
error code); see <xref linkend="ne_request_dispatch"/> for
|
||||
details.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Return Values</title>
|
||||
<para><function>ne_session_create</function> will return
|
||||
a pointer to a new session object (and never &null;).</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
<para>Create and destroy a session:</para>
|
||||
<programlisting>ne_session *sess;
|
||||
sess = ne_session_create("http", "host.example.com", 80);
|
||||
/* ... use sess ... */
|
||||
ne_session_destroy(sess);
|
||||
</programlisting>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See Also</title>
|
||||
|
||||
<para><xref linkend="ne_ssl_set_verify"/>, <xref linkend="ne_ssl_trust_cert"/>, <xref linkend="ne_sock_init"/>, <xref linkend="ne_set_session_flag"/></para>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,121 @@
|
||||
<refentry id="refsessflags">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_set_session_flag</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_set_session_flag">ne_set_session_flag</refname>
|
||||
<refname id="ne_get_session_flag">ne_get_session_flag</refname>
|
||||
<refpurpose>set and retrieve session flags</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_request.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_set_session_flag</function></funcdef>
|
||||
<paramdef>ne_session *<parameter>sess</parameter></paramdef>
|
||||
<paramdef>ne_session_flag <parameter>flag</parameter></paramdef>
|
||||
<paramdef>int <parameter>value</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>int <function>ne_get_session_flag</function></funcdef>
|
||||
<paramdef>ne_session *<parameter>sess</parameter></paramdef>
|
||||
<paramdef>ne_session_flag <parameter>flag</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The <function>ne_set_session_flag</function> function
|
||||
enables or disables a session flag. Passing a non-zero
|
||||
<parameter>value</parameter> argument enables the flag, and zero
|
||||
disables it.</para>
|
||||
|
||||
<para>The following flags are defined:</para>
|
||||
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term><constant>NE_SESSFLAG_PERSIST</constant></term>
|
||||
<listitem>
|
||||
<simpara>disable this flag to prevent use of persistent
|
||||
connections</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><constant>NE_SESSFLAG_ICYPROTO</constant></term>
|
||||
<listitem>
|
||||
<simpara>enable this flag to enable support for non-HTTP
|
||||
ShoutCast-style "ICY" responses</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><constant>NE_SESSFLAG_SSLv2</constant></term>
|
||||
<listitem>
|
||||
<simpara>disable this flag to disable support for the SSLv2
|
||||
protocol</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><constant>NE_SESSFLAG_RFC4918</constant></term>
|
||||
<listitem>
|
||||
<simpara>enable this flag to enable support for
|
||||
RFC4918-only WebDAV features; losing
|
||||
backwards-compatibility with RFC2518 servers</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><constant>NE_SESSFLAG_CONNAUTH</constant></term>
|
||||
<listitem>
|
||||
<simpara>enable this flag if an RFC-violating
|
||||
connection-based HTTP authentication scheme is in
|
||||
use</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><constant>NE_SESSFLAG_TLS_SNI</constant></term>
|
||||
<listitem>
|
||||
<simpara>disable this flag if a server is used
|
||||
which does not correctly support the TLS SNI
|
||||
extension</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><constant>NE_SESSFLAG_EXPECT100</constant></term>
|
||||
<listitem>
|
||||
<simpara>enable this flag to enable the request flag
|
||||
<constant>NE_REQFLAG_EXPECT100</constant> for new
|
||||
requests</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Return value</title>
|
||||
|
||||
<para>The <function>ne_get_session_flag</function> function
|
||||
returns zero if a flag is disabled, less than zero if the flag is
|
||||
not supported, or greater than zero if the flag is enabled.</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="ne_session_create"/>, <xref
|
||||
linkend="ne_set_request_flag"/>.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,52 @@
|
||||
<refentry id="refshave">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_shave</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname>ne_shave</refname>
|
||||
<refpurpose>trim whitespace from a string</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_string.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>char *<function>ne_shave</function></funcdef>
|
||||
<paramdef>char *<parameter>str</parameter></paramdef>
|
||||
<paramdef>const char *<parameter>whitespace</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para><function>ne_shave</function> returns a portion of
|
||||
<parameter>str</parameter> with any leading or trailing characters in
|
||||
the <parameter>whitespace</parameter> array removed.
|
||||
<parameter>str</parameter> may be modified. Note that the return
|
||||
value may not be equal to <parameter>str</parameter>.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
|
||||
<para>The following code segment will output
|
||||
<literal>"fish"</literal>:</para>
|
||||
|
||||
<programlisting>char s[] = ".!.fish!.!";
|
||||
puts(ne_shave(s, ".!"));</programlisting>
|
||||
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
<refentry id="refsslca">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_ssl_load_ca</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_ssl_load_ca">ne_ssl_load_ca</refname>
|
||||
<refname id="ne_ssl_load_default_ca">ne_ssl_load_default_ca</refname>
|
||||
<refpurpose>load SSL Certificate Authorities</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_session.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>int <function>ne_ssl_load_ca</function></funcdef>
|
||||
<paramdef>ne_session *<parameter>session</parameter></paramdef>
|
||||
<paramdef>const char *<parameter>filename</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>int <function>ne_ssl_load_default_ca</function></funcdef>
|
||||
<paramdef>ne_session *<parameter>session</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>To indicate that a given CA certificate is trusted by the user,
|
||||
the certificate can be loaded using the <function>ne_ssl_load_ca</function>
|
||||
function. The <parameter>filename</parameter> parameter given must specify
|
||||
the location of a PEM-encoded CA certificate.</para>
|
||||
|
||||
<para>The SSL library in use by neon may include a default set
|
||||
of CA certificates; calling the
|
||||
<function>ne_ssl_load_default_ca</function> function will indicate
|
||||
that these CAs are trusted by the user.</para>
|
||||
|
||||
<para>If no CA certificates are loaded, or the server presents
|
||||
a certificate which is invalid in some way, then the certificate must
|
||||
be manually verified (see <xref linkend="ne_ssl_set_verify"/>), otherwise the
|
||||
connection will fail.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Return value</title>
|
||||
|
||||
<para>Both <function>ne_ssl_load_ca</function> and
|
||||
<function>ne_ssl_load_default_ca</function> functions return
|
||||
<literal>0</literal> on success, or non-zero on failure.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
|
||||
<para>Load the CA certificate stored in <filename>/path/to/cacert.pem</filename>:</para>
|
||||
<programlisting>&egsess;
|
||||
|
||||
if (ne_ssl_load_ca(sess, "/path/to/cacert.pem")) {
|
||||
printf("Could not load CA cert: %s\n", ne_get_error(sess));
|
||||
}</programlisting>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="ne_get_error"/>, <xref
|
||||
linkend="ne_ssl_set_verify"/></para> </refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,111 @@
|
||||
<refentry id="refcert">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_ssl_cert_identity</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_ssl_cert_identity">ne_ssl_cert_identity</refname>
|
||||
<refname id="ne_ssl_cert_signedby">ne_ssl_cert_signedby</refname>
|
||||
<refname id="ne_ssl_cert_issuer">ne_ssl_cert_issuer</refname>
|
||||
<refname id="ne_ssl_cert_subject">ne_ssl_cert_subject</refname>
|
||||
<refpurpose>functions to access certificate properties</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_ssl.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>const char *<function>ne_ssl_cert_identity</function></funcdef>
|
||||
<paramdef>const ne_ssl_certificate *<parameter>cert</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>const ne_ssl_certificate *<function>ne_ssl_cert_signedby</function></funcdef>
|
||||
<paramdef>const ne_ssl_certificate *<parameter>cert</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>const ne_ssl_dname *<function>ne_ssl_cert_subject</function></funcdef>
|
||||
<paramdef>const ne_ssl_certificate *<parameter>cert</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>const ne_ssl_dname *<function>ne_ssl_cert_issuer</function></funcdef>
|
||||
<paramdef>const ne_ssl_certificate *<parameter>cert</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The function <function>ne_ssl_cert_identity</function>
|
||||
retrieves the <quote>identity</quote> of a certificate; for an
|
||||
SSL server certificate, this will be the hostname for which the
|
||||
certificate was issued. In PKI parlance, the identity is the
|
||||
<emphasis>common name</emphasis> attribute of the distinguished name of
|
||||
the certificate subject.</para>
|
||||
|
||||
<para>The functions <function>ne_ssl_cert_subject</function> and
|
||||
<function>ne_ssl_cert_issuer</function> can be used to access the
|
||||
objects representing the distinguished name of the subject and of
|
||||
the issuer of a certificate, respectively.</para>
|
||||
|
||||
<para>If a certificate object is part of a certificate chain, then
|
||||
<function>ne_ssl_cert_signedby</function> can be used to find the
|
||||
certificate which signed a particular certificate. For a
|
||||
self-signed certificate or a certificate for which the full chain
|
||||
is not available, this function will return &null;.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Return value</title>
|
||||
|
||||
<para><function>ne_ssl_cert_issuer</function> and
|
||||
<function>ne_ssl_cert_subject</function> are guaranteed to never
|
||||
return &null;. <function>ne_ssl_cert_identity</function> may
|
||||
return &null; if the certificate has no specific
|
||||
<quote>identity</quote>. <function>ne_ssl_cert_signedby</function>
|
||||
may return &null; as covered above.</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
|
||||
<para>The following function could be used to display information
|
||||
about a given certificate:</para>
|
||||
|
||||
<programlisting>void dump_cert(const ne_ssl_certificate *cert) {
|
||||
const char *id = ne_ssl_cert_identity(cert);
|
||||
char *dn;
|
||||
|
||||
if (id)
|
||||
printf("Certificate was issued for '%s'.\n", id);
|
||||
|
||||
dn = ne_ssl_readable_dname(ne_ssl_cert_subject(cert));
|
||||
printf("Subject: %s\n", dn);
|
||||
free(dn);
|
||||
|
||||
dn = ne_ssl_readable_dname(ne_ssl_cert_issuer(cert));
|
||||
printf("Issuer: %s\n", dn);
|
||||
free(dn);
|
||||
}</programlisting>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="ne_ssl_cert_cmp"/>, <xref linkend="ne_ssl_readable_dname"/></para>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
<refentry id="refsslcert2">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_ssl_cert_cmp</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_ssl_cert_cmp">ne_ssl_cert_cmp</refname>
|
||||
<refname id="ne_ssl_cert_free">ne_ssl_cert_free</refname>
|
||||
<refpurpose>functions to operate on certificate objects</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_header.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>int <function>ne_ssl_cert_cmp</function></funcdef>
|
||||
<paramdef>const ne_ssl_certificate *<parameter>c1</parameter></paramdef>
|
||||
<paramdef>const ne_ssl_certificate *<parameter>c2</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_ssl_cert_free</function></funcdef>
|
||||
<paramdef>ne_ssl_certificate *<parameter>cert</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The <function>ne_ssl_cert_cmp</function> function can be
|
||||
used to compare two certificate objects; it returns zero if they
|
||||
refer to the same certificate, and non-zero otherwise.</para>
|
||||
|
||||
<para>The <function>ne_ssl_cert_free</function> function can be
|
||||
used to destroy a certificate object when it is no longer
|
||||
needed.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
<refentry id="refsslcertio">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_ssl_cert_read</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_ssl_cert_read">ne_ssl_cert_read</refname>
|
||||
<refname id="ne_ssl_cert_write">ne_ssl_cert_write</refname>
|
||||
<refname id="ne_ssl_cert_import">ne_ssl_cert_import</refname>
|
||||
<refname id="ne_ssl_cert_export">ne_ssl_cert_export</refname>
|
||||
<refpurpose>functions to read or write certificates to and from files or strings</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_ssl.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>ne_ssl_certificate *<function>ne_ssl_cert_read</function></funcdef>
|
||||
<paramdef>const char *<parameter>filename</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>int <function>ne_ssl_cert_write</function></funcdef>
|
||||
<paramdef>const ne_ssl_certificate *<parameter>cert</parameter></paramdef>
|
||||
<paramdef>const char *<parameter>filename</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>ne_ssl_certificate *<function>ne_ssl_cert_import</function></funcdef>
|
||||
<paramdef>const char *<parameter>data</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>char *<function>ne_ssl_cert_export</function></funcdef>
|
||||
<paramdef>const ne_ssl_certificate *<parameter>cert</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The <function>ne_ssl_cert_write</function> function writes a
|
||||
certificate to a file using the PEM encoding. The
|
||||
<function>ne_ssl_cert_export</function> function returns a
|
||||
base64-encoded &nul;-terminated string representing the
|
||||
certificate. This string is malloc-allocated and should be
|
||||
destroyed using <function>free</function> by the caller.</para>
|
||||
|
||||
<para>The <function>ne_ssl_cert_read</function> function reads a
|
||||
certificate from a PEM-encoded file, and returns a certificate
|
||||
object. The <function>ne_ssl_cert_import</function> function
|
||||
returns a certificate object from a base64-encoded string,
|
||||
<parameter>data</parameter>, as returned by
|
||||
<function>ne_ssl_cert_export</function>. The certificate object
|
||||
returned by these functions should be destroyed using <xref
|
||||
linkend="ne_ssl_cert_free"/> after use.</para>
|
||||
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Return value</title>
|
||||
|
||||
<para><function>ne_ssl_cert_read</function> returns &null; if a
|
||||
certificate could not be read from the file.
|
||||
<function>ne_ssl_cert_write</function> returns non-zero if the
|
||||
certificate could not be written to the file.
|
||||
<function>ne_ssl_cert_export</function> always returns a
|
||||
&nul;-terminated string, and never &null;.
|
||||
<function>ne_ssl_cert_import</function> returns &null; if the
|
||||
string was not a valid base64-encoded certificate.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Encoding Formats</title>
|
||||
|
||||
<para>The string produced by
|
||||
<function>ne_ssl_cert_export</function> is the base64 encoding of
|
||||
the DER representation of the certificate. The file written by
|
||||
<function>ne_ssl_cert_write</function> uses the PEM format: this
|
||||
is the base64 encoding of the DER representation with newlines
|
||||
every 64 characters, and start and end marker lines.</para>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
|
||||
<refentry id="refssldname">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_ssl_dname</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_ssl_readable_dname">ne_ssl_readable_dname</refname>
|
||||
<refname id="ne_ssl_dname_cmp">ne_ssl_dname_cmp</refname>
|
||||
<refpurpose>SSL distinguished name handling</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_ssl.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>const char *<function>ne_ssl_readable_dname</function></funcdef>
|
||||
<paramdef>const ne_ssl_dname *<parameter>dname</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>int <function>ne_ssl_dname_cmp</function></funcdef>
|
||||
<paramdef>const ne_ssl_dname *<parameter>dn1</parameter></paramdef>
|
||||
<paramdef>const ne_ssl_dname *<parameter>dn2</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The <function>ne_ssl_readable_dname</function> function
|
||||
creates a single-line, human-readable string out of an
|
||||
<type>ne_ssl_dname</type> object. The returned string is
|
||||
<function>malloc</function>()-allocated, and must be
|
||||
<function>free</function>()d by the caller.</para>
|
||||
|
||||
<para>The <function>ne_ssl_dname_cmp</function> function
|
||||
compares two distinguished names, and returns zero if they are
|
||||
equal, or non-zero otherwise.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Return value</title>
|
||||
|
||||
<para><function>ne_ssl_readable_dname</function> returns a <function>malloc</function>-allocated
|
||||
string, and never &null;.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
|
||||
<para>See <xref linkend="ne_ssl_cert_subject"/> for an example
|
||||
use of <function>ne_ssl_readable_dname</function>.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="ne_ssl_cert_subject"/></para>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,72 @@
|
||||
<refentry id="refsslca">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_ssl_trust_cert</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_ssl_trust_cert">ne_ssl_trust_cert</refname>
|
||||
<refname id="ne_ssl_trust_default_ca">ne_ssl_trust_default_ca</refname>
|
||||
<refpurpose>functions to indicate that certificates are trusted</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_session.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_ssl_trust_cert</function></funcdef>
|
||||
<paramdef>ne_session *<parameter>session</parameter></paramdef>
|
||||
<paramdef>const ne_ssl_certificate *<parameter>cert</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_ssl_trust_default_ca</function></funcdef>
|
||||
<paramdef>ne_session *<parameter>session</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>To indicate that a given certificate is trusted by the
|
||||
user, the certificate object can be passed to
|
||||
<function>ne_ssl_trust_cert</function>. The certificate object is
|
||||
duplicated internally and can subsequently be destroyed.</para>
|
||||
|
||||
<para>The SSL library in use by &neon; may include a default
|
||||
set of CA certificates; calling the
|
||||
<function>ne_ssl_trust_default_ca</function> function will indicate
|
||||
that these CAs are trusted by the user.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
|
||||
<para>Load the CA certificate stored in <filename>/path/to/cacert.pem</filename>:</para>
|
||||
<programlisting>&egsess;
|
||||
ne_ssl_certificate *cert = ne_ssl_cert_read("/path/to/cacert.pem");
|
||||
|
||||
if (cert) {
|
||||
ne_ssl_trust_cert(sess, cert);
|
||||
ne_ssl_cert_free(cert);
|
||||
} else {
|
||||
printf("Could not load CA cert: %s\n", ne_get_error(sess));
|
||||
}</programlisting>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="ne_ssl_cert_read"/>, <xref
|
||||
linkend="ne_ssl_cert_import"/>, <xref
|
||||
linkend="ne_ssl_cert_free"/></para> </refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,163 @@
|
||||
<refentry id="refsslvfy"> <!-- -*- xml-mode -*- -->
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_ssl_set_verify</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_ssl_set_verify">ne_ssl_set_verify</refname>
|
||||
<refpurpose>register an SSL certificate verification callback</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_session.h></funcsynopsisinfo>
|
||||
|
||||
<!-- hard to put data type declarations here -->
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>typedef int <function>ne_ssl_verify_fn</function></funcdef>
|
||||
<paramdef>void *<parameter>userdata</parameter></paramdef>
|
||||
<paramdef>int <parameter>failures</parameter></paramdef>
|
||||
<paramdef>const ne_ssl_certificate *<parameter>cert</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_ssl_set_verify</function></funcdef>
|
||||
<paramdef>ne_session *<parameter>session</parameter></paramdef>
|
||||
<paramdef>ne_ssl_verify_fn <parameter>verify_fn</parameter></paramdef>
|
||||
<paramdef>void *<parameter>userdata</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>To enable manual SSL certificate verification, a
|
||||
callback can be registered using
|
||||
<function>ne_ssl_set_verify</function>. If such a callback is not
|
||||
registered, when a connection is established to an SSL server which
|
||||
does not present a certificate signed by a trusted CA (see <xref
|
||||
linkend="ne_ssl_trust_cert"/>), or if the certificate presented is invalid in
|
||||
some way, the connection will fail.</para>
|
||||
|
||||
<para>When the callback is invoked, the
|
||||
<parameter>failures</parameter> parameter gives a bitmask indicating
|
||||
in what way the automatic certificate verification failed. The value
|
||||
is equal to the bit-wise OR of one or more of the following
|
||||
constants (and is guaranteed to be non-zero):</para>
|
||||
|
||||
<variablelist>
|
||||
<varlistentry><term><constant>NE_SSL_NOTYETVALID</constant></term>
|
||||
<listitem>
|
||||
<simpara>The certificate is not yet valid.</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry><term><constant>NE_SSL_EXPIRED</constant></term>
|
||||
<listitem>
|
||||
<simpara>The certificate has expired.</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry><term><constant>NE_SSL_IDMISMATCH</constant></term>
|
||||
<listitem>
|
||||
<simpara>The hostname used for the session does not match
|
||||
the hostname to which the certificate was issued.</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry><term><constant>NE_SSL_UNTRUSTED</constant></term>
|
||||
<listitem>
|
||||
<simpara>The Certificate Authority which signed the certificate
|
||||
is not trusted.</simpara>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
|
||||
<para>Note that if either of the
|
||||
<constant>NE_SSL_IDMISMATCH</constant> or
|
||||
<constant>NE_SSL_UNTRUSTED</constant> failures is given, the
|
||||
connection may have been intercepted by a third party, and
|
||||
must not be presumed to be <quote>secure</quote>.</para>
|
||||
|
||||
<para>The <parameter>cert</parameter> parameter passed to the
|
||||
callback represents the certificate which was presented by the server.
|
||||
If the server presented a chain of certificates, the chain can be
|
||||
accessed using <xref linkend="ne_ssl_cert_signedby"/>. The
|
||||
<parameter>cert</parameter> object given is not valid after the
|
||||
callback returns.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Return value</title>
|
||||
|
||||
<para>The verification callback must return zero to indicate
|
||||
that the certificate should be trusted; and non-zero otherwise (in
|
||||
which case, the connection will fail).</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
|
||||
<para>The following code implements an example verification
|
||||
callback, using the <function>dump_cert</function> function
|
||||
from <xref linkend="ne_ssl_cert_subject"/> to display
|
||||
certification information. Notice that the hostname of the
|
||||
server used for the session is passed as the
|
||||
<parameter>userdata</parameter> parameter to the
|
||||
callback.</para>
|
||||
|
||||
<programlisting>
|
||||
static int
|
||||
my_verify(void *userdata, int failures, const ne_ssl_certificate *cert)
|
||||
{
|
||||
const char *hostname = userdata;
|
||||
|
||||
dump_cert(cert);
|
||||
|
||||
puts("Certificate verification failed - the connection may have been "
|
||||
"intercepted by a third party!");
|
||||
|
||||
if (failures & NE_SSL_IDMISMATCH) {
|
||||
const char *id = ne_ssl_cert_identity(cert);
|
||||
if (id)
|
||||
printf("Server certificate was issued to '%s' not '%s'.\n",
|
||||
id, hostname);
|
||||
else
|
||||
printf("The certificate was not issued for '%s'\n", hostname);
|
||||
}
|
||||
|
||||
if (failures & NE_SSL_UNTRUSTED)
|
||||
puts("The certificate is not signed by a trusted Certificate Authority.");
|
||||
|
||||
/* ... check for validity failures ... */
|
||||
|
||||
if (prompt_user())
|
||||
return 1; /* fail verification */
|
||||
else
|
||||
return 0; /* trust the certificate anyway */
|
||||
}
|
||||
|
||||
int
|
||||
main(...)
|
||||
{
|
||||
ne_session *sess = ne_session_create("https", "some.host.name", 443);
|
||||
ne_ssl_set_verify(sess, my_verify, "some.host.name");
|
||||
...
|
||||
}</programlisting>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para><xref linkend="ne_ssl_trust_cert"/>, <xref
|
||||
linkend="ne_ssl_readable_dname"/>, <xref linkend="ne_ssl_cert_subject"/></para>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,78 @@
|
||||
<refentry id="refstatus">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_status</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_status">ne_status</refname>
|
||||
<refpurpose>HTTP status structure</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis><funcsynopsisinfo>#include <ne_utils.h>
|
||||
|
||||
typedef struct {
|
||||
int major_version, minor_version;
|
||||
int code, klass;
|
||||
const char *reason_phrase;
|
||||
} <type>ne_status</type>;</funcsynopsisinfo></funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>An <type>ne_status</type> type represents an HTTP
|
||||
response status; used in response messages giving a result of request.
|
||||
The <structfield>major_version</structfield> and
|
||||
<structfield>minor_version</structfield> fields give the HTTP version
|
||||
supported by the server issuing the response. The
|
||||
<structfield>code</structfield> field gives the status code of the
|
||||
result (lying between 100 and 999 inclusive), and the
|
||||
<structfield>klass</structfield> field gives the
|
||||
class<footnote><para>the field is named <quote>klass</quote> not
|
||||
<quote>class</quote> so that the header can be used from a C++
|
||||
program, in which <quote>class</quote> is a reserved
|
||||
word)</para></footnote>, which is equal to the most significant digit
|
||||
of the status.</para>
|
||||
|
||||
<para>There are five classes of HTTP status code defined by
|
||||
RFC2616:</para>
|
||||
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term><literal>1xx</literal></term>
|
||||
<listitem><simpara>Informational response.</simpara></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><literal>2xx</literal></term>
|
||||
<listitem><simpara>Success: the operation was successful</simpara></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><literal>3xx</literal></term>
|
||||
<listitem><simpara>Redirection</simpara></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><literal>4xx</literal></term> <listitem><simpara>Client
|
||||
error: the request made was incorrect in some
|
||||
manner.</simpara></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><literal>5xx</literal></term>
|
||||
<listitem><simpara>Server error</simpara></listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1> <title>See also</title> <para><xref
|
||||
linkend="ne_get_status"/>.</para> </refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,76 @@
|
||||
<refentry id="reftok">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_token</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname>ne_token</refname>
|
||||
<refname>ne_qtoken</refname>
|
||||
<refpurpose>string tokenizers</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_string.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>char *<function>ne_token</function></funcdef>
|
||||
<paramdef>char **<parameter>str</parameter></paramdef>
|
||||
<paramdef>char <parameter>sep</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>char *<function>ne_qtoken</function></funcdef>
|
||||
<paramdef>char **<parameter>str</parameter></paramdef>
|
||||
<paramdef>char <parameter>sep</parameter></paramdef>
|
||||
<paramdef>const char *<parameter>quotes</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<!-- FIXME: italics on tokenize -->
|
||||
|
||||
<para><function>ne_token</function> and
|
||||
<function>ne_qtoken</function> tokenize the string at the location
|
||||
stored in the pointer <parameter>str</parameter>. Each time the
|
||||
function is called, it returns the next token, and modifies the
|
||||
<parameter>str</parameter> pointer to point to the remainer of the
|
||||
string, or &null; if there are no more tokens in the string. A token
|
||||
is delimited by the separator character <parameter>sep</parameter>; if
|
||||
<function>ne_qtoken</function> is used any quoted segments of the
|
||||
string are skipped when searching for a separator. A quoted segment
|
||||
is enclosed in a pair of one of the characters given in the
|
||||
<parameter>quotes</parameter> string.</para>
|
||||
|
||||
<para>The string being tokenized is modified each time
|
||||
the tokenizing function is called; replacing the next separator
|
||||
character with a &nul; terminator.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
|
||||
<para>The following function prints out each token in a
|
||||
comma-separated string <parameter>list</parameter>, which is
|
||||
modified in-place:</para>
|
||||
|
||||
<programlisting>static void splitter(char *list)
|
||||
{
|
||||
do {
|
||||
printf("Token: %s\n", ne_token(&list, ','));
|
||||
while (list);
|
||||
}</programlisting>
|
||||
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,63 @@
|
||||
<refentry id="refvers">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_version_match</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname>ne_version_match</refname>
|
||||
<refname>ne_version_string</refname>
|
||||
<refpurpose>library versioning</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_utils.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>int <function>ne_version_match</function></funcdef>
|
||||
<paramdef>int <parameter>major</parameter></paramdef>
|
||||
<paramdef>int <parameter>minor</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>const char *<function>ne_version_string</function></funcdef>
|
||||
<void/>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The <function>ne_version_match</function> function returns
|
||||
non-zero if the library version is not of major version
|
||||
<parameter>major</parameter>, or the minor version is less than
|
||||
<parameter>minor</parameter>. For &neon; versions 0.x, every
|
||||
minor version is assumed to be incompatible with every other minor
|
||||
version.</para> <!-- TODO: remove that for 1.0 -->
|
||||
|
||||
<para>The <function>ne_version_string</function> function returns
|
||||
a string giving the library version.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
|
||||
<para>To require &neon; 1.x, version 1.2 or later:</para>
|
||||
|
||||
<programlisting>if (ne_version_match(1, 2)) {
|
||||
printf("Library version out of date: 1.2 required, found %s.",
|
||||
ne_version_string());
|
||||
exit(1);
|
||||
}</programlisting>
|
||||
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
@@ -0,0 +1,56 @@
|
||||
<refentry id="refxml">
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>ne_xml_create</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname id="ne_xml_create">ne_xml_create</refname>
|
||||
<refname id="ne_xml_destroy">ne_xml_destroy</refname>
|
||||
<refpurpose>create and destroy an XML parser</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
|
||||
<funcsynopsis>
|
||||
|
||||
<funcsynopsisinfo>#include <ne_xml.h></funcsynopsisinfo>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>ne_xml_parser *<function>ne_xml_create</function></funcdef>
|
||||
<void/>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>void <function>ne_xml_destroy</function></funcdef>
|
||||
<paramdef>ne_xml_parser *<parameter>parser</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>The <function>ne_xml_create</function> function creates an
|
||||
XML parser object, which can be used for parsing XML documents
|
||||
using stacked SAX handlers.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Return value</title>
|
||||
|
||||
<para><function>ne_xml_create</function> returns a pointer to an
|
||||
XML parser object, and never &null;</para> </refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>See also</title>
|
||||
|
||||
<para>XXX</para>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
||||
|
||||
Reference in New Issue
Block a user