Cómo usar FTP con un proxy basado en CERN con las API de WinInet

Importante

La aplicación de escritorio Internet Explorer 11 está retirada y sin soporte a partir del 15 de junio de 2022 para determinadas versiones de Windows 10.

Todavía puede acceder a sitios antiguos heredados que requieren Internet Explorer con el modo Internet Explorer en Microsoft Edge. Obtenga más información.

La aplicación de escritorio Internet Explorer 11 se redirigirá progresivamente al explorador Microsoft Edge, más rápido y seguro. En última instancia, se deshabilitará a través de Windows Update. Deshabilite IE hoy.

Un servidor proxy web basado en CERN usa HTTP para todas las comunicaciones con sus clientes. Por lo tanto, el conjunto FTP de funciones de Wininet no se puede usar para descargar recursos en un servidor FTP si se tiene acceso al servidor FTP a través de un proxy basado en CERN en nombre del cliente. En su lugar, el cliente debe usar funciones generales de Wininet, como y para recuperar correctamente los datos de la secuencia HTTP enviada desde el servidor proxy basado en InternetOpenUrl InternetReadFile CERN.

Versión del producto original:   Internet Explorer
Número KB original:   166961

Más información

Los servicios proxy compatibles con CERN admiten solicitudes HTTP (WWW), FTP y Gopher. Pero la comunicación entre el servidor proxy basado en CERN y sus clientes solo usa HTTP. En el siguiente diagrama se muestra cómo se reenvía una solicitud FTP mediante un servicio proxy compatible con CERN:

Get ftp://host.com/root/test.doc HTTP 1.0        FTP Request
   |=========|                 |=============|          |=============|
   |         |---------------->| Cern-based  |--------->|             |
   | Client  |    HTTP         | Proxy Server|   FTP    |  Ftp Server |
   |         |<----------------|             |<---------|             |
   |=========|                 |=============|          |=============|
         HTTP/1.0 200 <document>                  FTP Response

Dado que un servidor proxy basado en CERN se comunica con sus clientes en HTTP, no puede usar el conjunto FTP de funciones de Wininet si el cliente tiene acceso al servidor FTP a través del servidor proxy. En su lugar, debe usar InternetOpenUrl y recuperar los datos InternetReadFile solicitados de la secuencia HTTP enviada por el servidor proxy.

Si la dirección URL FTP pasada es una dirección URL a un archivo en el servidor FTP, puede InternetOpenUrl usar para leer todo el contenido del InternetReadFile archivo. Si la dirección URL FTP pasada es una dirección URL a un directorio en el servidor FTP, recupera una lista de directorios de la InternetOpenUrl dirección URL FTP como un documento InternetReadFile HTML. En ambos casos, es posible que tenga que hacer un bucle de llamadas hasta que se lean todos los datos de InternetReadFile la secuencia HTTP.

Si el cliente tiene la intención de recuperar algo más por debajo de la dirección URL del directorio FTP, debe analizar el documento HTML para obtener direcciones URL en subdirectorios o archivos y emitir más y InternetOpenUrl InternetReadFile llamadas. También cuando se usa un proxy basado en CERN, no se debe especificar la marca INTERNET_FLAG_RAW_DATA en la InternetOpenUrl llamada.

El siguiente pseudocódigo muestra cómo llamar y cuándo se usa un servidor proxy basado en InternetOpenUrl InternetReadFile CERN para tener acceso a un servidor FTP:

CHAR strURL[] = "ftp://host.com/root/test.doc";
HANDLE f; //local file handle
HINTERNET hInternetFile;
DWORD dwRead, dwWritten;
CHAR szTemp[1024];
hInternetFile = InternetOpenUrl(hInternetSession, (LPCTSTR)strURL, NULL,
                                0, INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE, 0);
if (hInternetFile == NULL)
{
    do
        some error processing;
    quit;
}
//download the file to c:\deleteme
f = CreateFile("c:\\deleteme", GENERIC_WRITE, 0, NULL,
               CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (f == INVALID_HANDLE_VALUE)
{
    do
        some error processing;
    quit;
}

while (InternetReadFile(hInternetFile, (LPVOID)szTemp, 1024, &dwRead))
{
    if (!dwRead)
        break;
    WriteFile(f, (LPVOID)szTemp, dwRead, &dwWritten, NULL);
}
CloseHandle(f);
//if the strURL is a URL to a file on the ftp server, we get the file
//and store it in c:\deleteme.
//if the strURL is a URL to a directory on the ftp server, c:\deleteme
//will be a HTML page of the directory listing. You will have to parse
//the html page, and construct new URLs, and call the above code again.

Cuando el cliente tiene conexión directa a un servidor FTP o está conectado al servidor FTP a través de un servidor proxy FTP de TIS, la comunicación desde y hacia el cliente se realiza en FTP. El cliente puede especificar la marca en y, a continuación, usar para obtener una estructura WIN32_FIND_DATA y enumerar todos los subdirectorios y INTERNET_FLAG_RAW_DATA archivos de la dirección InternetOpenUrl InternetFindNextFile URL. El cliente también puede usar el conjunto FTP de funciones de Wininet en estas situaciones.

El siguiente pseudocódigo muestra cómo llamar y cuándo se especifica la marca InternetOpenUrl InternetReadFile en la INTERNET_FLAG_RAW_DATA InternetOpenUrl llamada:

CHAR strURL[] = "ftp://host.com/root/test.doc";
HANDLE f; //local file handle
HINTERNET hInternetFile;
DWORD dwRead, dwWritten;
CHAR szTemp[1024];
hInternetFile = InternetOpenUrl(hInternetSession, (LPCTSTR)strURL, NULL,
                                0, INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE, 0);
if (hInternetFile == NULL)
{
    do
        some error processing;
    quit;
}
//download the file to c:\deleteme
f = CreateFile("c:\\deleteme", GENERIC_WRITE, 0, NULL,
               CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (f == INVALID_HANDLE_VALUE)
{
    do
        some error processing;
    quit;
}

while (InternetReadFile(hInternetFile, (LPVOID)szTemp, 1024, &dwRead))
{
    if (!dwRead)
        break;
    WriteFile(f, (LPVOID)szTemp, dwRead, &dwWritten, NULL);
}
CloseHandle(f);
//if the strURL is a URL to a file on the ftp server, we get the file
//and store it in c:\deleteme.
//if the strURL is a URL to a directory on the ftp server, c:\deleteme
//will be a HTML page of the directory listing. You will have to parse
//the html page, and construct new URLs, and call the above code again.

Cuando la conexión entre el cliente y el servidor FTP es directa o a través de un proxy FTP de TIS, y en realidad están generando tráfico FTP en lugar de InternetOpenUrl InternetReadFile tráfico HTTP.

La discusión anterior sobre el uso de API de Wininet con proxy basado en CERN también se aplica a GOPHER. También es importante tener en cuenta que las API de Wininet solo admiten direcciones URL HTTP, HTTPS, FTP y GOPHER. Para las direcciones URL de ARCHIVO como file://server/share/file o file:// \server\share\file, debe usar las API de Win32, como FileCopy para descargar el archivo en el equipo cliente, o FindFirstFile, FindNextFile y FindClose para enumerar \ un directorio.