Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

charset headers http != charset html

2 réponses
Avatar
wmn
bonjour,

ci-dessous le code que j'utilise pour rapatrier le contenu html d'une url.

il y a un problème, lorsque le charset annoncé dans les headers http
n'est pas le même que celui annoncé dans le code html de la page.
jusqu'à présent quand je constate une différence je download à nouveau
la page, car je n'arrive pas à lire 2 fois (ce qui est conforme à la
doc) le StreamReader récupéré via le res.GetResponseStream().
je cherche donc une solution qui m'évite de re-downloader la page.

avez vous une solution ? (car il doit forcément y en avoir une !!!;)

wmn.


-----------------------------------------------
Uri url = new Uri("http://www....");

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url
.AbsoluteUri);
HttpWebResponse res = (HttpWebResponse)req.GetResponse();

string html = new StreamReader(res.GetResponseStream(),
Encoding.GetEncoding(res.CharacterSet), false).ReadToEnd();

// getHtmlCharset return le charset du code html
string charset = getHtmlCharset(html);
if (charset != res.CharacterSet.ToLower())
html = new StreamReader(res.GetResponseStream(),
Encoding.GetEncoding(charset), false).ReadToEnd();

... reste du traitement
-----------------------------------------------

2 réponses

Avatar
Simon Mourier [SoftFluent]
Il faut conserver le retour du serveur sous forme d'un MemoryStream, plutôt
que sous la forme d'une chaîne de caractère.
Notez au passage que le code ReadToEnd() ne fonctionnera pas bien si le
réseau est lent. Il faut absolument faire une boucle jusqu'à ce que le
stream ne renvoie plus rien.

Uri url = new Uri("http://www.microsoft.com");

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
HttpWebResponse res = (HttpWebResponse)req.GetResponse();

Stream inputStream = res.GetResponseStream();

MemoryStream outputStream = new MemoryStream();
byte[] buffer = new byte[1024]; // par exemple
int read;
do
{
read = inputStream.Read(buffer, 0, buffer.Length);
if (read > 0)
{
outputStream.Write(buffer, 0, read);
}
}
while(read > 0);

Encoding encoding = (((res.CharacterSet == null) ||
(res.CharacterSet.Length ==
0))?Encoding.Default:Encoding.GetEncoding(res.CharacterSet));

string html = encoding.GetString(outputStream.GetBuffer(), 0,
(int)outputStream.Length);
string charset = getHtmlCharset(html);
if (string.Compare(charset, res.CharacterSet, true) != 0)
{
encoding = Encoding.GetEncoding(charset);
html = encoding.GetString(outputStream.GetBuffer(), 0,
(int)outputStream.Length);
}
outputStream.Close();

Si vous pouviez d'ailleurs transformer votre fonction getHtmlCharset pour
qu'elle prenne un tableau d'octets (comme Encoding.GetString) à la place
d'une chaîne vous gagneriez en mémoire et performance en évitant une
conversion, mais c'est optionnel :-)
Simon.
www.softfluent.com


"wmn" a écrit dans le message de news:
45755c0e$0$21150$
bonjour,

ci-dessous le code que j'utilise pour rapatrier le contenu html d'une url.

il y a un problème, lorsque le charset annoncé dans les headers http n'est
pas le même que celui annoncé dans le code html de la page.
jusqu'à présent quand je constate une différence je download à nouveau la
page, car je n'arrive pas à lire 2 fois (ce qui est conforme à la doc) le
StreamReader récupéré via le res.GetResponseStream().
je cherche donc une solution qui m'évite de re-downloader la page.

avez vous une solution ? (car il doit forcément y en avoir une !!!;)

wmn.


-----------------------------------------------
Uri url = new Uri("http://www....");

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url
.AbsoluteUri);
HttpWebResponse res = (HttpWebResponse)req.GetResponse();

string html = new StreamReader(res.GetResponseStream(),
Encoding.GetEncoding(res.CharacterSet), false).ReadToEnd();

// getHtmlCharset return le charset du code html
string charset = getHtmlCharset(html);
if (charset != res.CharacterSet.ToLower())
html = new StreamReader(res.GetResponseStream(),
Encoding.GetEncoding(charset), false).ReadToEnd();

... reste du traitement
-----------------------------------------------


Avatar
wmn
merci Simon, ça fonctionne très bien