]> git.sesse.net Git - vlc/blobdiff - src/network/httpd.c
Fix and restore nice file names
[vlc] / src / network / httpd.c
index d1207a5c2bd9ff4e3576ac459f5d868b8d5ff298..f238ec203ac3d148f7235b6b7710596cfec9088d 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * httpd.c
  *****************************************************************************
- * Copyright (C) 2004-2005 the VideoLAN team
+ * Copyright (C) 2004-2006 the VideoLAN team
  * $Id$
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
@@ -19,7 +19,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
 #include <stdlib.h>
@@ -27,6 +27,8 @@
 
 #ifdef ENABLE_HTTPD
 
+#include <assert.h>
+
 #include "vlc_httpd.h"
 #include "network.h"
 #include "vlc_tls.h"
 #   include <winsock.h>
 #elif defined( WIN32 )
 #   include <winsock2.h>
-#   include <ws2tcpip.h>
 #else
-#   include <netdb.h>                                         /* hostent ... */
 #   include <sys/socket.h>
-/* FIXME: should not be needed */
-#   include <netinet/in.h>
-#   ifdef HAVE_ARPA_INET_H
-#       include <arpa/inet.h>                    /* inet_ntoa(), inet_aton() */
-#   endif
 #endif
 
 #if defined( WIN32 )
 #define HTTPD_CL_BUFSIZE 10000
 #endif
 
-#if 0
-typedef struct httpd_t          httpd_t;
-
-typedef struct httpd_host_t     httpd_host_t;
-typedef struct httpd_url_t      httpd_url_t;
-typedef struct httpd_client_t   httpd_client_t;
-
-enum
-{
-    HTTPD_MSG_NONE,
-
-    /* answer */
-    HTTPD_MSG_ANSWER,
-
-    /* channel communication */
-    HTTPD_MSG_CHANNEL,
-
-    /* http request */
-    HTTPD_MSG_GET,
-    HTTPD_MSG_HEAD,
-    HTTPD_MSG_POST,
-
-    /* rtsp request */
-    HTTPD_MSG_OPTIONS,
-    HTTPD_MSG_DESCRIBE,
-    HTTPD_MSG_SETUP,
-    HTTPD_MSG_PLAY,
-    HTTPD_MSG_PAUSE,
-    HTTPD_MSG_TEARDOWN,
-
-    /* just to track the count of MSG */
-    HTTPD_MSG_MAX
-};
-
-enum
-{
-    HTTPD_PROTO_NONE,
-    HTTPD_PROTO_HTTP,
-    HTTPD_PROTO_RTSP,
-};
-
-typedef struct
-{
-    httpd_client_t *cl; /* NULL if not throught a connection e vlc internal */
-
-    int     i_type;
-    int     i_proto;
-    int     i_version;
-
-    /* for an answer */
-    int     i_status;
-    char    *psz_status;
-
-    /* for a query */
-    char    *psz_url;
-    char    *psz_args;  /* FIXME find a clean way to handle GET(psz_args) and POST(body) through the same code */
-
-    /* for rtp over rtsp */
-    int     i_channel;
-
-    /* options */
-    int     i_name;
-    char    **name;
-    int     i_value;
-    char    **value;
-
-    /* body */
-    int64_t i_body_offset;
-    int     i_body;
-    uint8_t *p_body;
-
-} httpd_message_t;
-
-typedef struct httpd_callback_sys_t httpd_callback_sys_t;
-/* answer could be null, int this case no answer is requested */
-typedef int (*httpd_callback_t)( httpd_callback_sys_t *, httpd_client_t *, httpd_message_t *answer, httpd_message_t *query );
-
-
-/* create a new host */
-httpd_host_t *httpd_HostNew( vlc_object_t *, char *psz_host, int i_port );
-/* delete a host */
-void          httpd_HostDelete( httpd_host_t * );
-
-/* register a new url */
-httpd_url_t *httpd_UrlNew( httpd_host_t *, char *psz_url );
-/* register callback on a url */
-int          httpd_UrlCatch( httpd_url_t *, int i_msg,
-                             httpd_callback_t, httpd_callback_sys_t * );
-/* delete an url */
-void         httpd_UrlDelete( httpd_url_t * );
-
-
-void httpd_ClientModeStream( httpd_client_t *cl );
-void httpd_ClientModeBidir( httpd_client_t *cl );
-static void httpd_ClientClean( httpd_client_t *cl );
-
-/* High level */
-typedef struct httpd_file_t     httpd_file_t;
-typedef struct httpd_file_sys_t httpd_file_sys_t;
-typedef int (*httpd_file_callback_t)( httpd_file_sys_t*, httpd_file_t *, uint8_t *psz_request, uint8_t **pp_data, int *pi_data );
-httpd_file_t *httpd_FileNew( httpd_host_t *,
-                             char *psz_url, char *psz_mime,
-                             char *psz_user, char *psz_password,
-                             httpd_file_callback_t pf_fill,
-                             httpd_file_sys_t *p_sys );
-void         httpd_FileDelete( httpd_file_t * );
-
-typedef struct httpd_redirect_t httpd_redirect_t;
-httpd_redirect_t *httpd_RedirectNew( httpd_host_t *, char *psz_url_dst, char *psz_url_src );
-void              httpd_RedirectDelete( httpd_redirect_t * );
-
-#if 0
-typedef struct httpd_stream_t httpd_stream_t;
-httpd_stream_t *httpd_StreamNew( httpd_host_t * );
-int             httpd_StreamHeader( httpd_stream_t *, uint8_t *p_data, int i_data );
-int             httpd_StreamSend( httpd_stream_t *, uint8_t *p_data, int i_data );
-void            httpd_StreamDelete( httpd_stream_t * );
-#endif
-
-/* Msg functions facilities */
-void         httpd_MsgInit( httpd_message_t * );
-void         httpd_MsgAdd( httpd_message_t *, char *psz_name, char *psz_value, ... );
-/* return "" if not found. The string is not allocated */
-char        *httpd_MsgGet( httpd_message_t *, char *psz_name );
-void         httpd_MsgClean( httpd_message_t * );
-#endif
-
-#if 0
-struct httpd_t
-{
-    VLC_COMMON_MEMBERS
-
-    /* vlc_mutex_t  lock; */
-    int          i_host;
-    httpd_host_t **host;
-};
-#endif
-
 static void httpd_ClientClean( httpd_client_t *cl );
 
 /* each host run in his own thread */
@@ -231,7 +88,7 @@ struct httpd_host_t
 
     int            i_client;
     httpd_client_t **client;
-    
+
     /* TLS data */
     tls_server_t *p_tls;
 };
@@ -270,6 +127,7 @@ enum
     HTTPD_CLIENT_TLS_HS_IN,
     HTTPD_CLIENT_TLS_HS_OUT
 };
+
 /* mode */
 enum
 {
@@ -303,7 +161,7 @@ struct httpd_client_t
     /* */
     httpd_message_t query;  /* client -> httpd */
     httpd_message_t answer; /* httpd -> client */
-    
+
     /* TLS data */
     tls_session_t *p_tls;
 };
@@ -416,6 +274,7 @@ static struct
     /* end */
     { NULL,     NULL }
 };
+
 static const char *httpd_MimeFromUrl( const char *psz_url )
 {
 
@@ -437,6 +296,88 @@ static const char *httpd_MimeFromUrl( const char *psz_url )
     return "application/octet-stream";
 }
 
+#if 0
+typedef struct
+{
+    int i_code;
+    const char *psz_reason;
+} http_status_info;
+
+static const http_status_info http_reason[] =
+{
+  /*{ 100, "Continue" },
+    { 101, "Switching Protocols" },*/
+    { 200, "OK" }/*,
+    { 201, "Created" },
+    { 202, "Accepted" },
+    { 203, "Non-Authoritative Information" },
+    { 204, "No Content" },
+    { 205, "Reset Content" },
+    { 206, "Partial Content" },
+    { 250, "Low on Storage Space" },
+    { 300, "Multiple Choices" }*/,
+    { 301, "Moved Permanently" }/*,
+    { 302, "Moved Temporarily" }, - aka "Found"
+    { 303, "See Other" },
+    { 304, "Not Modified" },
+    { 305, "Use Proxy" },
+    { 307, "Temporary Redirect" },
+    { 400, "Bad Request" }*/,
+    { 401, "Unauthorized" }/*,
+    { 402, "Payment Required" }*/,
+    { 403, "Forbidden" },
+    { 404, "Not Found" }/*,
+    { 405, "Method Not Allowed" },
+    { 406, "Not Acceptable" },
+    { 407, "Proxy Authentication Required" },
+    { 408, "Request Time-out" },
+    { 409, "Conflict" },
+    { 410, "Gone" },
+    { 411, "Length Required" },
+    { 412, "Precondition Failed" },
+    { 413, "Request Entity Too Large" },
+    { 414, "Request-URI Too Large" },
+    { 415, "Unsupported Media Type" },
+    { 416, "Requested range not satisfiable" },
+    { 417, "Expectation Failed" },
+    { 451, "Parameter Not Understood" },
+    { 452, "Conference Not Found" },
+    { 453, "Not Enough Bandwidth" }*/,
+    { 454, "Session Not Found" }/*,
+    { 455, "Method Not Valid in This State" },
+    { 456, "Header Field Not Valid for Resource" },
+    { 457, "Invalid Range" },
+    { 458, "Parameter Is Read-Only" },
+    { 459, "Aggregate operation not allowed" },
+    { 460, "Only aggregate operation allowed" }*/,
+    { 461, "Unsupported transport" }/*,
+    { 462, "Destination unreachable" }*/,
+    { 500, "Internal Server Error" },
+    { 501, "Not Implemented" }/*,
+    { 502, "Bad Gateway" }*/,
+    { 503, "Service Unavailable" }/*,
+    { 504, "Gateway Time-out" },
+    { 505, "Protocol version not supported" }*/,
+    {   0, NULL }
+};
+
+static const char *psz_fallback_reason[] =
+{ "Continue", "OK", "Found", "Client Error", "Server Error" };
+
+static const char *httpd_ReasonFromCode( int i_code )
+{
+    const http_status_info *p;
+
+    for (p = http_reason; p->i_code < i_code; p++);
+
+    if( p->i_code == i_code )
+        return p->psz_reason;
+
+    assert( ( i_code >= 100 ) && ( i_code <= 599 ) );
+    return psz_fallback_reason[(i_code / 100) - 1];
+}
+#endif
+
 /*****************************************************************************
  * High Level Functions: httpd_file_t
  *****************************************************************************/
@@ -452,7 +393,6 @@ struct httpd_file_t
 
 };
 
-
 static int httpd_FileCallBack( httpd_callback_sys_t *p_sys, httpd_client_t *cl, httpd_message_t *answer, httpd_message_t *query )
 {
     httpd_file_t *file = (httpd_file_t*)p_sys;
@@ -512,7 +452,6 @@ static int httpd_FileCallBack( httpd_callback_sys_t *p_sys, httpd_client_t *cl,
     return VLC_SUCCESS;
 }
 
-
 httpd_file_t *httpd_FileNew( httpd_host_t *host,
                              const char *psz_url, const char *psz_mime,
                              const char *psz_user, const char *psz_password,
@@ -578,7 +517,7 @@ static int httpd_HandlerCallBack( httpd_callback_sys_t *p_sys, httpd_client_t *c
 {
     httpd_handler_t *handler = (httpd_handler_t*)p_sys;
     uint8_t *psz_args = query->psz_args;
-    char psz_remote_addr[100];
+    char psz_remote_addr[NI_MAXNUMERICHOST];
 
     if( answer == NULL || query == NULL )
     {
@@ -591,30 +530,8 @@ static int httpd_HandlerCallBack( httpd_callback_sys_t *p_sys, httpd_client_t *c
     answer->i_status = 0;
     answer->psz_status = NULL;
 
-    switch( cl->sock.ss_family )
-    {
-#ifdef HAVE_INET_PTON
-    case AF_INET:
-        inet_ntop( cl->sock.ss_family,
-                   &((struct sockaddr_in *)&cl->sock)->sin_addr,
-                   psz_remote_addr, sizeof(psz_remote_addr) );
-        break;
-    case AF_INET6:
-        inet_ntop( cl->sock.ss_family,
-                   &((struct sockaddr_in6 *)&cl->sock)->sin6_addr,
-                   psz_remote_addr, sizeof(psz_remote_addr) );
-        break;
-#else
-    case AF_INET:
-    {
-        char *psz_tmp = inet_ntoa( ((struct sockaddr_in *)&cl->sock)->sin_addr );
-        strncpy( psz_remote_addr, psz_tmp, sizeof(psz_remote_addr) );
-        break;
-    }
-#endif
-    default:
-        psz_remote_addr[0] = '\0';
-    }
+    if( httpd_ClientIP( cl, psz_remote_addr ) == NULL )
+        *psz_remote_addr = '\0';
 
     handler->pf_fill( handler->p_sys, handler, query->psz_url, psz_args,
                       query->i_type, query->p_body, query->i_body,
@@ -623,7 +540,7 @@ static int httpd_HandlerCallBack( httpd_callback_sys_t *p_sys, httpd_client_t *c
 
     if( query->i_type == HTTPD_MSG_HEAD )
     {
-        char *p = answer->p_body;
+        char *p = (char *)answer->p_body;
         while ( (p = strchr( p, '\r' )) != NULL )
         {
             if( p[1] && p[1] == '\n' && p[2] && p[2] == '\r'
@@ -635,20 +552,20 @@ static int httpd_HandlerCallBack( httpd_callback_sys_t *p_sys, httpd_client_t *c
         if( p != NULL )
         {
             p[4] = '\0';
-            answer->i_body = strlen(answer->p_body) + 1;
+            answer->i_body = strlen((char*)answer->p_body) + 1;
             answer->p_body = realloc( answer->p_body, answer->i_body );
         }
     }
 
-    if( strncmp( answer->p_body, "HTTP/1.", 7 ) )
+    if( strncmp( (char *)answer->p_body, "HTTP/1.", 7 ) )
     {
         int i_status, i_headers;
         char *psz_headers, *psz_new, *psz_status;
-        char psz_code[12];
-        if( !strncmp( answer->p_body, "Status: ", 8 ) )
+
+        if( !strncmp( (char *)answer->p_body, "Status: ", 8 ) )
         {
             /* Apache-style */
-            i_status = strtol( &answer->p_body[8], &psz_headers, 0 );
+            i_status = strtol( (char *)&answer->p_body[8], &psz_headers, 0 );
             if( *psz_headers ) psz_headers++;
             if( *psz_headers ) psz_headers++;
             i_headers = answer->i_body - (psz_headers - (char *)answer->p_body);
@@ -656,7 +573,7 @@ static int httpd_HandlerCallBack( httpd_callback_sys_t *p_sys, httpd_client_t *c
         else
         {
             i_status = 200;
-            psz_headers = answer->p_body;
+            psz_headers = (char *)answer->p_body;
             i_headers = answer->i_body;
         }
         switch( i_status )
@@ -668,17 +585,18 @@ static int httpd_HandlerCallBack( httpd_callback_sys_t *p_sys, httpd_client_t *c
             psz_status = "Unauthorized";
             break;
         default:
+            if( (i_status < 0) || (i_status > 999) )
+                i_status = 500;
             psz_status = "Undefined";
             break;
         }
-        snprintf( psz_code, sizeof(psz_code), "%d", i_status );
-        answer->i_body = sizeof("HTTP/1.0  \r\n") + strlen(psz_code)
-                           + strlen(psz_status) + i_headers - 1;
-        psz_new = malloc( answer->i_body + 1);
-        sprintf( psz_new, "HTTP/1.0 %s %s\r\n", psz_code, psz_status );
+        answer->i_body = sizeof("HTTP/1.0 xxx \r\n")
+                        + strlen(psz_status) + i_headers - 1;
+        psz_new = (char *)malloc( answer->i_body + 1);
+        sprintf( psz_new, "HTTP/1.0 %03d %s\r\n", i_status, psz_status );
         memcpy( &psz_new[strlen(psz_new)], psz_headers, i_headers );
         free( answer->p_body );
-        answer->p_body = psz_new;
+        answer->p_body = (uint8_t *)psz_new;
     }
 
     return VLC_SUCCESS;
@@ -734,7 +652,6 @@ static int httpd_RedirectCallBack( httpd_callback_sys_t *p_sys,
                                    httpd_message_t *query )
 {
     httpd_redirect_t *rdir = (httpd_redirect_t*)p_sys;
-    uint8_t *p;
 
     if( answer == NULL || query == NULL )
     {
@@ -746,8 +663,7 @@ static int httpd_RedirectCallBack( httpd_callback_sys_t *p_sys,
     answer->i_status = 301;
     answer->psz_status = strdup( "Moved Permanently" );
 
-    p = answer->p_body = malloc( 1000 + strlen( rdir->psz_dst ) );
-    p += sprintf( (char *)p,
+    answer->i_body = asprintf( (char **)&answer->p_body,
         "<?xml version=\"1.0\" encoding=\"ascii\" ?>\n"
         "<!DOCTYPE html PUBLIC \"-//W3C//DTD  XHTML 1.0 Strict//EN\" "
         "\"http://www.w3.org/TR/xhtml10/DTD/xhtml10strict.dtd\">\n"
@@ -756,14 +672,13 @@ static int httpd_RedirectCallBack( httpd_callback_sys_t *p_sys,
         "<title>Redirection</title>\n"
         "</head>\n"
         "<body>\n"
-        "<h1>You should be " 
+        "<h1>You should be "
         "<a href=\"%s\">redirected</a></h1>\n"
         "<hr />\n"
         "<p><a href=\"http://www.videolan.org\">VideoLAN</a>\n</p>"
         "<hr />\n"
         "</body>\n"
         "</html>\n", rdir->psz_dst );
-    answer->i_body = p - answer->p_body;
 
     /* XXX check if it's ok or we need to set an absolute url */
     httpd_MsgAdd( answer, "Location",  "%s", rdir->psz_dst );
@@ -835,6 +750,7 @@ static int httpd_StreamCallBack( httpd_callback_sys_t *p_sys,
     {
         return VLC_SUCCESS;
     }
+
     if( answer->i_body_offset > 0 )
     {
         int64_t i_write;
@@ -854,8 +770,10 @@ static int httpd_StreamCallBack( httpd_callback_sys_t *p_sys,
             stream->i_buffer_pos )
         {
             /* this client isn't fast enough */
+#if 0
             fprintf( stderr, "fixing i_body_offset (old=%lld new=%lld)\n",
                      answer->i_body_offset, stream->i_buffer_last_pos );
+#endif
             answer->i_body_offset = stream->i_buffer_last_pos;
         }
 
@@ -1058,7 +976,6 @@ void httpd_StreamDelete( httpd_stream_t *stream )
     free( stream );
 }
 
-
 /*****************************************************************************
  * Low level
  *****************************************************************************/
@@ -1173,7 +1090,7 @@ httpd_host_t *httpd_TLSHostNew( vlc_object_t *p_this, const char *psz_hostname,
         msg_Err( p_this, "cannot create socket(s) for HTTP host" );
         goto error;
     }
-       
+
     host->i_port = i_port;
     host->psz_hostname = psz_host;
 
@@ -1228,8 +1145,6 @@ void httpd_HostDelete( httpd_host_t *host )
     vlc_value_t lockval;
     int i;
 
-    msg_Dbg( host, "httpd_HostDelete" );
-
     var_Get( httpd->p_libvlc, "httpd_mutex", &lockval );
     vlc_mutex_lock( lockval.p_address );
 
@@ -1243,12 +1158,10 @@ void httpd_HostDelete( httpd_host_t *host )
     }
     TAB_REMOVE( httpd->i_host, httpd->host, host );
 
-    msg_Dbg( host, "httpd_HostDelete: host removed from http" );
-
     host->b_die = 1;
     vlc_thread_join( host );
 
-    msg_Dbg( host, "httpd_HostDelete: host thread joined" );
+    msg_Dbg( host, "HTTP host removed" );
 
     for( i = 0; i < host->i_url; i++ )
     {
@@ -1277,7 +1190,7 @@ void httpd_HostDelete( httpd_host_t *host )
     vlc_object_release( httpd );
     if( httpd->i_host <= 0 )
     {
-        msg_Info( httpd, "httpd doesn't reference any host, deleting" );
+        msg_Dbg( httpd, "no host left, stopping httpd" );
         vlc_object_detach( httpd );
         vlc_object_destroy( httpd );
     }
@@ -1355,7 +1268,6 @@ int httpd_UrlCatch( httpd_url_t *url, int i_msg, httpd_callback_t cb,
     return VLC_SUCCESS;
 }
 
-
 /* delete an url */
 void httpd_UrlDelete( httpd_url_t *url )
 {
@@ -1399,15 +1311,15 @@ void httpd_MsgInit( httpd_message_t *msg )
     msg->i_status   = 0;
     msg->psz_status = NULL;
 
-    msg->psz_url = NULL;
-    msg->psz_args = NULL;
+    msg->psz_url    = NULL;
+    msg->psz_args   = NULL;
 
-    msg->i_channel = -1;
+    msg->i_channel  = -1;
 
-    msg->i_name = 0;
-    msg->name   = NULL;
-    msg->i_value= 0;
-    msg->value  = NULL;
+    msg->i_name     = 0;
+    msg->name       = NULL;
+    msg->i_value    = 0;
+    msg->value      = NULL;
 
     msg->i_body_offset = 0;
     msg->i_body        = 0;
@@ -1463,13 +1375,14 @@ char *httpd_MsgGet( httpd_message_t *msg, char *name )
     }
     return "";
 }
+
 void httpd_MsgAdd( httpd_message_t *msg, char *name, char *psz_value, ... )
 {
     va_list args;
     char *value = NULL;
 
     va_start( args, psz_value );
-#if defined(HAVE_VASPRINTF) && !defined(SYS_DARWIN) && !defined(SYS_BEOS)
+#if defined(HAVE_VASPRINTF) && !defined(__APPLE__) && !defined(SYS_BEOS)
     vasprintf( &value, psz_value, args );
 #else
     {
@@ -1512,12 +1425,12 @@ void httpd_ClientModeBidir( httpd_client_t *cl )
     cl->i_mode   = HTTPD_CLIENT_BIDIR;
 }
 
-char* httpd_ClientIP( httpd_client_t *cl, char *psz_ip )
+char* httpd_ClientIP( const httpd_client_t *cl, char *psz_ip )
 {
     return net_GetPeerAddress( cl->fd, psz_ip, NULL ) ? NULL : psz_ip;
 }
 
-char* httpd_ServerIP( httpd_client_t *cl, char *psz_ip )
+char* httpd_ServerIP( const httpd_client_t *cl, char *psz_ip )
 {
     return net_GetSockAddress( cl->fd, psz_ip, NULL ) ? NULL : psz_ip;
 }
@@ -1547,6 +1460,9 @@ static httpd_client_t *httpd_ClientNew( int fd, struct sockaddr_storage *sock,
                                         tls_session_t *p_tls )
 {
     httpd_client_t *cl = malloc( sizeof( httpd_client_t ) );
+
+    if( !cl ) return NULL;
+
     cl->i_ref   = 0;
     cl->fd      = fd;
     memcpy( &cl->sock, sock, sizeof( cl->sock ) );
@@ -1559,11 +1475,10 @@ static httpd_client_t *httpd_ClientNew( int fd, struct sockaddr_storage *sock,
     return cl;
 }
 
-
 static int httpd_NetRecv( httpd_client_t *cl, uint8_t *p, int i_len )
 {
     tls_session_t *p_tls;
-    
+
     p_tls = cl->p_tls;
     if( p_tls != NULL)
         return tls_Recv( p_tls, p, i_len );
@@ -1571,7 +1486,6 @@ static int httpd_NetRecv( httpd_client_t *cl, uint8_t *p, int i_len )
     return recv( cl->fd, p, i_len, 0 );
 }
 
-
 static int httpd_NetSend( httpd_client_t *cl, const uint8_t *p, int i_len )
 {
     tls_session_t *p_tls;
@@ -1583,7 +1497,6 @@ static int httpd_NetSend( httpd_client_t *cl, const uint8_t *p, int i_len )
     return send( cl->fd, p, i_len, 0 );
 }
 
-
 static void httpd_ClientRecv( httpd_client_t *cl )
 {
     int i_len;
@@ -1889,8 +1802,8 @@ static void httpd_ClientRecv( httpd_client_t *cl )
     if( cl->query.i_proto == HTTPD_PROTO_RTSP )
         cl->i_activity_timeout = 0;
 
-    /* Debugging only */
-    /*if( cl->i_state == HTTPD_CLIENT_RECEIVE_DONE )
+#if 0 /* Debugging only */
+    if( cl->i_state == HTTPD_CLIENT_RECEIVE_DONE )
     {
         int i;
 
@@ -1913,10 +1826,10 @@ static void httpd_ClientRecv( httpd_client_t *cl )
             fprintf( stderr, "  - option name='%s' value='%s'\n",
                      cl->query.name[i], cl->query.value[i] );
         }
-    }*/
+    }
+#endif
 }
 
-
 static void httpd_ClientSend( httpd_client_t *cl )
 {
     int i;
@@ -2058,8 +1971,10 @@ static void httpd_HostThread( httpd_host_t *host )
 {
     tls_session_t *p_tls = NULL;
 
-    stats_Create( host, "client_connections", VLC_VAR_INTEGER, STATS_COUNTER );
-    stats_Create( host, "active_connections", VLC_VAR_INTEGER, STATS_COUNTER );
+    stats_Create( host, "client_connections", STATS_CLIENT_CONNECTIONS,
+                  VLC_VAR_INTEGER, STATS_COUNTER );
+    stats_Create( host, "active_connections", STATS_ACTIVE_CONNECTIONS,
+                  VLC_VAR_INTEGER, STATS_COUNTER );
 
     while( !host->b_die )
     {
@@ -2109,7 +2024,7 @@ static void httpd_HostThread( httpd_host_t *host )
                     cl->i_activity_date+cl->i_activity_timeout < mdate()) ) ) )
             {
                 httpd_ClientClean( cl );
-                stats_UpdateInteger( host, "active_connections", -1 );
+                stats_UpdateInteger( host, STATS_ACTIVE_CONNECTIONS, -1, NULL );
                 TAB_REMOVE( host->i_client, host->client, cl );
                 free( cl );
                 i_client--;
@@ -2136,7 +2051,7 @@ static void httpd_HostThread( httpd_host_t *host )
                 httpd_MsgInit( answer );
 
                 /* Handle what we received */
-                if( cl->i_mode != HTTPD_CLIENT_BIDIR &&
+                if( (cl->i_mode != HTTPD_CLIENT_BIDIR) &&
                     (i_msg == HTTPD_MSG_ANSWER || i_msg == HTTPD_MSG_CHANNEL) )
                 {
                     /* we can only receive request from client when not
@@ -2288,6 +2203,7 @@ static void httpd_HostThread( httpd_host_t *host )
                                     {
                                         strcpy( auth, "" );
                                     }
+
                                     if( strcmp( id, auth ) )
                                     {
                                         httpd_MsgAdd( answer, "WWW-Authenticate", "Basic realm=\"%s\"", url->psz_user );
@@ -2322,6 +2238,7 @@ static void httpd_HostThread( httpd_host_t *host )
                             }
                         }
                     }
+
                     if( answer )
                     {
                         uint8_t *p;
@@ -2500,7 +2417,7 @@ static void httpd_HostThread( httpd_host_t *host )
         i_ret = select( i_handle_max + 1,
                         &fds_read, &fds_write, NULL, &timeout );
 
-        if( i_ret == -1 && errno != EINTR )
+        if( (i_ret == -1) && (errno != EINTR) )
         {
 #if defined(WIN32) || defined(UNDER_CE)
             msg_Warn( host, "cannot select sockets (%d)", WSAGetLastError( ) );
@@ -2522,23 +2439,23 @@ static void httpd_HostThread( httpd_host_t *host )
             {
                 socklen_t i_sock_size = sizeof( struct sockaddr_storage );
                 struct  sockaddr_storage sock;
-    
+
                 fd = accept( fd, (struct sockaddr *)&sock, &i_sock_size );
-                fprintf ( stderr, "Accepting\n");
+                msg_Info( host, "Accepting" );
                 if( fd >= 0 )
                 {
                     int i_state = 0;
-    
+
                     /* set this new socket non-block */
-    #if defined( WIN32 ) || defined( UNDER_CE )
+#if defined( WIN32 ) || defined( UNDER_CE )
                     {
                         unsigned long i_dummy = 1;
                         ioctlsocket( fd, FIONBIO, &i_dummy );
                     }
-    #else
+#else
                     fcntl( fd, F_SETFL, O_NONBLOCK );
-    #endif
-    
+#endif
+
                     if( p_tls != NULL)
                     {
                         switch ( tls_ServerSessionHandshake( p_tls, fd ) )
@@ -2549,11 +2466,11 @@ static void httpd_HostThread( httpd_host_t *host )
                                 fd = -1;
                                 p_tls = NULL;
                                 break;
-    
+
                             case 1: /* missing input - most likely */
                                 i_state = HTTPD_CLIENT_TLS_HS_IN;
                                 break;
-    
+
                             case 2: /* missing output */
                                 i_state = HTTPD_CLIENT_TLS_HS_OUT;
                                 break;
@@ -2563,9 +2480,10 @@ static void httpd_HostThread( httpd_host_t *host )
                     if( fd >= 0 )
                     {
                         httpd_client_t *cl;
-                        stats_UpdateInteger( host, "client_connections",
-                                             1 );
-                        stats_UpdateInteger( host, "active_connections", 1 );
+                        stats_UpdateInteger( host, STATS_CLIENT_CONNECTIONS,
+                                             1, NULL );
+                        stats_UpdateInteger( host, STATS_ACTIVE_CONNECTIONS, 1,
+                                             NULL );
                         cl = httpd_ClientNew( fd, &sock, i_sock_size, p_tls );
                         p_tls = NULL;
                         vlc_mutex_lock( &host->lock );
@@ -2622,42 +2540,71 @@ httpd_host_t *httpd_TLSHostNew( vlc_object_t *a, char *b, int c,
                                 tls_server_t *d )
 {
     msg_Err( a, "HTTP daemon support is disabled" );
-    return 0;
+    return NULL;
 }
+
 httpd_host_t *httpd_HostNew( vlc_object_t *a, char *b, int c )
 {
     msg_Err( a, "HTTP daemon support is disabled" );
-    return 0;
+    return NULL;
 }
+
 void httpd_HostDelete( httpd_host_t *a )
 {
 }
+
 httpd_url_t *httpd_UrlNew( httpd_host_t *host, char *psz_url,
                            char *psz_user, char *psz_password,
                            const vlc_acl_t *p_acl )
 {
     return NULL;
 }
+
 httpd_url_t *httpd_UrlNewUnique( httpd_host_t *host, char *psz_url,
                                  char *psz_user, char *psz_password,
                                  const vlc_acl_t *p_acl )
 {
     return NULL;
 }
+
 int httpd_UrlCatch( httpd_url_t *a, int b, httpd_callback_t c,
-                    httpd_callback_sys_t *d ){ return 0; }
-void httpd_UrlDelete( httpd_url_t *a ){}
+                    httpd_callback_sys_t *d )
+{
+    return 0;
+}
+
+void httpd_UrlDelete( httpd_url_t *a )
+{
+}
+
+char* httpd_ClientIP( httpd_client_t *cl, char *psz_ip )
+{
+    return NULL;
+}
+
+char* httpd_ServerIP( httpd_client_t *cl, char *psz_ip )
+{
+    return NULL;
+}
+
+void httpd_ClientModeStream( httpd_client_t *a )
+{
+}
 
-char* httpd_ClientIP( httpd_client_t *cl, char *psz_ip ) { return NULL; }
-char* httpd_ServerIP( httpd_client_t *cl, char *psz_ip ) { return NULL; }
+void httpd_ClientModeBidir( httpd_client_t *a )
+{
+}
 
-void httpd_ClientModeStream( httpd_client_t *a ){}
-void httpd_ClientModeBidir( httpd_client_t *a ){}
+void httpd_FileDelete( httpd_file_t *a )
+{
+}
 
-void httpd_FileDelete( httpd_file_t *a ){}
 httpd_file_t *httpd_FileNew( httpd_host_t *a, char *b, char *c, char *d,
                              char *e, httpd_file_callback_t f,
-                             httpd_file_sys_t *g ){ return 0; }
+                             httpd_file_sys_t *g )
+{
+    return NULL;
+}
 
 httpd_handler_t *httpd_HandlerNew( httpd_host_t *host, const char *psz_url,
                                    const char *psz_user,
@@ -2668,21 +2615,56 @@ httpd_handler_t *httpd_HandlerNew( httpd_host_t *host, const char *psz_url,
 {
     return NULL;
 }
-void httpd_HandlerDelete( httpd_handler_t *handler ) {}
 
-void httpd_RedirectDelete( httpd_redirect_t *a ){}
+void httpd_HandlerDelete( httpd_handler_t *handler )
+{
+}
+
+void httpd_RedirectDelete( httpd_redirect_t *a )
+{
+}
+
 httpd_redirect_t *httpd_RedirectNew( httpd_host_t *a,
-                                     char *b, char *c ){ return 0; }
+                                     char *b, char *c )
+{
+    return NULL;
+}
+
+void httpd_StreamDelete( httpd_stream_t *a )
+{
+}
+
+int httpd_StreamHeader( httpd_stream_t *a, uint8_t *b, int c )
+{
+    return 0;
+}
+
+int httpd_StreamSend ( httpd_stream_t *a, uint8_t *b, int c )
+{
+    return 0;
+}
 
-void httpd_StreamDelete( httpd_stream_t *a ){}
-int  httpd_StreamHeader( httpd_stream_t *a, uint8_t *b, int c ){ return 0; }
-int  httpd_StreamSend  ( httpd_stream_t *a, uint8_t *b, int c ){ return 0; }
 httpd_stream_t *httpd_StreamNew( httpd_host_t *a, char *b, char *c,
-                                 char *d, char *e ){ return 0; }
+                                 char *d, char *e )
+{
+    return NULL;
+}
+
+void httpd_MsgInit ( httpd_message_t *a )
+{
+}
+
+void httpd_MsgAdd  ( httpd_message_t *a, char *b, char *c, ... )
+{
+}
 
-void httpd_MsgInit ( httpd_message_t *a ){}
-void httpd_MsgAdd  ( httpd_message_t *a, char *b, char *c, ... ){}
-char *httpd_MsgGet ( httpd_message_t *a, char *b ){ return 0; }
-void httpd_MsgClean( httpd_message_t *a ){}
+char *httpd_MsgGet ( httpd_message_t *a, char *b )
+{
+    return NULL;
+}
+
+void httpd_MsgClean( httpd_message_t *a )
+{
+}
 
 #endif /* ENABLE_HTTPD */