X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fnetwork%2Fhttpd.c;h=8b7c883836f87e9d7ed381dc21856d822bf5ee11;hb=cc960e5b4b61132996563818db285adf02507a62;hp=3da773172e5c38c7af7aee278d7ceb41c13f5618;hpb=8ab353b1123d829cd0e335a36cc7dffb4ae83a19;p=vlc diff --git a/src/network/httpd.c b/src/network/httpd.c index 3da773172e..8b7c883836 100644 --- a/src/network/httpd.c +++ b/src/network/httpd.c @@ -622,6 +622,7 @@ static int httpd_RedirectCallBack( httpd_callback_sys_t *p_sys, httpd_message_t *query ) { httpd_redirect_t *rdir = (httpd_redirect_t*)p_sys; + char *p_body; if( answer == NULL || query == NULL ) { @@ -633,7 +634,7 @@ static int httpd_RedirectCallBack( httpd_callback_sys_t *p_sys, answer->i_status = 301; answer->psz_status = strdup( "Moved Permanently" ); - answer->i_body = asprintf( (char **)&answer->p_body, + answer->i_body = asprintf( &p_body, "\n" "\n" @@ -649,6 +650,7 @@ static int httpd_RedirectCallBack( httpd_callback_sys_t *p_sys, "
\n" "\n" "\n", rdir->psz_dst ); + answer->p_body = (unsigned char *)p_body; /* XXX check if it's ok or we need to set an absolute url */ httpd_MsgAdd( answer, "Location", "%s", rdir->psz_dst ); @@ -1506,7 +1508,7 @@ static void httpd_ClientRecv( httpd_client_t *cl ) cl->query.i_proto = HTTPD_PROTO_RTSP; cl->query.i_type = HTTPD_MSG_ANSWER; } - else if( !memcmp( cl->p_buffer, "GET", 3 ) || + else if( !memcmp( cl->p_buffer, "GET ", 4 ) || !memcmp( cl->p_buffer, "HEAD", 4 ) || !memcmp( cl->p_buffer, "POST", 4 ) ) { @@ -1583,18 +1585,19 @@ static void httpd_ClientRecv( httpd_client_t *cl ) } msg_type[] = { - { "GET", HTTPD_MSG_GET, HTTPD_PROTO_HTTP }, - { "HEAD", HTTPD_MSG_HEAD, HTTPD_PROTO_HTTP }, - { "POST", HTTPD_MSG_POST, HTTPD_PROTO_HTTP }, - - { "OPTIONS", HTTPD_MSG_OPTIONS, HTTPD_PROTO_RTSP }, - { "DESCRIBE", HTTPD_MSG_DESCRIBE, HTTPD_PROTO_RTSP }, - { "SETUP", HTTPD_MSG_SETUP, HTTPD_PROTO_RTSP }, - { "PLAY", HTTPD_MSG_PLAY, HTTPD_PROTO_RTSP }, - { "PAUSE", HTTPD_MSG_PAUSE, HTTPD_PROTO_RTSP }, - { "TEARDOWN", HTTPD_MSG_TEARDOWN, HTTPD_PROTO_RTSP }, - - { NULL, HTTPD_MSG_NONE, HTTPD_PROTO_NONE } + { "OPTIONS", HTTPD_MSG_OPTIONS, HTTPD_PROTO_RTSP }, + { "DESCRIBE", HTTPD_MSG_DESCRIBE, HTTPD_PROTO_RTSP }, + { "SETUP", HTTPD_MSG_SETUP, HTTPD_PROTO_RTSP }, + { "PLAY", HTTPD_MSG_PLAY, HTTPD_PROTO_RTSP }, + { "PAUSE", HTTPD_MSG_PAUSE, HTTPD_PROTO_RTSP }, + { "GET_PARAMETER", HTTPD_MSG_GETPARAMETER, HTTPD_PROTO_RTSP }, + { "TEARDOWN", HTTPD_MSG_TEARDOWN, HTTPD_PROTO_RTSP }, + + { "GET", HTTPD_MSG_GET, HTTPD_PROTO_HTTP }, + { "HEAD", HTTPD_MSG_HEAD, HTTPD_PROTO_HTTP }, + { "POST", HTTPD_MSG_POST, HTTPD_PROTO_HTTP }, + + { NULL, HTTPD_MSG_NONE, HTTPD_PROTO_NONE } }; int i; @@ -1941,10 +1944,10 @@ static void httpd_HostThread( httpd_host_t *host ) { tls_session_t *p_tls = NULL; - 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 ); + host->p_total_counter = stats_CounterCreate( host, + VLC_VAR_INTEGER, STATS_COUNTER ); + host->p_active_counter = stats_CounterCreate( host, + VLC_VAR_INTEGER, STATS_COUNTER ); while( !host->b_die ) { @@ -1994,7 +1997,7 @@ static void httpd_HostThread( httpd_host_t *host ) cl->i_activity_date+cl->i_activity_timeout < mdate()) ) ) ) { httpd_ClientClean( cl ); - stats_UpdateInteger( host, STATS_ACTIVE_CONNECTIONS, -1, NULL ); + stats_UpdateInteger( host, host->p_active_counter, -1, NULL ); TAB_REMOVE( host->i_client, host->client, cl ); free( cl ); i_client--; @@ -2166,7 +2169,8 @@ static void httpd_HostThread( httpd_host_t *host ) if( b64 ) auth = malloc( strlen(b64) + 1 ); else auth = malloc( strlen("") + 1 ); - if( !strncasecmp( b64, "BASIC", 5 ) ) + if( b64 != NULL + && !strncasecmp( b64, "BASIC", 5 ) ) { b64 += 5; while( *b64 == ' ' ) @@ -2231,7 +2235,7 @@ static void httpd_HostThread( httpd_host_t *host ) /* FIXME: lots of code duplication */ p += sprintf( (char *)p, - "" + "" "\n" "\n" @@ -2241,7 +2245,7 @@ static void httpd_HostThread( httpd_host_t *host ) "\n" "

403 Forbidden (%s)

\n" "
\n" - "VideoLAN\n" + "

VideoLAN

\n" "\n" "\n", query->psz_url ); } @@ -2251,7 +2255,7 @@ static void httpd_HostThread( httpd_host_t *host ) answer->psz_status = strdup( "Authorization Required" ); p += sprintf( (char *)p, - "" + "" "\n" "\n" @@ -2261,7 +2265,7 @@ static void httpd_HostThread( httpd_host_t *host ) "\n" "

401 Authorization Required (%s)

\n" "
\n" - "VideoLAN\n" + "

VideoLAN

\n" "\n" "\n", query->psz_url ); } @@ -2272,7 +2276,7 @@ static void httpd_HostThread( httpd_host_t *host ) answer->psz_status = strdup( "Not found" ); p += sprintf( (char *)p, - "" + "" "\n" "\n" @@ -2282,7 +2286,7 @@ static void httpd_HostThread( httpd_host_t *host ) "\n" "

404 Resource not found(%s)

\n" "
\n" - "VideoLAN\n" + "

VideoLAN

\n" "\n" "\n", query->psz_url ); } @@ -2290,6 +2294,7 @@ static void httpd_HostThread( httpd_host_t *host ) answer->i_body = p - answer->p_body; cl->i_buffer = -1; /* Force the creation of the answer in httpd_ClientSend */ httpd_MsgAdd( answer, "Content-Length", "%d", answer->i_body ); + httpd_MsgAdd( answer, "Content-Type", "%s", "text/html" ); } cl->i_state = HTTPD_CLIENT_SENDING; @@ -2433,9 +2438,13 @@ static void httpd_HostThread( httpd_host_t *host ) struct sockaddr_storage sock; fd = accept( fd, (struct sockaddr *)&sock, &i_sock_size ); + if( fd >= 0 ) { - int i_state = 0; + int i_state = 1; + + setsockopt( fd, SOL_SOCKET, SO_REUSEADDR, &i_state, sizeof (i_state)); + i_state = 0; /* set this new socket non-block */ #if defined( WIN32 ) || defined( UNDER_CE ) @@ -2444,9 +2453,20 @@ static void httpd_HostThread( httpd_host_t *host ) ioctlsocket( fd, FIONBIO, &i_dummy ); } #else - fcntl( fd, F_SETFL, O_NONBLOCK ); -#endif + fcntl( fd, F_SETFD, FD_CLOEXEC ); + { + int i_val = fcntl( fd, F_GETFL ); + fcntl( fd, F_SETFL, + O_NONBLOCK | ((i_val != -1) ? i_val : 0) ); + } + if( fd >= FD_SETSIZE ) + { + net_Close( fd ); + fd = -1; + } + else +#endif if( p_tls != NULL) { switch ( tls_ServerSessionHandshake( p_tls, fd ) ) @@ -2472,10 +2492,10 @@ static void httpd_HostThread( httpd_host_t *host ) { httpd_client_t *cl; char ip[NI_MAXNUMERICHOST]; - stats_UpdateInteger( host, STATS_CLIENT_CONNECTIONS, + stats_UpdateInteger( host, host->p_total_counter, + 1, NULL ); + stats_UpdateInteger( host, host->p_active_counter, 1, NULL ); - stats_UpdateInteger( host, STATS_ACTIVE_CONNECTIONS, 1, - NULL ); cl = httpd_ClientNew( fd, &sock, i_sock_size, p_tls ); httpd_ClientIP( cl, ip ); msg_Dbg( host, "Connection from %s", ip );