

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Démo de téléchargement de CoreHTTP basic S3
<a name="core-http-s3-download-demo"></a>

**Important**  <a name="deprecation-message-demo"></a>
Cette démo est hébergée sur le référentiel Amazon-FreeRTOS qui est obsolète. Nous vous recommandons de [commencer ici](freertos-getting-started-modular.md) lorsque vous créez un nouveau projet. Si vous possédez déjà un projet FreeRTOS basé sur le référentiel Amazon-FreeRTOS, désormais obsolète, consultez le. [Guide de migration du référentiel Github d'Amazon-FreeRTOS](github-repo-migration.md)

## Introduction
<a name="core-http-s3-download-demo-intro"></a>

Cette démonstration montre comment utiliser les [requêtes de plage](https://tools.ietf.org/html/rfc7233) pour télécharger des fichiers depuis le serveur HTTP Amazon S3. Les requêtes Range sont prises en charge de manière native dans l'API CoreHTTP lorsque vous les utilisez `HTTPClient_AddRangeHeader` pour créer la requête HTTP. Pour un environnement de microcontrôleur, les demandes de plage sont vivement encouragées. En téléchargeant un fichier volumineux dans des plages séparées, au lieu d'une seule demande, chaque section du fichier peut être traitée sans bloquer le socket réseau. Les demandes de plage réduisent le risque de perte de paquets, qui nécessitent des retransmissions sur la connexion TCP, et réduisent ainsi la consommation d'énergie de l'appareil.

Cet exemple utilise une [interface de transport réseau](https://freertos.org/network-interface.html) qui utilise mbedTLS pour établir une connexion authentifiée mutuellement entre un client d'appareil IoT exécutant CoreHTTP et le serveur HTTP Amazon S3.

**Note**  
Pour configurer et exécuter les démos de FreeRTOS, suivez les étapes décrites dans. [Commencez avec FreeRTOS](freertos-getting-started.md)

### À filetage unique ou à filetage multiple
<a name="core-http-s3-download-demo-threads"></a>

Il existe deux modèles d'utilisation de CoreHTTP, *monothread et multithread* *(multitâche*). Bien que la démonstration présentée dans cette section exécute la bibliothèque HTTP dans un thread, elle montre en fait comment utiliser CoreHTTP dans un environnement à thread unique (une seule tâche utilise l'API HTTP dans la démo). Bien que les applications à thread unique doivent appeler à plusieurs reprises la bibliothèque HTTP, les applications multithread peuvent à la place envoyer des requêtes HTTP en arrière-plan dans le cadre d'une tâche d'agent (ou de démon).

## Organisation du code source
<a name="core-http-s3-download-demo-source-code"></a>

Le projet de démonstration porte un nom `http_demo_s3_download.c` et se trouve dans le `freertos/demos/coreHTTP/` répertoire et sur le [ GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c)site Web. 

## Configuration de la connexion au serveur HTTP Amazon S3
<a name="core-http-s3-download-demo-configure-server"></a>

Cette démonstration utilise une URL pré-signée pour se connecter au serveur HTTP Amazon S3 et autoriser l'accès à l'objet à télécharger. La connexion TLS du serveur HTTP Amazon S3 utilise uniquement l'authentification du serveur. Au niveau de l'application, l'accès à l'objet est authentifié à l'aide de paramètres dans la requête d'URL pré-signée. Suivez les étapes ci-dessous pour configurer votre connexion à AWS.

1. Créez un AWS compte :

   1. Si ce n'est pas déjà fait, [créez et activez un AWS compte](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/).

   1. Les comptes et les autorisations sont définis à l'aide de Gestion des identités et des accès AWS (IAM). IAM vous permet de gérer les autorisations pour chaque utilisateur de votre compte. Par défaut, un utilisateur ne dispose d'aucune autorisation tant que le propriétaire root ne l'a pas accordée.

      1. Pour ajouter un utilisateur à votre AWS compte, consultez le [guide de l'utilisateur IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/).

      1. Autorisez votre AWS compte à accéder à FreeRTOS AWS IoT et en ajoutant les politiques suivantes :
         + Amazon S3 FullAccess

1. Créez un compartiment dans S3 en suivant les étapes [décrites dans Comment créer un compartiment S3 ?](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-bucket.html) dans le *guide de l'utilisateur de la console Amazon Simple Storage Service*.

1. Chargez un fichier sur S3 en suivant les étapes décrites dans [Comment télécharger des fichiers et des dossiers dans un compartiment S3 ?](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/upload-objects.html) .

1. Générez une URL pré-signée à l'aide du script situé à `FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/Common/presigned_url_generator/presigned_urls_gen.py` l'adresse. Pour les instructions d'utilisation, voir`FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/Common/presigned_url_generator/README.md`. 

## Fonctionnalité
<a name="core-http-s3-download-demo-functionality"></a>

La démo récupère d'abord la taille du fichier. Ensuite, il demande chaque plage d'octets de manière séquentielle, dans une boucle, avec des tailles de plage de`democonfigRANGE_REQUEST_LENGTH`.

Le code source de la démo se trouve sur le [GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c)site Web.

### Connexion au serveur HTTP Amazon S3
<a name="core-http-s3-download-demo-connecting"></a>

La fonction [ connectToServerWithBackoffRetries()](https://github.com/aws/amazon-freertos/blob/main/demos/common/http_demo_helpers/http_demo_utils.c#L131-L170) tente d'établir une connexion TCP avec le serveur HTTP. Si la connexion échoue, elle réessaie après un délai d'expiration. La valeur du délai d'attente augmentera de façon exponentielle jusqu'à ce que le nombre maximum de tentatives soit atteint ou que la valeur maximale du délai d'expiration soit atteinte. `connectToServerWithBackoffRetries()`renvoie un état d'échec si la connexion TCP au serveur ne peut pas être établie après le nombre de tentatives configuré. 

La fonction `prvConnectToServer()` montre comment établir une connexion au serveur HTTP Amazon S3 en utilisant uniquement l'authentification du serveur. [Il utilise l'interface de transport basée sur MbeDTLS qui est implémentée dans le fichier FreeRTOS- \$1mbedtls.c. Plus/Source/Application-Protocols/network\$1transport/freertos\$1plus\$1tcp/using\$1mbedtls/using](https://github.com/FreeRTOS/FreeRTOS/blob/202012.00/FreeRTOS-Plus/Source/Application-Protocols/network_transport/freertos_plus_tcp/using_mbedtls/using_mbedtls.c) 

Le code source de `prvConnectToServer()` se trouve sur [ GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c#L273-L333).

### Création d'une demande de plage
<a name="core-http-s3-download-demo-creating-range-request"></a>

La fonction API `HTTPClient_AddRangeHeader()` prend en charge la sérialisation d'une plage d'octets dans les en-têtes de requête HTTP pour former une demande de plage. Les demandes de plage sont utilisées dans cette démo pour récupérer la taille du fichier et pour demander chaque section du fichier.

La fonction `prvGetS3ObjectFileSize()` récupère la taille du fichier dans le compartiment S3. L'`Connection: keep-alive`en-tête est ajouté dans cette première demande à Amazon S3 afin de maintenir la connexion ouverte après l'envoi de la réponse. Le serveur HTTP S3 ne prend actuellement pas en charge les requêtes HEAD utilisant une URL pré-signée, c'est pourquoi le 0ème octet est demandé. La taille du fichier est indiquée dans le champ d'`Content-Range`en-tête de la réponse. Une `206 Partial Content` réponse est attendue du serveur ; tout autre code d'état de réponse reçu est une erreur.

Le code source de `prvGetS3ObjectFileSize()` se trouve sur [ GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c#L337-L502).

Après avoir récupéré la taille du fichier, cette démonstration crée une nouvelle demande de plage pour chaque plage d'octets du fichier à télécharger. Il utilise `HTTPClient_AddRangeHeader()` pour chaque section du fichier. 

### Envoi de demandes de portée et réception de réponses
<a name="core-http-s3-download-demo-send-request"></a>

La fonction `prvDownloadS3ObjectFile()` envoie les demandes de plage en boucle jusqu'à ce que le fichier entier soit téléchargé. La fonction API `HTTPClient_Send()` envoie une demande et reçoit la réponse de manière synchrone. Lorsque la fonction revient, la réponse est reçue dans un fichier`xResponse`. Le code d'état est ensuite vérifié `206 Partial Content` et le nombre d'octets téléchargés jusqu'à présent est incrémenté par la valeur de l'`Content-Length`en-tête. 

Le code source de `prvDownloadS3ObjectFile()` se trouve sur [ GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreHTTP/http_demo_s3_download.c#L506-L651).