HTTP 服务器 GNU libmicrohttpd 0.9.18 发布

fmms 13年前
     <p><a href="/misc/goto?guid=4958191990410054786" target="_blank">GNU libmicrohttpd</a> 是一个小型的嵌入式 HTTP 服务器 的 C 类库,支持 HTTP 1.1 可以同时侦听多个端口,</p>    <ul>     <li>C library: fast and small</li>     <li>API is simple, expressive and fully reentrant</li>     <li>Implementation is HTTP 1.1 compliant</li>     <li>HTTP server can listen on multiple ports</li>     <li>Four different threading models (select, poll, pthread, thread pool)</li>     <li>Supported platforms include GNU/Linux, FreeBSD, OpenBSD, NetBSD, OS X, W32, Symbian and z/OS</li>     <li>Support for IPv6</li>     <li>Support for SHOUTcast</li>     <li>Support for incremental processing of POST data (optional)</li>     <li>Support for basic and digest authentication (optional)</li>     <li>Support for SSL3 and TLS (requires libgcrypt and libgnutls, optional)</li>     <li>Binary is only about 32k (without TLS/SSL support and other optional features)</li>    </ul>    <p>下面是一个最为简单的使用例子:</p>    <pre class="brush:cpp; toolbar: true; auto-links: false;">#include <microhttpd.h>  #include <stdlib.h>  #include <string.h>  #include <stdio.h>    #define PAGE "<html><head><title>libmicrohttpd demo</title>"\               "</head><body>libmicrohttpd demo</body></html>"    static int ahc_echo(void * cls,        struct MHD_Connection * connection,        const char * url,        const char * method,                      const char * version,        const char * upload_data,        size_t * upload_data_size,                      void ** ptr) {    static int dummy;    const char * page = cls;    struct MHD_Response * response;    int ret;      if (0 != strcmp(method, "GET"))      return MHD_NO; /* unexpected method */    if (&dummy != *ptr)       {        /* The first time only the headers are valid,           do not respond in the first round... */        *ptr = &dummy;        return MHD_YES;      }    if (0 != *upload_data_size)      return MHD_NO; /* upload data in a GET!? */    *ptr = NULL; /* clear context pointer */    response = MHD_create_response_from_data(strlen(page),          (void*) page,          MHD_NO,          MHD_NO);    ret = MHD_queue_response(connection,        MHD_HTTP_OK,        response);    MHD_destroy_response(response);    return ret;  }    int main(int argc,    char ** argv) {    struct MHD_Daemon * d;    if (argc != 2) {      printf("%s PORT\n",      argv[0]);      return 1;    }    d = MHD_start_daemon(MHD_USE_THREAD_PER_CONNECTION,           atoi(argv[1]),           NULL,           NULL,           &ahc_echo,           PAGE,           MHD_OPTION_END);    if (d == NULL)      return 1;    (void) getc ();    MHD_stop_daemon(d);    return 0;  }</pre>    <p><span class="truncate_more">GNU libmicrohttpd 0.9.18 发布,该版本修复了一些小bug,此外还包括:</span></p>    <p>digest authentication was failing under certain circumstances (nonce count >= 10 or GETs with URL arguments). Furthermore,<span class="truncate_more"> an uninitialized variable in MHD_get_timeout could cause incorrect (low) timeout values to be returned. Sockets are now non-blocking for SSL connections on OS X to avoid hanging while waiting on network I/O. The documentation on how to use authentication APIs and how to run MHD with dual-stack support was improved</span></p>