C# HTTP POST

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Maxidrom, 19 Feb 2009.

  1. Maxidrom

    Maxidrom New Member

    Joined:
    4 Feb 2009
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Всем привет, помогите тут разобраться кое в чем, пытаюсь заставить сервер прислать мне страницу методом POST, вот что имеется:
    Code:
           public static string Login()
            {
                IPHostEntry hostEntry = Dns.GetHostEntry("сайт");
                IPAddress address = hostEntry.AddressList[0];
                IPEndPoint ipe = new IPEndPoint(address, 80);
                Socket socket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
    
                try
                {
                    socket.Connect(ipe);
                    if (socket.Connected)
                    {
                        Console.WriteLine("Connected to " + ipe.ToString());
                    }
                    else
                    {
                        Console.WriteLine("Can not connect...");
                    }
                }
                catch (SocketException ex)
                {
                    Console.WriteLine(ex.Message);
                }
    
                string request = 
                    "POST сайт HTTP/1.1\r\n" +
                    "Accept: text/html\r\n" +
                    "Host: сайт\r\n" +
                    "Cookie: income=1\r\n" +
                    "Referer: сайт\r\n"+
                    "Content-Length: " + "142" + "\r\n" + 
                    "Content-Type: application/x-www-form-urlencoded\r\n\r\n"
                    +"параметры";
    
                Byte[] bytesSent = Encoding.ASCII.GetBytes(request);
                Byte[] bytesReceived = new Byte[1024];
                socket.Send(bytesSent, bytesSent.Length, 0);
                string page = "";
                int bytes = 0;
    
                do
                {
                    bytes = socket.Receive(bytesReceived, bytesReceived.Length, 0);
                    page = page + Encoding.ASCII.GetString(bytesReceived, 0, bytes);
                }
                while (bytes > 0);
    
                return page;
            }
    
    Получаю вместо страницы это:
    Code:
    HTTP/1.1 302 Moved Temporarily
    X-Powered-By: Servlet/2.5
    Server: Sun Java System Application Server 9.1_02
    Set-Cookie: JSESSIONID=ac85e657399e7058ae4fd3fe2505; Path=/
    Pragma: no-cache
    Expires: Thu, 01 Jan 1970 00:00:00 GMT
    Cache-Control: no-cache
    Cache-Control: no-store
    X-Powered-By: JSF/1.2
    Location: сайт
    Content-Type: text/html; charset=iso-8859-1
    Content-Length: 0
    Date: Wed, 18 Feb 2009 19:06:40 GMT
    Connection: close
    Чего не хватает?
     
    #1 Maxidrom, 19 Feb 2009
    Last edited: 19 Feb 2009
  2. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Если ты всё правильно послал, и это действительно тот результат, который предусмотрен логикой сайта, то при получении HTTP-кода 302 ты должен проследовать туда, куда тебе указывает Location в ответе. Такая схема вполне нормальна при авторизации, например. Ты отправляешь постом необходимые данные, а в ответ скрипт посылает тебе 302 Moved Temporarily и указание того, что ты должен открыть далее. Это называется "редирект".
     
  3. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Ах да... Забыл добавить, не забывай анализировать строки установки кук, у тебя это:

    Set-Cookie: JSESSIONID=ac85e657399e7058ae4fd3fe2505; Path=/

    То есть при переходе на страницу куда тебя послали в 302 ответе ты должен будешь указать:

    Cookie: JSESSIONID=ac85e657399e7058ae4fd3fe2505; Path=/

    Иначе сайт не подхватит твою сессию.
     
  4. Maxidrom

    Maxidrom New Member

    Joined:
    4 Feb 2009
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    groundhog ок сделал как ты посоветовал, но ответа нет и вовсе, вобщем в своем коде сразу после цикла добавил:
    Code:
    string[] get = 
                {"GET адрес из Location HTTP/1.1",
                    "Accept: text/html" ,
                    "Host: сайт" ,
                    "Referer: откуда",
                    ""
             };
    // В temp загнал куки
    get[get.Length-1] = "Cookie:" + temp;
    // Шлю серверу
    socket.Send(bytesSent, bytesSent.Length, 0);
    В ответ ничего не получаю, и еще вопрос, возможно я щас попробую еще, ответ что из себя представлять будет, допустим HTTP/1.1 200 OK, там что-то еще и дальше сама страница?
     
  5. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Если 200 OK то следом после хидеров ты получаешь контент запрошенного ресурса, то есть содержимое страницы в твоём случае. Если у тебя запрос "повис" то ты скорее всего не правильно сормировал пакет. В GET запросах такое бывает сплошь и рядом, если ты после хидеров не указал пустую строку. После последнего хидера обязательно должно быть \r\n\r\n.
     
    2 people like this.
  6. Maxidrom

    Maxidrom New Member

    Joined:
    4 Feb 2009
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Спасибо groundhog буду сейчас пробовать.
     
  7. Maxidrom

    Maxidrom New Member

    Joined:
    4 Feb 2009
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Ребят а что делать если возникает ошибка 505 HTTP Version Not Supported, я юзаю HTTP/1.1, снифером смотрел браузер тоже HTTP/1.1 юзает, где косяк может быть? Опять неправильно составил запросы?

    Отбой ребят, пробел лишний поставил))) все работает, спасибо за помощь
     
    #7 Maxidrom, 19 Feb 2009
    Last edited: 19 Feb 2009
  8. Maxidrom

    Maxidrom New Member

    Joined:
    4 Feb 2009
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Работает но что-то не так как нужно, не ту страницу грузит, вот когда я делаю редирект, правильно ли делать это методом GET, в принципе так делает и браузер, снифер показывает сначала POST потом GET, Location взял, куки взял, чего-то может быть не хватает?
     
  9. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Всё правильно, по редиректу идёшь методом GET. Проверь ещё раз кукисы, любая неточность может приводить к непредсказуемому результату. Ну и, конечно, когда идёшь на страницу после редиректа - передавай referer с той страницей которая послала этот редирект. Реферер может анализироваться скриптами и перебрасывать куда-нибудь ещё если не удовлетворяет требованиям.
     
  10. Maxidrom

    Maxidrom New Member

    Joined:
    4 Feb 2009
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    ээээх groundhog вот так я тупанул, я смотрел снифером что делает браузер когда у него уже были куки и он сразу юзал POST, только вот до меня доперло удалить куки и посмотреть что он делает, он вначале шлет GET а потом за ним POST, 2 часа убил зря( сейчас буду исправлять...
     
  11. ChinaTown

    ChinaTown Member

    Joined:
    15 Nov 2008
    Messages:
    0
    Likes Received:
    7
    Reputations:
    0
    Ребят, если задача на стоит конкретно сделать через сокеты, то почему бы не заюзать httpwebrequest ? Там и с куками полегче и редиректы он сам может ловить.
     
  12. Maxidrom

    Maxidrom New Member

    Joined:
    4 Feb 2009
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    А вот насчет httpwebrequest я его юзал однажды, мне сайт выдавал что мол у них какая-то антибот защита, в принципе ChinaTown если есть интересные примеры выкладывай.