internal PluggableProtocolRequest( PluggableProtocolHandler handler, string url, NativeMethods.IInternetBindInfo bind, NativeMethods.PI_FLAGS startFlags) { m_Url = new Uri(url); int bindf; NativeMethods.BINDINFO bindinfo = new NativeMethods.BINDINFO(); bindinfo.cbSize = Marshal.SizeOf(typeof(NativeMethods.STGMEDIUM)); bindinfo.cbSize = Marshal.SizeOf(typeof(NativeMethods.BINDINFO)); // string userAgent=GetBindString( // bind, // NativeMethods.BINDSTRING.BINDSTRING_USERAGENT ); // // System.Diagnostics.Trace.WriteLine( // "useragent: "+GetBindString(bind,NativeMethods.BINDSTRING.BINDSTRING_USERAGENT)+"\r\n"+ // "url: "+GetBindString(bind,NativeMethods.BINDSTRING.BINDSTRING_URL)+"\r\n"+ // "post cookie: "+GetBindString(bind,NativeMethods.BINDSTRING.BINDSTRING_POST_COOKIE)+"\r\n"+ // "post MIME: "+GetBindString(bind,NativeMethods.BINDSTRING.BINDSTRING_POST_DATA_MIME) ); bind.GetBindInfo(out bindf, ref bindinfo); switch (bindinfo.dwBindVerb) { case NativeMethods.BINDVERB.BINDVERB_GET: // GET m_Verb = "GET"; m_VerbData = null; break; case NativeMethods.BINDVERB.BINDVERB_POST: m_Verb = "POST"; m_VerbData = ExtractVerbData(bindinfo); break; case NativeMethods.BINDVERB.BINDVERB_PUT: m_Verb = "PUT"; m_VerbData = ExtractVerbData(bindinfo); break; case NativeMethods.BINDVERB.BINDVERB_CUSTOM: m_Verb = Marshal.PtrToStringUni(bindinfo.szCustomVerb); m_VerbData = ExtractVerbData(bindinfo); break; } }
byte[] ExtractVerbData(NativeMethods.BINDINFO bindinfo) { if (bindinfo.cbstgmedData == 0)//|| bindinfo.stgmedData==IntPtr.Zero ) { return(null); } NativeMethods.STGMEDIUM med = bindinfo.stgmedData;// (NativeMethods.STGMEDIUM)( Marshal.PtrToStructure(bindinfo.stgmedData,typeof(NativeMethods.STGMEDIUM)) ); if ((med.tymed & NativeMethods.TYMED.TYMED_HGLOBAL) == 0) { return(null); } IStream pStream = null; int hresult = NativeMethods.CreateStreamOnHGlobal( med.hGlobal, 0, out pStream); Marshal.ThrowExceptionForHR(hresult); try { if (pStream == null) { return(null); } byte[] result = new byte[(int)bindinfo.cbstgmedData]; pStream.Read(result, result.Length, IntPtr.Zero); return(result); } finally { Marshal.ReleaseComObject(pStream); } }