⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 http.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -