📄 http.c
字号:
{ p_sys->p_input = p_sys->p_playlist->p_input; } } else if( p_sys->p_input->b_dead || p_sys->p_input->b_die ) { p_sys->p_input = NULL; } /* Wait a bit */ msleep( INTF_IDLE_SLEEP ); } if( p_sys->p_input ) { vlc_object_release( p_sys->p_input ); p_sys->p_input = NULL; } if( p_sys->p_playlist ) { vlc_object_release( p_sys->p_playlist ); p_sys->p_playlist = NULL; }}/**************************************************************************** * HttpCallback: **************************************************************************** * a file with b_html is parsed and all "macro" replaced ****************************************************************************/static void Callback404( httpd_file_sys_t *p_args, char **pp_data, int *pi_data ){ char *p = *pp_data = malloc( 10240 ); if( !p ) { return; } p += sprintf( p, "Content-Type: text/html\n" ); p += sprintf( p, "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" ); p += sprintf( p, "<head>\n" ); p += sprintf( p, "<title>Error loading %s</title>\n", p_args->file ); p += sprintf( p, "</head>\n" ); p += sprintf( p, "<body>\n" ); p += sprintf( p, "<h1><center>Error loading %s for %s</center></h1>\n", p_args->file, p_args->name ); p += sprintf( p, "<a href=\"http://www.videolan.org/\">VideoLAN</a>\n" ); p += sprintf( p, "</body>\n" ); p += sprintf( p, "</html>\n" ); *pi_data = strlen( *pp_data );}static void ParseExecute( httpd_file_sys_t *p_args, char *p_buffer, int i_buffer, char *p_request, char **pp_data, int *pi_data ){ int i_request = p_request != NULL ? strlen( p_request ) : 0; char *dst; vlc_value_t val; char position[4]; /* percentage */ char time[12]; /* in seconds */ char length[12]; /* in seconds */ audio_volume_t i_volume; char volume[5]; char state[8]; char stats[20];#define p_sys p_args->p_intf->p_sys if( p_sys->p_input ) { var_Get( p_sys->p_input, "position", &val); sprintf( position, "%d" , (int)((val.f_float) * 100.0)); var_Get( p_sys->p_input, "time", &val); sprintf( time, I64Fi, val.i_time / 1000000LL ); var_Get( p_sys->p_input, "length", &val); sprintf( length, I64Fi, val.i_time / 1000000LL ); var_Get( p_sys->p_input, "state", &val ); if( val.i_int == PLAYING_S ) { sprintf( state, "playing" ); } else if( val.i_int == PAUSE_S ) { sprintf( state, "paused" ); } else { sprintf( state, "stop" ); } } else { sprintf( position, "%d", 0 ); sprintf( time, "%d", 0 ); sprintf( length, "%d", 0 ); sprintf( state, "stop" ); }#undef p_sys aout_VolumeGet( p_args->p_intf, &i_volume ); sprintf( volume, "%d", (int)i_volume ); p_args->vars = E_(mvar_New)( "variables", "" ); E_(mvar_AppendNewVar)( p_args->vars, "url_param", i_request > 0 ? "1" : "0" ); E_(mvar_AppendNewVar)( p_args->vars, "url_value", p_request ); E_(mvar_AppendNewVar)( p_args->vars, "version", VLC_Version() ); E_(mvar_AppendNewVar)( p_args->vars, "copyright", COPYRIGHT_MESSAGE ); E_(mvar_AppendNewVar)( p_args->vars, "vlc_compile_by", VLC_CompileBy() ); E_(mvar_AppendNewVar)( p_args->vars, "vlc_compile_host", VLC_CompileHost() ); E_(mvar_AppendNewVar)( p_args->vars, "vlc_compile_domain", VLC_CompileDomain() ); E_(mvar_AppendNewVar)( p_args->vars, "vlc_compiler", VLC_Compiler() );#ifndef HAVE_SHARED_LIBVLC E_(mvar_AppendNewVar)( p_args->vars, "vlc_changeset", VLC_Changeset() );#endif E_(mvar_AppendNewVar)( p_args->vars, "stream_position", position ); E_(mvar_AppendNewVar)( p_args->vars, "stream_time", time ); E_(mvar_AppendNewVar)( p_args->vars, "stream_length", length ); E_(mvar_AppendNewVar)( p_args->vars, "volume", volume ); E_(mvar_AppendNewVar)( p_args->vars, "stream_state", state ); E_(mvar_AppendNewVar)( p_args->vars, "charset", ((intf_sys_t *)p_args->p_intf->p_sys)->psz_charset ); /* Stats */#define p_sys p_args->p_intf->p_sys if( p_sys->p_input ) { input_item_t *p_item = p_sys->p_input->input.p_item; if( p_item ) { vlc_mutex_lock( &p_item->p_stats->lock );#define STATS_INT( n ) sprintf( stats, "%d", p_item->p_stats->i_ ## n ); \ E_(mvar_AppendNewVar)( p_args->vars, #n, stats );#define STATS_FLOAT( n ) sprintf( stats, "%f", p_item->p_stats->f_ ## n ); \ E_(mvar_AppendNewVar)( p_args->vars, #n, stats ); STATS_INT( read_bytes ) STATS_FLOAT( input_bitrate ) STATS_INT( demux_read_bytes ) STATS_FLOAT( demux_bitrate ) STATS_INT( decoded_video ) STATS_INT( displayed_pictures ) STATS_INT( lost_pictures ) STATS_INT( decoded_audio ) STATS_INT( played_abuffers ) STATS_INT( lost_abuffers ) STATS_INT( sent_packets ) STATS_INT( sent_bytes ) STATS_FLOAT( send_bitrate )#undef STATS_INT#undef STATS_FLOAT vlc_mutex_unlock( &p_item->p_stats->lock ); } }#undef p_sys E_(SSInit)( &p_args->stack ); /* allocate output */ *pi_data = i_buffer + 1000; dst = *pp_data = malloc( *pi_data ); /* we parse executing all <vlc /> macros */ E_(Execute)( p_args, p_request, i_request, pp_data, pi_data, &dst, &p_buffer[0], &p_buffer[i_buffer] ); *dst = '\0'; *pi_data = dst - *pp_data; E_(SSClean)( &p_args->stack ); E_(mvar_Delete)( p_args->vars );}int E_(HttpCallback)( httpd_file_sys_t *p_args, httpd_file_t *p_file, uint8_t *_p_request, uint8_t **_pp_data, int *pi_data ){ char *p_request = (char *)_p_request; char **pp_data = (char **)_pp_data; FILE *f; /* FIXME: do we need character encoding translation here? */ if( ( f = fopen( p_args->file, "r" ) ) == NULL ) { Callback404( p_args, pp_data, pi_data ); return VLC_SUCCESS; } if( !p_args->b_html ) { E_(FileLoad)( f, pp_data, pi_data ); } else { int i_buffer; char *p_buffer; /* first we load in a temporary buffer */ E_(FileLoad)( f, &p_buffer, &i_buffer ); ParseExecute( p_args, p_buffer, i_buffer, p_request, pp_data, pi_data ); free( p_buffer ); } fclose( f ); return VLC_SUCCESS;}/**************************************************************************** * HandlerCallback: **************************************************************************** * call the external handler and parse vlc macros if Content-Type is HTML ****************************************************************************/int E_(HandlerCallback)( httpd_handler_sys_t *p_args, httpd_handler_t *p_handler, char *_p_url, uint8_t *_p_request, int i_type, uint8_t *_p_in, int i_in, char *psz_remote_addr, char *psz_remote_host, uint8_t **_pp_data, int *pi_data ){ char *p_url = (char *)_p_url; char *p_request = (char *)_p_request; char **pp_data = (char **)_pp_data; char *p_in = (char *)p_in; int i_request = p_request != NULL ? strlen( p_request ) : 0; char *p; int i_env = 0; char **ppsz_env = NULL; char *psz_tmp; char sep; int i_buffer; char *p_buffer; char *psz_cwd, *psz_file = NULL; int i_ret;#ifdef WIN32 sep = '\\';#else sep = '/';#endif /* Create environment for the CGI */ TAB_APPEND( i_env, ppsz_env, strdup("GATEWAY_INTERFACE=CGI/1.1") ); TAB_APPEND( i_env, ppsz_env, strdup("SERVER_PROTOCOL=HTTP/1.1") ); TAB_APPEND( i_env, ppsz_env, strdup("SERVER_SOFTWARE=" COPYRIGHT_MESSAGE) ); switch( i_type ) { case HTTPD_MSG_GET: TAB_APPEND( i_env, ppsz_env, strdup("REQUEST_METHOD=GET") ); break; case HTTPD_MSG_POST: TAB_APPEND( i_env, ppsz_env, strdup("REQUEST_METHOD=POST") ); break; case HTTPD_MSG_HEAD: TAB_APPEND( i_env, ppsz_env, strdup("REQUEST_METHOD=HEAD") ); break; default: break; } if( i_request ) { psz_tmp = malloc( sizeof("QUERY_STRING=") + i_request ); sprintf( psz_tmp, "QUERY_STRING=%s", p_request ); TAB_APPEND( i_env, ppsz_env, psz_tmp ); psz_tmp = malloc( sizeof("REQUEST_URI=?") + strlen(p_url) + i_request ); sprintf( psz_tmp, "REQUEST_URI=%s?%s", p_url, p_request ); TAB_APPEND( i_env, ppsz_env, psz_tmp ); } else { psz_tmp = malloc( sizeof("REQUEST_URI=") + strlen(p_url) ); sprintf( psz_tmp, "REQUEST_URI=%s", p_url ); TAB_APPEND( i_env, ppsz_env, psz_tmp ); } psz_tmp = malloc( sizeof("SCRIPT_NAME=") + strlen(p_url) ); sprintf( psz_tmp, "SCRIPT_NAME=%s", p_url ); TAB_APPEND( i_env, ppsz_env, psz_tmp );#define p_sys p_args->file.p_intf->p_sys psz_tmp = malloc( sizeof("SERVER_NAME=") + strlen(p_sys->psz_address) ); sprintf( psz_tmp, "SERVER_NAME=%s", p_sys->psz_address ); TAB_APPEND( i_env, ppsz_env, psz_tmp ); psz_tmp = malloc( sizeof("SERVER_PORT=") + 5 ); sprintf( psz_tmp, "SERVER_PORT=%u", p_sys->i_port ); TAB_APPEND( i_env, ppsz_env, psz_tmp );#undef p_sys p = getenv( "PATH" ); if( p != NULL ) { psz_tmp = malloc( sizeof("PATH=") + strlen(p) ); sprintf( psz_tmp, "PATH=%s", p ); TAB_APPEND( i_env, ppsz_env, psz_tmp ); }#ifdef WIN32 p = getenv( "windir" ); if( p != NULL ) { psz_tmp = malloc( sizeof("SYSTEMROOT=") + strlen(p) ); sprintf( psz_tmp, "SYSTEMROOT=%s", p ); TAB_APPEND( i_env, ppsz_env, psz_tmp ); }#endif if( psz_remote_addr != NULL && *psz_remote_addr ) { psz_tmp = malloc( sizeof("REMOTE_ADDR=") + strlen(psz_remote_addr) ); sprintf( psz_tmp, "REMOTE_ADDR=%s", psz_remote_addr ); TAB_APPEND( i_env, ppsz_env, psz_tmp ); } if( psz_remote_host != NULL && *psz_remote_host ) { psz_tmp = malloc( sizeof("REMOTE_HOST=") + strlen(psz_remote_host) ); sprintf( psz_tmp, "REMOTE_HOST=%s", psz_remote_host ); TAB_APPEND( i_env, ppsz_env, psz_tmp ); } if( i_in ) { p = p_in; for ( ; ; ) { if( !strncasecmp( p, "Content-Type: ", strlen("Content-Type: ") ) ) { char *end = strchr( p, '\r' ); if( end == NULL ) break; *end = '\0'; psz_tmp = malloc( sizeof("CONTENT_TYPE=") + strlen(p) ); sprintf( psz_tmp, "CONTENT_TYPE=%s", p ); TAB_APPEND( i_env, ppsz_env, psz_tmp ); *end = '\r'; } if( !strncasecmp( p, "Content-Length: ", strlen("Content-Length: ") ) ) { char *end = strchr( p, '\r' ); if( end == NULL ) break; *end = '\0'; psz_tmp = malloc( sizeof("CONTENT_LENGTH=") + strlen(p) ); sprintf( psz_tmp, "CONTENT_LENGTH=%s", p ); TAB_APPEND( i_env, ppsz_env, psz_tmp ); *end = '\r'; } p = strchr( p, '\n' ); if( p == NULL || p[1] == '\r' ) { p = NULL; break; } p++; } } psz_file = strrchr( p_args->file.file, sep ); if( psz_file != NULL ) { psz_file++; psz_tmp = malloc( sizeof("SCRIPT_FILENAME=") + strlen(psz_file) ); sprintf( psz_tmp, "SCRIPT_FILENAME=%s", psz_file ); TAB_APPEND( i_env, ppsz_env, psz_tmp ); TAB_APPEND( p_args->p_association->i_argc, p_args->p_association->ppsz_argv, psz_file ); } TAB_APPEND( i_env, ppsz_env, NULL ); TAB_APPEND( p_args->p_association->i_argc, p_args->p_association->ppsz_argv, NULL ); psz_tmp = strdup( p_args->file.file ); p = strrchr( psz_tmp, sep ); if( p != NULL ) { *p = '\0'; psz_cwd = psz_tmp; } else { free( psz_tmp ); psz_cwd = NULL; } i_ret = vlc_execve( p_args->file.p_intf, p_args->p_association->i_argc, p_args->p_association->ppsz_argv, ppsz_env, psz_cwd, (char *)p_in, i_in, &p_buffer, &i_buffer ); TAB_REMOVE( p_args->p_association->i_argc, p_args->p_association->ppsz_argv, NULL ); TAB_REMOVE( p_args->p_association->i_argc, p_args->p_association->ppsz_argv, psz_file ); if( psz_cwd != NULL ) free( psz_cwd ); while( i_env ) TAB_REMOVE( i_env, ppsz_env, ppsz_env[0] ); if( i_ret == -1 ) { Callback404( (httpd_file_sys_t *)p_args, pp_data, pi_data ); return VLC_SUCCESS; } p = p_buffer; while( strncasecmp( p, "Content-Type: text/html", strlen("Content-Type: text/html") ) ) { p = strchr( p, '\n' ); if( p == NULL || p[1] == '\r' ) { p = NULL; break; } p++; } if( p == NULL ) { *pp_data = p_buffer; *pi_data = i_buffer; } else { ParseExecute( (httpd_file_sys_t *)p_args, p_buffer, i_buffer, p_request, pp_data, pi_data ); free( p_buffer ); } return VLC_SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -