He intentado enviar una solicitud HTTP POST a Facebook sin éxito, obtengo esta respuesta del servidor:

HTTP / 1.1 400 Tipo de contenido de solicitud incorrecta: texto / html; charset = utf-8 Fecha: sábado, 10 de diciembre de 2016 21:28:17 GMT Conexión: cerrar Contenido-Duración: 2959

Facebook | Error

Lo sentimos, algo salió mal Estamos trabajando en ello y lo arreglaremos tan pronto como podamos

Mi código

#include <iostream>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <netdb.h>
#include <fstream>
using namespace std;

int main()
{
    int s, error;
    struct sockaddr_in addr;


        s = socket(AF_INET, SOCK_STREAM, 0);
    if(s <0)
    {
        cout<<"Error 01: creating socket failed!\n";
        close(s);
        return 1;
    }

    addr.sin_family = AF_INET;
    addr.sin_port = htons(80);
    inet_aton("31.13.90.36",&addr.sin_addr);

    error = connect(s,(sockaddr*)&addr,sizeof(addr));
    if(error!=0)
    {
        cout<<"Error 02: conecting to server failed!\n";
        close(s);
        return 1;
    }

     const int msgSize = 1042;
     char msg[] = "POST /login.php?login_attempt=1 \r\n"
                     "HTTP/1.1\r\n"
                     "HOST: facebook.com\r\n\r\n"
                     "Content-type: application/x-www-form-urlencoded\r\n"
                     "Content-Length: 41\r\n"
                     "email=lel@gmail.com&pass=test123&submit=1\r\n" ;







     char answ[1042];

    //cin.getline(&msg[0],256);

    send(s,msg,strlen(msg),0);


    ssize_t len;
    while((len = recv(s, msg, strlen(msg), 0)) > 0)
    {
        cout.write(msg, len);

        std::cout << std::flush;
    }
    if(len < 0)
    {
        cout << "error";
    }
    close(s);  

}

¿Que hice mal?

1
Dota 11 dic. 2016 a las 00:37

1 respuesta

La mejor respuesta

Hay varios errores en su mensaje. Esto es lo que envías según tu código:

1  POST /login.php?login_attempt=1 \r\n
2  HTTP/1.1\r\n 
3  HOST: facebook.com\r\n\r\n
4  Content-type: application/x-www-form-urlencoded\r\n
5  Content-Length: 41\r\n
6  email=lel@gmail.com&pass=test123&submit=1\r\n

En su lugar, debería ser así:

1  POST /login.php?login_attempt=1 HTTP/1.1\r\n
2  HOST: facebook.com\r\n
3  Content-type: application/x-www-form-urlencoded\r\n
4  Content-Length: 41\r\n
5  \r\n
6  email=lel@gmail.com&pass=test123&submit=1

En detalle:

  • Las líneas 1 y 2 deben ser una sola línea, es decir, "ruta del método versión HTTP".
  • La línea 3 no debe contener varios \r\n
  • en su lugar, la línea vacía \r\n debería estar después de todos los encabezados HTTP (nueva línea 5)
  • el cuerpo en la línea 6 debe contener solo los datos cubiertos por la longitud del contenido. Los 41 bytes que estableciste allí no incluyen el \r\n que enviaste

Aparte de eso, no analiza correctamente la respuesta y, en su lugar, espera que el servidor cierre la conexión una vez que finaliza la respuesta. Como está usando HTTP/1.1, implícitamente usa conexiones persistentes (HTTP Keep-Alive), por lo que el servidor podría esperar más solicitudes dentro de la misma conexión TCP y no cerrar la conexión inmediatamente.

Realmente te recomiendo que estudies el estándar de HTTP en lugar de adivinar cómo podría funcionar el protocolo. .

4
Steffen Ullrich 11 dic. 2016 a las 01:09
Por cierto, no adiviné que usé la aplicación de encabezados HTTP en vivo cuando pruebo el nuevo código obtengo HTTP / 1.1 301 Moved Permanently Creo que este enlace medio cambió, ¿cómo puedo seguir el enlace? Gracias por tu tiempo.
 – 
Dota
11 dic. 2016 a las 01:12
@AmineDjenaihi: sí, esto significa seguir el enlace que se proporciona en el encabezado de Ubicación. Y esto está cubierto por el RFC. Y no tengo idea de lo que ha visto con los encabezados HTTP en vivo, pero tiene varios saltos de línea incorrectos: ha agregado tres que no pertenecen allí y eliminó uno al que pertenece. Aparte de eso, un navegador agrega muchos más encabezados, por lo que estoy bastante seguro de que no copió la solicitud original del navegador, sino que adivinó por lo que vio allí.
 – 
Steffen Ullrich
11 dic. 2016 a las 01:14
1
@AmineDjenaihi: Nuevamente, lea las especificaciones HTTP. 301 es una respuesta de redireccionamiento. Incluye un encabezado Location para la nueva URL. Repita su misma solicitud a la nueva URL.
 – 
Remy Lebeau
11 dic. 2016 a las 01:15
De acuerdo, ¡Gracias por su tiempo, chicos!
 – 
Dota
11 dic. 2016 a las 01:19