2008-10-01 4 views
0

Je débogue du code dans le serveur proxy Selenium-rc. Il semble que le coupable est l'objet HttpURLConnection, dont l'interface pour obtenir les en-têtes HTTP ne traite pas avec des noms d'en-tête en double, tels que:Java HttpURLConnection: Peut-il gérer les noms d'en-tête dupliqués?

 
Set-Cookie: foo=foo; Path=/ 
Set-Cookie: bar=bar; Path=/ 

La façon d'obtenir les en-têtes à travers le HttpURLConnection (en utilisant getHeaderField (int n) et getHeaderFieldKey (int n)) semblent provoquer la perte de mon second cookie. Ma question est

  1. Est-il vrai que HttpURLConnection lui-même ne peut pas y faire face, et
  2. Si oui, est-il une solution à cela?

Répondre

0

Sans réellement l'avoir essayé (je ne me souviens pas d'avoir traité ce sujet moi-même), il y a aussi getHeaderFields, hérité de UrlConnection. Est-ce que cela fait ce dont vous avez besoin?

+0

Non, cette méthode renvoie une carte, qui n'aura certainement pas de noms d'en-tête dupliqués. – airportyh

+0

... mais il retourne une carte avec des valeurs List, pas seulement des chaînes ... –

1

Ma solution de contournement recommandée consiste à ne pas utiliser du tout HttpUtilConnection, ce qui est grossier et non intuitif, mais utilisez plutôt commons-httpclient.

http://hc.apache.org/httpclient-3.x/

0

Ok, j'ai trouvé le problème et la réponse à la question initiale. Fondamentalement, l'implémentation de Cookie que j'ai utilisée (Cookie Lib par défaut de python) a utilisé \ r \ n pour délimiter les différents en-têtes Set-Cookie (comme supposé \ n), cela a perturbé HttpUrlConnection et l'a fait s'arrêter à la première occurrence de ce délimiteur (Je vais deviner qu'il s'arrête à la première ligne vide). Donc, la réponse à la première question est: Oui, il peut gérer les noms d'en-tête en double, mais il est bogué d'une autre manière. Actuellement, la réparation de la bibliothèque python est une solution de contournement, mais cela ne fonctionnera pas à long terme car nous ne possédons pas cette bibliothèque. Je suis sûr que l'utilisation de la bibliothèque httpclient est une bonne façon de procéder, mais j'espère une solution qui nécessite moins de travail. Donc je ne sais pas exactement quoi faire là-bas.

+0

Sauf si vous avez des références à HttpUtilConnection dispersées dans votre base de code, je pense honnêtement que passer à commons-httpclient sera moins de travail que de fixer HttpUtlConnection. – skaffman

+0

Corrigez-moi si je me trompe, mais CRLF (\ r \ n) est le bon délimiteur pour délimiter un en-tête HTTP du suivant selon les RFC HTTP. – Alexander

Questions connexes