Condividi tramite


Come usare FTP con un proxy basato su CERN usando le API WinInet

Avviso

L'applicazione desktop Internet Explorer 11, ritirata e fuori supporto, è stata disabilitata in modo permanente tramite un aggiornamento di Microsoft Edge su alcune versioni di Windows 10. Per altre informazioni, vedere Domande frequenti sul ritiro delle app desktop di Internet Explorer 11.

Un server proxy Web basato su CERN usa HTTP per tutte le comunicazioni con i client. Pertanto, il set FTP di funzioni Wininet non può essere usato per scaricare le risorse in un server FTP se si accede al server FTP tramite un proxy basato su CERN per conto del client. Al contrario, il client deve usare funzioni Wininet generali, ad InternetOpenUrl esempio e InternetReadFile per recuperare correttamente i dati dal flusso HTTP inviato dal server proxy basato su CERN.

Versione originale del prodotto: Internet Explorer
Numero KB originale: 166961

Ulteriori informazioni

I servizi proxy compatibili con CERN supportano le richieste HTTP (WWW), FTP e Gopher. Tuttavia, la comunicazione tra il server proxy basato su CERN e i relativi client usa solo HTTP. Il diagramma seguente mostra come viene inoltrata una richiesta FTP usando un servizio proxy compatibile 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

Poiché un server proxy basato su CERN comunica con i client in HTTP, non è possibile usare il set FTP di funzioni Wininet se il client accede al server FTP tramite il server proxy. È invece consigliabile usare InternetOpenUrl e InternetReadFile per recuperare i dati richiesti dal flusso HTTP inviato dal server proxy.

Se l'URL FTP passato InternetOpenUrl è un URL di un file nel server FTP, è possibile usare InternetReadFile per leggere l'intero contenuto del file. Se l'URL FTP passato InternetOpenUrl è un URL di una directory nel server FTP, InternetReadFile recupera un elenco di directory dell'URL FTP come documento HTML. In entrambi i casi, potrebbe essere necessario eseguire un ciclo di chiamate InternetReadFile fino a quando non vengono letti tutti i dati nel flusso HTTP.

Se il client intende recuperare qualsiasi elemento più avanti sotto l'URL della directory FTP, deve analizzare il documento HTML per ottenere gli URL nelle sottodirectory o nei file ed eseguire altre InternetOpenUrl chiamate e InternetReadFile . Inoltre, quando viene usato un proxy basato su CERN, il INTERNET_FLAG_RAW_DATA flag non deve essere specificato nella InternetOpenUrl chiamata.

Lo pseudocode seguente illustra come chiamare InternetOpenUrl e InternetReadFile quando viene usato un server proxy basato su CERN per accedere a un server 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.

Quando il client ha una connessione diretta a un server FTP o è connesso al server FTP tramite un server proxy FTP TIS, la comunicazione da e verso il client si trova in FTP. Il client può specificare il INTERNET_FLAG_RAW_DATA flag in InternetOpenUrl e quindi usare InternetFindNextFile per ottenere una struttura WIN32_FIND_DATA ed enumerare tutte le sottodirectory e i file dell'URL. Il client può anche usare il set FTP di funzioni Wininet in tali situazioni.

Il seguente pseudocodice illustra come chiamare InternetOpenUrl e InternetReadFile quando viene specificato il flag INTERNET_FLAG_RAW_DATAInternetOpenUrl nella chiamata.

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.

Quando la connessione tra il client e il server FTP è diretta o tramite un proxy InternetOpenUrl FTP TIS e InternetReadFile genera effettivamente traffico FTP anziché traffico HTTP.

La discussione precedente sull'uso delle API Wininet con il proxy basato su CERN si applica anche a GOPHER. È anche importante notare che le API Wininet supportano solo URL HTTP, HTTPS, FTP e GOPHER. Per gli URL FILE, ad esempio file://server/share/file o file://\\server\share\file, è necessario usare API Win32 come FileCopy per scaricare il file nel computer client o FindFirstFile, FindNextFile e FindClose per enumerare una directory.