CHtmlView & eigene HTTP-Header
-
Hi,
ich verwende CHtmlView zum "einbetten" des IE. Nun möchte ich einige eigene Header mitgeben.
Zu diesem Zwecke ändere ich in OnBeforeNavigate2 jeweils den Header, entferne die bestehenden
Umbrüche, füge meine Header dazu, cancele die Anfrage und starte meine eigene:void CMyApp::OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags, LPCTSTR lpszTargetFrameName, CByteArray& baPostedData, LPCTSTR lpszHeaders, BOOL* pbCancel) { CString strHeaders(lpszHeaders); if (strHeaders.Find("X-MyHeader:", 0) == -1) { // Eigenen Header zufügen: strHeaders.TrimRight(); strHeaders.AppendFormat("\nX-MyHeader: 1234\n"); // Flags anpassen, Request canceln: nFlags = navNoHistory | navNoReadFromCache | navNoWriteToCache; *pbCancel = TRUE; // Neu aufrufen Navigate2(lpszURL, nFlags, baPostedData, lpszTargetFrameName, strNewHeaders); } else { CHtmlView::OnBeforeNavigate2(lpszURL, nFlags, lpszTargetFrameName, baPostedData, lpszHeaders, pbCancel); } }Im Prinzip führt dies auch zu meinem gewünschten Ergebnis, aber die Header solcher Anfragen sind "kaputt".
Ich erhalte (z.B.) keinen HTTP_REFERER mehr. Dann weiter geschaut habe ich gesehen aus dem "\n" macht CHtmlView ein
\r\n, ausser in der letzten Zeile, daraus wird ein \r\r\n (es müsste aber ein \r\n\r\n werden).Kann jemand helfen, kennt jemand ein Stück Doku wie man die eigenen Header hinzufügt ?
Dank & Gruß,
S.
-
Hallo,
Dann weiter geschaut habe ich gesehen aus dem "\n" macht CHtmlView ein
\r\n, ausser in der letzten Zeile, daraus wird ein \r\r\n (es müsste aber ein \r\n\r\n werden).Ein "\n" ist immer nur ein Zeichen (das LF-Zeichen, um genauer zu sein), dass es Fälle gibt, in denen das "automatisch" in zwei Zeichen umgewandelt wird (in das hier notwendige CRLF, z.B. bei Schreiben von Textdateien auf Windows-Systemen mit den entsprechenden Funktionen) soll und darf man nicht als allgemein gültig betrachten. Hier muss man also explizit angeben, dass man CRLF haben will ("\r\n").
MfG,
Probe-Nutzer
-
Danke Probe-Nutzer, das war es nicht, Du kannst sicher sein, die Trivial-Ansätze hab ich alle abgegrast.
Es gibt auch keine mir bekannte Schnittstelle dem Control zu "sagen" was ich
gerne für Zeilenenden habe. Völlig automatisch erhalte ich im (On)BeforeNavigate2
vom Control \n ersetzt durch \r\n, aber - wie beschrieben - der letzte Eintrag
wid immer zu \r\r\n sobald ich die Header selbst setze.Kenn vielleicht jemand ein Beispiel für eigene Header? In der MSDN oder KB von MS
ist nichts zu finden, Codeproject und Codeguru auch nicht.Grüße,
S.
-
Xantomorph schrieb:
Völlig automatisch erhalte ich im (On)BeforeNavigate2
vom Control \n ersetzt durch \r\n, aber - wie beschrieben - der letzte Eintrag
wid immer zu \r\r\n sobald ich die Header selbst setze.Also ich kenne nur Beispielcodes, in denen für den Navigate-Aufruf beide Zeichen in die Header geschrieben werden, funktioniert das denn nicht auch, wenn man beide Zeichen, CR und LF, angibt?
Andere Dinge, die mir noch aufgefallen bzw. in den Sinn gekommen sind:
Ich bin nicht sicher, aber wenn es sich um POST-Daten handelt, dann sollte auch der Content-Type im Header gesetzt werden, z.B. bei Formular-Daten "application/x-www-form-urlencoded", das aber nur so nebenbei.
Dass einige Header nicht empfangen werden, könnte daran liegen, dass der übergebene Parameter lpszHeaders nur zum Hinzufügen eigener Header zur Verfügung gestellt wird, man kann also nicht feststellen, welche "eigenen" Header (und den Referer zähle ich dazu) der IE übermitteln wird, ich habe gelesen, dass lpszHeaders deshalb meistens leer ist (habe ich auch in meinen eigenen Browsererweiterungen festgestellt).
Da man nur eigene Header hinzufügen kann, sollte auch das erste "\n"-Zeichen vor dem Hinzufügen des ersten eigenen Headers entfernt werden, weil der IE das automatisch macht:
// nur ein Header wird hinzugefuegt, deshalb gleich der Abschluss mit dem doppelten CRLF, // eventuell reicht es fuer einen abschliessenden Header, // nur ein CRLF anzugeben, weil der IE das letzte CRLF automatisch anhaengt strHeaders.AppendFormat("X-MyHeader: 1234\r\n\r\n");MfG,
Probe-Nutzer
-
Noch eine Ergänzung zum Code-Kommentar:
Es könnte auch sein, dass man beim abschliessenden Header überhaupt kein CRLF benötigt, weil der IE vielleicht sogar das von selbst macht.
MfG,
Probe-Nutzer
-
Ja, stimmt IE macht das automatisch, Du musst aber irgendwie trennen wenn Dein Header mehrere Einträge haben soll - dann wird es "magisch".
\r\n führt auf jeden Fall als Trennzeichen nicht zum Erfolg, \n ist besser,
nur das das Endezeichen für die Header am Ende nicht stimmt (-> \r\r\n)Ich habe bislang auch noch nichts dazu gefunden, hast Du eine Idee?