Question

Nous construisons un cadre de test d'intégration complète en C # pour notre application qui existe au-dessus de HTTP en utilisant IIS7 pour héberger nos applications.

Dans le cadre de nos tests d'intégration que nous voulons tester les requêtes entrantes qui se traduira par EndOfStreamExceptions ( « Impossible de lire au-delà de la fin du flux ») qui se produisent lorsqu'un client envoie un en-tête HTTP indiquant une taille de corps plus grand qu'il transmet effectivement en tant que partie du corps. Nous voulons tester notre code de récupération d'erreur pour cette condition que nous devons simuler ce genre de demandes.

Je cherche une bibliothèque socket à base Fx .NET ou le remplacement HttpWebRequest personnalisé qui permet spécifiquement aux développeurs de simuler ces conditions d'ajouter à notre suite de tests d'intégration. Est-ce que quelqu'un sait de telles bibliothèques? Une solution scriptable fonctionnerait aussi bien.

Était-ce utile?

La solution

Définissez la propriété ContentLength avant d'appeler GetRequestStream (ou BeginGetRequestStream), puis d'écrire moins d'octets à ce flux. ContentLength va jeter si vous essayez de le régler une fois que vous avez obtenu le flux de demande. Si vous ne définissez pas ContentLength, HttpWebRequest en mémoire tampon les en-têtes jusqu'à ce que le flux est fermé afin qu'il puisse mettre ContentLength appropriée (alternativement, vous pouvez utiliser SendChunked mais cela ne fonctionnera pas pour vous ici). Si vous voulez un maximum de contrôle sur cela, créez une demande malormed ou deux à la main puis ouvrez un socket au port 80 sur le serveur et écrire la demande au flux TCP et puis lisez la réponse et vérifiez la connexion pour voir si elle a été fermée .

CEPENDANT: Je ne pense pas que ce test est une bonne idée. Voici le problème:

Le client envoie une requête au serveur. Il affirme que le contenu sera de 100 octets. Il envoie ensuite 90 octets et puis juste cesse d'envoyer, en laissant la connexion ouverte. Le serveur lit 90 octets, puis attend le reste puisque le client a indiqué que seraient envoyés 100 octets. Maintenant, le client envoie une deuxième demande. Qu'est-ce que le serveur faire avec les 10 premiers octets de la nouvelle demande?

La réponse est que le serveur suppose que ces octets faisaient partie de la demande précédente et les traiter comme tels, puis commencer à lire les « nouveaux » demande 10 octets après son début, ce qui entraînera évidemment des en-têtes difformes. Le serveur ne sera pas comme ça, il va envoyer une erreur 4xx et il fermera la connexion. La raison pour laquelle il ferme la connexion est parce qu'il a maintenant aucun moyen de savoir ce que les données envoyées à cela signifie et aucun moyen de récupérer. En outre, la fermeture de la connexion ne sera pas gracieuse, ce sera soudain et l'HttpWebRequest à l'autre extrémité qui soumet une deuxième requête (ou un troisième ou quatrième si elles sont mises en attente) déclenchera une WebException disant que la connexion sous-jacente a été fermée et vous laisse deviner pourquoi.

Ce même comportement est ce qui provoque la connexion à fermer à l'entête Expect 100-continue et le serveur retourne un 100-continue suivie d'une telle que lorsque 4xx Auth est nécessaire. Même si elle est rejeté la demande, il DOIT supposer encore que les octets suivants font partie de la même demande puisqu'elle est engagée à recevoir ces octets en envoyant le 100-continue. Si ce ne sera pas le service de cette demande ou si le client veut annuler la demande et soumettre une nouvelle (probablement avec des informations d'identification auth), il doit fermer la connexion et d'ouvrir un nouveau.

Enfin, pour tester un EndOfStreamException à partir d'un flux de réseau utilisant le protocole TCP ne fait pas de sens pour moi du tout. TCP ne marque pas la « fin » d'un flux, il ne cesse d'envoyer des données comme il est écrit à la prise. Il n'y a pas « EOF » pour elle et aucun moyen de détecter si les données ont été transmises tout sauf si vous savez comment les données beaucoup à attendre. TCP n'a pas vraiment une « fin » à son flux, sauf si la connexion est fermée, dans ce cas, vous aurez un WebException ou SocketException selon l'endroit où la pile vous travaillez. Toute erreur de transmission dans le protocole sont traitées dans winsock. Si plus les données sont envoyées, l'une des extrémités de la connexion finira par envoyer un keepalive à l'autre pour faire en sorte que la connexion est toujours en fait ouvert et un hôte n'a pas seulement laisser tomber. Si les temps keepalive, la connexion est sera fermée et vous pouvez obtenir un WebException la prochaine fois que vous essayez de lire. Étant donné la façon dont tout cela fonctionne, je ne vois pas comment vous allez obtenir une valeur de ce test. Vous êtes beaucoup mieux juste envoyer des requêtes malformées et veiller à ce que les erreurs sont traitées en conséquence et le message 4xx approprié est envoyée au client et la connexion est fermée correctement.

Autres conseils

Je ne sais pas d'une telle bibliothèque, mais il me semble que ce serait très simple sur le côté de la réception, si c'est là que vous codez.

Il suffit de récupérer l'ensemble WebRequest, tronquer autant ou aussi peu que vous voulez, puis les réexpédier. Vous devrez peut-être faire une nouvelle copie du WebRequest dans le processus, plutôt que de tronquer en place, mais il devrait encore être simple.

Ne pouvez-vous mettre juste la propriété HttpWebRequest.ContentLength sur les clients à une valeur inférieure ou supérieure à la taille réelle des données?

Si vous souhaitez simuler des choses comme ça, où vous violez le protocole HTTP, vous devrez écrire votre propre code pour le faire. HttpWebRequest ne vous permet pas de faire des choses comme ça.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top