Partager via


Comment utiliser FTP avec un proxy basé sur le CERN à l’aide des API WinInet

Avertissement

L’application de bureau Internet Explorer 11, mise hors service et dont le support a pris fin, a été désactivée définitivement via une mise à jour Microsoft Edge sur certaines versions de Windows 10. Pour plus d’informations, consultez le forum aux questions sur la mise hors service de l’application de bureau Internet Explorer 11.

Un serveur proxy web basé au CERN utilise HTTP pour toutes les communications avec ses clients. Par conséquent, l’ensemble FTP de fonctions Wininet ne peut pas être utilisé pour télécharger des ressources sur un serveur FTP si le serveur FTP est accessible via un proxy basé sur le CERN au nom du client. Au lieu de cela, le client doit utiliser des fonctions Wininet générales telles que InternetOpenUrl et InternetReadFile pour récupérer correctement les données à partir du flux HTTP envoyé à partir du serveur proxy basé sur le CERN.

Version du produit d’origine : Internet Explorer
Numéro de base de connaissances d’origine : 166961

Informations supplémentaires

Les services proxy compatibles avec LE CERN prennent en charge les requêtes HTTP (WWW), FTP et Gopher. Mais la communication entre le serveur proxy basé sur le CERN et ses clients utilise HTTP uniquement. Le diagramme suivant montre comment une requête FTP est transférée à l’aide d’un service proxy compatible AVEC LE 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

Étant donné qu’un serveur proxy basé sur le CERN communique avec ses clients dans HTTP, vous ne pouvez pas utiliser l’ensemble FTP des fonctions Wininet si le client accède au serveur FTP via le serveur proxy. Au lieu de cela, vous devez utiliser InternetOpenUrl et InternetReadFile récupérer les données demandées à partir du flux HTTP envoyé par le serveur proxy.

Si l’URL FTP transmise InternetOpenUrl est une URL vers un fichier sur le serveur FTP, vous pouvez utiliser InternetReadFile pour lire tout le contenu du fichier. Si l’URL FTP transmise InternetOpenUrl est une URL vers un répertoire sur le serveur FTP, InternetReadFile récupère une liste d’annuaires de l’URL FTP en tant que document HTML. Dans les deux cas, vous devrez peut-être effectuer une boucle appelant InternetReadFile jusqu’à ce que toutes les données du flux HTTP soient lues.

Si le client a l’intention de récupérer quelque chose de plus en dessous de l’URL du répertoire FTP, il doit analyser le document HTML pour obtenir des URL dans des sous-répertoires ou des fichiers et émettre plus InternetOpenUrl et InternetReadFile des appels. En outre, lorsqu’un proxy basé sur le CERN est utilisé, l’indicateur INTERNET_FLAG_RAW_DATA ne doit pas être spécifié dans l’appel InternetOpenUrl .

Le pseudo-code suivant montre comment appeler InternetOpenUrl et InternetReadFile quand un serveur proxy basé sur LE CERN est utilisé pour accéder à un serveur 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.

Lorsque le client dispose d’une connexion directe à un serveur FTP ou qu’il est connecté au serveur FTP via un serveur proxy FTP TIS, la communication vers et depuis le client se trouve dans FTP. Le client peut spécifier l’indicateur INTERNET_FLAG_RAW_DATA dans InternetOpenUrl et ensuite l’utiliser InternetFindNextFile pour obtenir une structure WIN32_FIND_DATA et énumérer tous les sous-répertoires et fichiers de l’URL. Le client peut également utiliser l’ensemble FTP de fonctions Wininet dans de telles situations.

Le pseudo-code suivant montre comment appeler InternetOpenUrl et InternetReadFile quand l’indicateur INTERNET_FLAG_RAW_DATA est spécifié dans l’appel InternetOpenUrl :

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.

Lorsque la connexion entre le client et le serveur FTP est directe ou via un proxy FTP TIS et InternetOpenUrlInternetReadFile génère en fait le trafic FTP plutôt que le trafic HTTP.

La discussion ci-dessus concernant l’utilisation des API Wininet avec le proxy basé sur le CERN s’applique également à GOPHER. Il est également important de noter que les API Wininet prennent uniquement en charge les URL HTTP, HTTPS, FTP et GOPHER. Pour les URL FILE telles que file://server/share/file ou file://\\server\share\file, vous devez utiliser des API Win32 telles que FileCopy pour télécharger le fichier sur l’ordinateur client, ou FindFirstFile, FindNextFile et FindClose pour énumérer un répertoire.