none
передача HttpWebResponse в Socket.Send RRS feed

  • Общие обсуждения


  • Здравствуйте!

    Имеется WebBrowser работающий через прокси, т.е. через TCPListener  и Socket. Я Формирую HttpWebRequest по данным полученным от WebBrowser и затем получаю response

    HttpWebResponse dataStream = (HttpWebResponse)webReq.GetResponse();

    вопрос вот в чем. Как теперь правильно отдать этот response в Socket.Send чтобы не потерять никаких сессионных куков, правильно передались заголовки и с учетом различны StatusDescription. Я делаю это следующим образом


    HttpWebResponse dataStream = (HttpWebResponse)webReq.GetResponse();
                  Console.WriteLine(dataStream.Headers.ToString());
    
                  Stream strm = dataStream.GetResponseStream();
    
                  byte[] xdata = null;
                  xdata = ConvertingStream(strm);
    
                  if (xdata == null)
                  {
                    xdata = new byte[0];
                  }
                  #region Put Cookie To WebBrowser From WebResponse
                  if (dataStream.Headers["Set-Cookie"] != null)
                  {
                    string[] tttt = dataStream.Headers["Set-Cookie"].Split(new string[] { "path=/" }, StringSplitOptions.None);
                    for (int i = 0; i < tttt.Length; i++)
                    {
                      if (tttt[i] != "")
                      {
                        if (i == 0)
                          InternetSetCookie(dataStream.ResponseUri.ToString(), null, tttt[i].Substring(0, tttt[i].Length - 2));
                        else
                          InternetSetCookie(dataStream.ResponseUri.ToString(), null, tttt[i].Substring(1, tttt[i].Length - 3));
                      }
                    }
                  }
                  //dataStream.Headers["Set-Cookie"] = null;
                  #endregion 
                  sock.Send(Encoding.Unicode.GetBytes(GetStatusCode(dataStream.StatusDescription)));// + dataStream.Headers
                  sock.Send(Encoding.Unicode.GetBytes(dataStream.Headers.ToString()));               sock.Send(xdata);
                  sock.Close();
    
    
    
    
    
    #region Конвертирование Stream to Byte[]
        private byte[] ConvertingStream(Stream strm)
        {
          MemoryStream memStr = new MemoryStream();
          byte[] b = new byte[32768];
          int r;
          while ((r = strm.Read(b, 0, b.Length)) > 0)
            memStr.Write(b, 0, r);
    
          return memStr.GetBuffer();
        }
        #endregion
    
    [DllImport("wininet.dll", SetLastError = true)]
        private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength);
    
        [DllImport("wininet.dll", SetLastError = true)]
        public static extern bool InternetGetCookie(string url, string cookieName, StringBuilder cookieData, ref int size);
    
        [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool InternetSetCookie(string lpszUrl, string lpszCookieName, string lpszCookieData);
    
    
    
    private string GetStatusCode(string code)
        {
          if (code.Equals("Found"))
            return "HTTP/1.1 302 Found\r\n";
          else
            if (code.Equals("Not Found"))
              return "HTTP/1.1 404 Not Found\r\n";
            else
              if (code.Equals("OK"))
                return "HTTP/1.1 200 OK\r\n";
              else
                if (code.Equals("Redirect"))
                  return "HTTP/1.1 302 Redirect\r\n";
                else
                  if (code.Equals("Continue"))
                    return "HTTP/1.1 100 Continue\r\n\r\n";
          return null;
        }
    

     

    Дело в том что WebBrowser в результате таких манипуляций получает не весь контент. Из за чего страница не отображается или отображается некорректно.

    • Изменен тип Abolmasov Dmitry 1 ноября 2010 г. 8:27
    • Перемещено Abolmasov Dmitry 1 ноября 2010 г. 8:27 (От:Работа в среде Visual Studio)
    19 октября 2010 г. 18:58

Все ответы

  • Уважаемый пользователь!

    В вашей теме отсутствует активность в течение последних 5 дней. При отсутствии каких-либо действий в течение 2 последующих дней, тема будет переведена в разряд обсуждений. Вы можете возобновить дискуссию, просто оставив сообщение в данной теме

    25 октября 2010 г. 13:18