Microsoft KB Archive/280522

= How To Handle POST Requests in a Pluggable Protocol Handler =

Article ID: 280522

Article Last Modified on 5/24/2007

-

APPLIES TO


 * Microsoft Internet Explorer 4.0 128-Bit Edition
 * Microsoft Internet Explorer 4.01 Service Pack 2
 * Microsoft Internet Explorer 4.01 Service Pack 1
 * Microsoft Internet Explorer 4.01 Service Pack 2
 * Microsoft Internet Explorer 5.0
 * Microsoft Internet Explorer 5.01
 * Microsoft Internet Explorer (Programming) 5.01 SP1
 * Microsoft Internet Explorer 5.5
 * Microsoft Windows Internet Services (WinInet)

-



This article was previously published under Q280522



SUMMARY
It is sometimes desirable to have a pluggable protocol as the target of FORM POST requests. This article outlines how to handle POST requests in an asynchronous pluggable protocol handler (APPH).



MORE INFORMATION
The APPH receives the POST data (by way of URLMON) from the client as part of the BINDINFO structure, as described in the following article in the Microsoft Knowledge Base:

165800 PostMon.exe Demonstrates How to Use URL Moniker to POST Data

In addition, the MIME type of the POST data can be retrieved by means of the IInternetBindInfo::GetBindString method with a first parameter of BINDSTRING_POST_DATA_MIME.

With this background information, you can use the following code to obtain the POST data from within an APPH's IInternetProtocol::Start method: STDMETHODIMP CMyPlugProt::Start(       LPCWSTR szUrl,        IInternetProtocolSink *pIProtSink,        IInternetBindInfo *pIBindInfo,        DWORD grfSTI,        DWORD dwReserved) {

// Retrieve POST data. // m_bindinfo and m_bindf are members of the CMyPlugProt class, declared as: // BINDINFO m_bindinfo; // DWORD m_bindf;

m_bindinfo.cbSize = sizeof(BINDINFO); if (pIBindInfo) hr = pIBindInfo->GetBindInfo(&m_bindf, &m_bindinfo); switch (m_bindinfo.dwBindVerb) {   case    BINDVERB_POST: void *pData; UINT cPostData; // Post data size. if (m_bindinfo.stgmedData.tymed != TYMED_HGLOBAL) break; cPostData = m_bindinfo.cbstgmedData; if (!cPostData) break; pData = GlobalLock(m_bindinfo.stgmedData.hGlobal); if (pData) {           // Allocate space to store the POST data if required. // For instance, a member variable, m_postData, // declared as &quot;BYTE *m_postData;&quot;, could be used // as below: // m_postData = new BYTE[cPostData]; // memcpy(m_postData, pData, cPostData); // After checking the data, unlock buffer. GlobalUnlock(m_bindinfo.stgmedData.hGlobal); // Retrieve MIME type of the post data. LPOLESTR pszMIMEType; ULONG dwSize; hr = pIBindInfo->GetBindString(               BINDSTRING_POST_DATA_MIME, &pszMIMEType, 1, &dwSize); if(hr == S_OK) {               // pszMIMEType now contains the MIME type of the post data. // This would typically be &quot;application/x-www-form-urlencoded&quot; // for a POST. In general, it could be any (standard or                // otherwise) MIME type. Many of the standard MIME type strings // are #defined in . For instance, CFSTR_MIME_TEXT // is L&quot;text/plain&quot;. // Store the MIME type in a member variable here, if required.

// Finally, free pszMIMEType via CoTaskMemFree. if (pszMIMEType) {                   CoTaskMemFree(pszMIMEType); pszMIMEType = NULL; }           }            else {               // Assume &quot;application/x-www-form-urlencoded&quot;. }       }        break; default: // It's a GET. break; }

}  // End of function STDMETHODIMP CMyPlugProt::Start

