IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Serveurs (Apache, IIS,...) Discussion :

Upload de fichier par HTTP


Sujet :

Serveurs (Apache, IIS,...)

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Juillet 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2007
    Messages : 113
    Par défaut Upload de fichier par HTTP
    Bonjour et merci d'avance pour les éclaircissement que vous voudrez bien m'apporter.

    Je vous expose mon pb : J'ai un cgi qui réceptionne un POST d'un formulaire comprenant un input de type file (upload de fichier).
    Je n'arrive pas à interrompre l'envoi d'un fichier de taille volumineuse :
    - soit je bloque la requête au niveau de mon cgi
    - soit je bloque au niveau de mon serveur web (LimitRequestBody sous apache)

    Dans les deux cas, si la personne qui répond à mon formulaire essaye d'uploader un fichier de 2Go soit il va recevoir une erreur de type timeOut soit une erreur 413 requête trop grande et dans les deux cas cela sera après un temps d'attente qui peut être très long (le temps que le navigateur upload le fichier de 2Go?...).

    D'où ma question : est-il possible d'interrompre la requête depuis le serveur avant que le client ait commencé à uploader le fichier?

    J'ai fait des captures de communication réseau entre mon client et mon serveur et je ne vois passé ma requête POST HTTP depuis le client vers le serveur qu'une fois que le fichier joint a été transférer au serveur par une succession de trames TCP. -> le serveur web doit donc recevoir ces premières trames et les garder en cache le temps que la requête soit complète. Cela me semble étonnant car il semble alors que le DDOS est à portée de main. par exemple si j'essaye de mettre en avatar de mon profil sur développez.com un fichier de 2Go, mon navigateur mouline et je suppose que si on est une dizaine de personne qui essayent de faire ça en même temps le serveur risque rapidement de ne plus répondre à personne...

  2. #2
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    Citation Envoyé par tenpigs Voir le message
    J'ai fait des captures de communication réseau entre mon client et mon serveur et je ne vois passé ma requête POST HTTP depuis le client vers le serveur qu'une fois que le fichier joint a été transférer au serveur par une succession de trames TCP....
    Pas possible. Avec quel outil as-tu fait tes captures ? HTTP est un protocole strict dans lequel le client envoie les en-têtes avant les données. Dans cette requête, ce qu'il faut voir c'est si un Content-Length est envoyé dans les en-têtes. Avec cette info, le serveur doit pouvoir interrompre l'upload avant que le fichier ne soit envoyé, mais dans le cas où cet en-tête est absent, on ne peut rien faire : il faut attendre que le serveur ait reçu les données pour qu'il soit en mesure de vérifier la taille de la requête. Si tu te retrouves dans le dernier cas, le comportement observé est parfaitement normal et ne peut malheureusement pas être modifié.

  3. #3
    Membre éprouvé
    Inscrit en
    Juillet 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2007
    Messages : 113
    Par défaut
    effectivement ça semble logique d'envoyer les entêtes avant les données ^^
    J'ai fait mes captures avec Wireshark mais je n'avais pas regardé au bon endroit.
    Wireshark mentionne l'appel en tant que http qu'une fois que toutes les données de la requête ont été envoyées.

    Donc effectivement le client envoi bien les en-têtes en premier, à ce moment mon apache répond par une erreur 513 si le fichier est trop gros, le souci est du coup côté client qui continue de faire son upload et ne prend pas en compte la réponse qu'il vient de recevoir... ça serait ie qui ne gèrerait pas l'interruption par le serveur au cours de son envoi, je vais tester avec d'autres navigateurs pour voir ce qu'il en est.

    en tout cas merci _Mac_ pour ton aide.

  4. #4
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    Citation Envoyé par tenpigs Voir le message
    Wireshark mentionne l'appel en tant que http qu'une fois que toutes les données de la requête ont été envoyées.
    Oui, je ne sais pas pourquoi. Sûrement qu'il a besoin de toute la trace pour savoir. C'est surprenant car il me semble que son filtre HTTP s'appuie uniquement sur le numéro de port

    Citation Envoyé par tenpigs Voir le message
    Donc effectivement le client envoi bien les en-têtes en premier, à ce moment mon apache répond par une erreur 513 si le fichier est trop gros, le souci est du coup côté client qui continue de faire son upload et ne prend pas en compte la réponse qu'il vient de recevoir...
    Tu veux dire que dans ce cas-là, Apache n'envoie pas la séquence FIN-ACK pour terminer la connexion ? Si Apache fait du keep-alive, c'est possible, et dans ce cas ça pourrait bien venir du navigateur. Si c'est possible, essaie de désactiver le keep-alive dans Apache et vois si le comportement reste le même.

  5. #5
    Membre éprouvé
    Inscrit en
    Juillet 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2007
    Messages : 113
    Par défaut
    Le filtre http doit être un peu plus complexe que "prendre ce qui passe sur le port 80", tout ce qui est ack, segments de PDU sont marqués TCP alors qu'ils passent sur le port http (80).

    J'ai désactivé le keep-alive sur mon apache, ça n'a aucun effet. Dans les deux cas apache renvoi bien un FIN-ACK. Après quelques tests firefox 3, ie 6 et 7 n'ont pas l'air de gérer cette interruption (ils continuent de mouliner pour envoyer leur fichier). Seul opera 9 et 10 s'interrompent tout de suite pour afficher l'erreur 413 qu'ils reçoivent.

  6. #6
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    Bon, ben, je crois qu'on a une réponse malheureusement non satisfaisante

    Que fait le serveur après qu'il a envoyé le FIN-ACK ? Il continue d'accuser réception des paquets inutiles que lui envoie le navigateur ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Upload] Upload de fichier par formulaire
    Par discogarden dans le forum Langage
    Réponses: 4
    Dernier message: 31/03/2006, 19h17
  2. [Upload] upload de fichier par ftp
    Par sami_c dans le forum Langage
    Réponses: 3
    Dernier message: 22/03/2006, 11h18
  3. Téléchargement de fichiers par HTTP / FTP
    Par Gladiator dans le forum Serveurs (Apache, IIS,...)
    Réponses: 2
    Dernier message: 07/12/2005, 11h28
  4. Upload de fichier par XMLHTTP
    Par Immobilis dans le forum ASP
    Réponses: 6
    Dernier message: 21/01/2005, 17h02
  5. [HTTP] Envoi de fichiers par http
    Par Delendial dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 03/09/2004, 09h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo