📄 http.c
字号:
mvar_AppendNewVar( p_args->vars, "url_value", p_request ); mvar_AppendNewVar( p_args->vars, "version", VLC_Version() ); mvar_AppendNewVar( p_args->vars, "copyright", COPYRIGHT_MESSAGE ); mvar_AppendNewVar( p_args->vars, "vlc_compile_by", VLC_CompileBy() ); mvar_AppendNewVar( p_args->vars, "vlc_compile_host", VLC_CompileHost() ); mvar_AppendNewVar( p_args->vars, "vlc_compile_domain", VLC_CompileDomain() ); mvar_AppendNewVar( p_args->vars, "vlc_compiler", VLC_Compiler() ); mvar_AppendNewVar( p_args->vars, "vlc_changeset", VLC_Changeset() ); mvar_AppendNewVar( p_args->vars, "stream_position", position ); mvar_AppendNewVar( p_args->vars, "stream_time", time ); mvar_AppendNewVar( p_args->vars, "stream_length", length ); mvar_AppendNewVar( p_args->vars, "volume", volume ); mvar_AppendNewVar( p_args->vars, "stream_state", state ); mvar_AppendNewVar( p_args->vars, "charset", "UTF-8" ); /* Stats */ if( p_sys->p_input ) { /* FIXME: Workarround a stupid assert in input_GetItem */ input_item_t *p_item = p_sys->p_input && p_sys->p_input->p ? input_GetItem( p_sys->p_input ) : NULL; if( p_item ) { vlc_mutex_lock( &p_item->p_stats->lock );#define STATS_INT( n ) sprintf( stats, "%d", p_item->p_stats->i_ ## n ); \ mvar_AppendNewVar( p_args->vars, #n, stats );#define STATS_FLOAT( n ) sprintf( stats, "%f", p_item->p_stats->f_ ## n ); \ 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 ); } } SSInit( &p_args->stack ); /* allocate output */ *pi_data = i_buffer + 1000; dst = *pp_data = malloc( *pi_data ); /* we parse executing all <vlc /> macros */ 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; if( p_sys->p_input != NULL ) { vlc_object_release( p_sys->p_input ); p_sys->p_input = NULL; } SSClean( &p_args->stack ); mvar_Delete( p_args->vars );}int HttpCallback( httpd_file_sys_t *p_args, httpd_file_t *p_file, uint8_t *_p_request, uint8_t **_pp_data, int *pi_data ){ VLC_UNUSED(p_file); char *p_request = (char *)_p_request; char **pp_data = (char **)_pp_data; FILE *f; if( ( f = utf8_fopen( p_args->file, "r" ) ) == NULL ) { Callback404( p_args, pp_data, pi_data ); return VLC_SUCCESS; } if( !p_args->b_html ) { FileLoad( f, pp_data, pi_data ); } else { int i_buffer; char *p_buffer; /* first we load in a temporary buffer */ 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 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 ){ VLC_UNUSED(p_handler); VLC_UNUSED(_p_in); 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; size_t 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 ); 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;}int ArtCallback( 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 ){ VLC_UNUSED(p_handler); VLC_UNUSED(_p_url); VLC_UNUSED(i_type); VLC_UNUSED(p_in); VLC_UNUSED(i_in); VLC_UNUSED(psz_remote_addr); VLC_UNUSED(psz_remote_host); char *psz_art = NULL; intf_thread_t *p_intf = p_args->file.p_intf; intf_sys_t *p_sys = p_intf->p_sys; char psz_id[16]; input_item_t *p_item = NULL; int i_id; psz_id[0] = '\0'; if( p_request ) ExtractURIValue( (char *)p_request, "id", psz_id, 15 ); i_id = atoi( psz_id ); if( i_id ) { playlist_item_t *p_pl_item = playlist_ItemGetById( p_sys->p_playlist, i_id, false ); if( p_pl_item ) p_item = p_pl_item->p_input; } else { /* FIXME: Workarround a stupid assert in input_GetItem */ if( p_sys->p_input && p_sys->p_input->p ) p_item = input_GetItem( p_sys->p_input ); } if( p_item ) { psz_art = input_item_GetArtURL( p_item ); } if( psz_art && !strncmp( psz_art, "file://", strlen( "file://" ) ) ) { FILE *f; char *psz_ext; char *psz_header; char *p_data = NULL; int i_header_size, i_data; if( ( f = utf8_fopen( psz_art + strlen( "file://" ), "r" ) ) == NULL ) { msg_Dbg( p_intf, "Couldn't open album art file %s", psz_art + strlen( "file://" ) ); Callback404( &p_args->file, (char**)pp_data, pi_data ); free( psz_art ); return VLC_SUCCESS; } FileLoad( f, &p_data, &i_data ); fclose( f ); psz_ext = strrchr( psz_art, '.' ); if( psz_ext ) psz_ext++;#define HEADER "Content-Type: image/%s\n" \ "Content-Length: %d\n" \ "\n" i_header_size = asprintf( &psz_header, HEADER, psz_ext, i_data );#undef HEADER *pi_data = i_header_size + i_data; *pp_data = (uint8_t*)malloc( *pi_data ); memcpy( *pp_data, psz_header, i_header_size ); memcpy( *pp_data+i_header_size, p_data, i_data ); free( psz_header ); free( p_data ); } else { msg_Dbg( p_intf, "No album art found" ); Callback404( &p_args->file, (char**)pp_data, pi_data ); } free( psz_art ); return VLC_SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -