2015-11-20 1 views
2

Très similaire à ce question, j'essaie d'obtenir une valeur spécifique dans l'en-tête de réponse. Il fait référence à un pass-through solution utilisant des gestionnaires Asynchronous Pluggable Protocol (APP), cependant les liens sont morts puisque la solution est assez datée.En-tête de réponse HTTP de IWebBrowser2

Peut-être que j'aborde cela incorrectement.

Vue d'ensemble: J'étends une bibliothèque OAuth2 que je l'ai écrit en C++ (application de bureau), qui fonctionne bien pour les API Google, pour permettre maintenant des négociations avec Microsoft. Comme référencé sur this site (sous 'Demande de redirection après connexion réussie'), le code d'autorisation est renvoyé dans le champ Location de l'en-tête de réponse. En utilisant un débogueur HTTP, je peux voir la valeur qui a été envoyée (voir ci-dessous).

Lorsque vous tentez d'obtenir une interface IHTMLLocation de IHTMLDocument2, aucune des propriétés contiennent la valeur que je peux voir en utilisant le débogueur HTTP, et ces appels réussir avec différentes valeurs, même si le champ « Emplacement » n'existe pas dans les en-têtes de réponse (Ce n'est clairement pas ce qui est nécessaire).

Ceci est le seul raccrochage. Tous les appels et demandes suivants, j'utilise les API WinHTTP et les en-têtes de réponse sont easily accessed. Cependant, cette étape est toujours là où l'utilisateur peut correctement authentifier et autoriser l'application dans un navigateur. J'apprécie votre temps et votre aide.

Mise à jour: La réponse ressemble à ce qui suit:

HTTP/1.1 302 Found 
Cache-Control: private 
Content-Type: text/html; charset=utf-8 
Content-Encoding: gzip 
Location: urn:ietf:wg:oauth:2.0:oob?code=[VALUE] 
+0

S'il existe un en-tête 'Location:', il devrait y avoir un code de réponse de redirection '301' ou' 302' qui sont souvent suivis automatiquement. Les nouveaux en-têtes de réponse n'auraient pas cet en-tête 'Location'. Serait-ce cela? – Kenney

+0

Oui, je vais mettre à jour la question. – Jeff

+1

'IHTMLDocument2' n'expose pas l'accès aux en-têtes HTTP. 'IHTMLLocation' représente l'URL finale qui est réellement chargée dans le document actuel, de sorte qu'il ne représentera jamais les URL intermédiaires fournies par les redirections HTTP menant à cette URL finale. Pour ce que vous essayez de faire, vous devrez probablement faire vos propres requêtes HTTP, telles que WinInet/WinHTTP ou toute autre bibliothèque HTTP, puis charger manuellement le code HTML résultant dans une instance WebBrowser si vous devez l'afficher sur le serveur. utilisateur. –

Répondre

0

Dans ce cas, obtenir l'en-tête de réponse n'est pas nécessaire. Le code d'autorisation est également transmis en tant que paramètre de requête à l'URL de redirection.

Mettre en œuvre DWebBrowserEvents2, et obtenir l'URL dans la fonction Invoke:

HRESULT __stdcall DWebBrowserEvents2::Invoke(_In_ DISPID dispIdMember, 
              _In_ REFIID riid, 
              _In_ LCID lcid, 
              _In_ WORD flags, 
              _In_ DISPPARAMS *pDispParams, 
              _Out_opt_ VARIANT *pVarResult, 
              _Out_opt_ EXCEPINFO *pExcepInfo, 
              _Out_opt_ UINT *puArgErr); 

Detect quand

// new document goes ReadyState_Complete 
dispIdMember == DISPID_DOCUMENTCOMPLETE [ 259 ] 

L'URL est une variante situé ici:

VARIANT *vurl = pDispParams->rgvarg[0].pvarVal; // <-- not bstrVal 

Convertir en Bstr , puis string:

BSTR url = (vurl->vt & VT_BYREF) ? *vurl->pbstrVal : vurl->bstrVal; 
std::wstring ws(url, SysStringLen(url)); 

// url will look similar to the following: 
// http://localhost/?code=[...]&session_state=[...]