2015-11-20 4 views
2

Очень похоже на это question, я пытаюсь получить определенное значение в заголовке ответа. Он ссылается на pass-through solution с использованием обработчиков Asynchronous Pluggable Protocol (APP), однако ссылки мертвы, так как решение довольно устарело.Заголовок ответа HTTP от IWebBrowser2

Возможно, я приближаюсь к этому неправильно.

Обзор: Я расширяю библиотеку OAuth2, что я написал в C++ (настольное приложение), который хорошо работает для API, Google, чтобы в настоящее время позволяет переговоры с Microsoft. Как указано на this site (в разделе «Запрос на переадресацию после успешного входа '), код auth возвращается в поле Location заголовка ответа. Используя HTTP-отладчик, я могу увидеть значение, которое было отправлено (см. Ниже).

При попытке получить IHTMLLocation интерфейс от IHTMLDocument2, ни одно из свойств не содержит значение, которое я могу видеть, используя HTTP-отладчик, и эти вызовы успеха с различными значениями, даже когда поле «Location» не существует в заголовках ответа (это явно не то, что необходимо).

Это единственное зависание. Все последующие вызовы и запросы, я использую API WinHTTP, а заголовки ответов - easily accessed. Однако на этом этапе пользователь может правильно аутентифицировать и авторизировать приложение в браузере. Я ценю ваше время и помощь.

Update: Реакция выглядит примерно следующим образом:

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

Если есть заголовок 'Location:', то должен быть код ответа перенаправления 301 или 302, который часто автоматически выполняется. У новых заголовков ответов не будет заголовок 'Location'. Может быть так? – Kenney

+0

Да, я обновлю вопрос. – Jeff

+1

'IHTMLDocument2' не предоставляет доступ к заголовкам HTTP. «IHTMLLocation» представляет конечный URL-адрес, который фактически загружен в текущий документ, поэтому он никогда не будет представлять промежуточные URL-адреса, которые предоставляются перенаправлением HTTP, вплоть до этого конечного URL-адреса. Для того, что вы пытаетесь сделать, вам, скорее всего, придется создавать свои собственные HTTP-запросы, например, с помощью WinInet/WinHTTP или любой другой библиотеки HTTP, а затем вручную загрузить полученный HTML в экземпляр WebBrowser, если вам нужно отобразить его на пользователь. –

ответ

0

В этом случае получение заголовка ответа не требуется. Код auth также передается в качестве параметра запроса URL-адреса перенаправления.

Реализовать DWebBrowserEvents2, и получить URL в 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 когда

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

URL-адрес вариант находится здесь:

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

Измени BSTR , затем строка:

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=[...]