Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Vaagish en 1 Abril 2014, 02:45 am



Título: Protocolo HTTP, un dolor de cabeza...
Publicado por: Vaagish en 1 Abril 2014, 02:45 am
Buenas! Hace un buen tiempo que tengo este proyecto que quiero utilizar el protocolo HTTP para realizar peticiones al servidor, lo habia empezado con Sockets, luego por cansancio utilize wininet, ahora lo quiero/ tengo que poder hacer con sockets, el asunto es que estoy seguro que la peticion esta perfecta, el servidor responde 200 OK, pero el dato no llega.. dejo las cabeceras tal cual como las envio y como las envia el navegador (al navegador si le funciona >:( )

Asi la envio yo:

Citar
POST /php/core2.php HTTP/1.1
Host: www.elhost.com

User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:22.0) Gecko/20100101 Firefox/22.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-ar,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://www.elhost.com/php/coso.html
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------78302333330941
Content-Length: 2
-----------------------------78302333330941
Content-Disposition: form-data; name="VAR"

TS
-----------------------------78302333330941--
Al final de cada linea hay un "\r\n" como es debido, eso lo puedo ver con Notepad ++

Asi la envia el navegador
Citar
POST /php/core2.php HTTP/1.1
Host: www.elhost.com
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:22.0) Gecko/20100101 Firefox/22.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-ar,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://www.elhost.com/php/coso.html
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------78302333330941
Content-Length: 253
-----------------------------78302333330941
Content-Disposition: form-data; name="VAR"

TS
-----------------------------78302333330941--
Bueno, las diferencias como el Content-Length es porque el navegador también envía el botón submit (ya probé agregar eso a mi código, igualar los tamaños, aumentarlos, disminuirlos.. etc) Y el "\r\n" que hay después del "Host" es porque a mi no me funciona sin ese CRLF (también probé sacarlo, pero me dice BAD REQUEST)

Bueno, a lo que voy, estoy seguro que la cadena no esta mal, puede ser que tenga que crear el socket de alguna forma "especial" para este tipo de situaciones?

Yo lo creo asi:

Código
  1. SOCKET StartUpSocket()
  2. {
  3. int rtn;
  4.  
  5. if ((rtn = WSAStartup(MAKEWORD(2, 2), &WSA)) != 0) return 1;
  6. if ((Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) return 1;
  7.  
  8. HOSTENT *host = gethostbyname("www.elhost.com");
  9.  
  10. if (!host) return -1;
  11.  
  12. char *hostip = inet_ntoa(*(struct in_addr*)(host->h_addr_list[0]));
  13.  
  14. Server.sin_family = AF_INET;
  15. Server.sin_port = htons(PUERTO);
  16. Server.sin_addr.s_addr = inet_addr(hostip);
  17.  
  18. if ((rtn = connect(Socket, (struct sockaddr*) &Server, sizeof(Server))) == SOCKET_ERROR) return 1;
  19.  
  20. return Socket;
  21. }
  22.  

Y lo utilizo asi:

Código
  1. send(Socket, BUFFER, strlen(BUFFER), 0);

Donde BUFFER contiene toda la petición..

Esto me tiene bastante cansado, y me calienta no solucionarlo...
Saludos, gracias!


Título: Re: Protocolo HTTP, un dolor de cabeza...
Publicado por: eferion en 1 Abril 2014, 08:40 am
estás haciendo una petición POST al servidor... yo probaría primero con una petición GET, que son más sencillas.

GET y POST son las formas de enviar información al servidor. Los parámetros que se pasan por GET van concatenados a la url, mientras que los que se envían por POST van en segundo plano. Es posible que tu problema sea que el servidor se quede esperando a que le lleguen los datos por POST y por eso no te responde correctamente.


Título: Re: Protocolo HTTP, un dolor de cabeza...
Publicado por: ThePinkPanther en 1 Abril 2014, 08:59 am
hola..
no estoy muy familiarizado con la estructura de las cabeceras http,por lo visto en el codigo c, se puede apreciar q estas mandando bien la cadena,si usaste un archivo de texto para corroborar lo que estas enviando , y es identico a la cabecera que envias con el navegador,que de alguna forma la has capturado , los datos deberían llegar..
pues no creo q este fallando el socket, yo pienso que puede q tu cabecera este entrando con alguna anomalia al server..

como vuelvo a repetir,no se mucho de las cabeceras pero... lo unico q veo a simple vista que difiere lo que envias con lo q envia el navegador es los 2 espacios debajo de host,que no se si hacen al problema.

Citar
POST /php/core2.php HTTP/1.1
Host: www.elhost.com
//aca estan los 2 espacios en ( BUFFER )
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:22.0) Gecko/20100101 Firefox/22.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-ar,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://www.elhost.com/php/coso.html
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------78302333330941
Content-Length: 2
-----------------------------78302333330941
Content-Disposition: form-data; name="VAR"

TS
-----------------------------78302333330941--

pues quisas el server te este cortando la cabecera allí . saludos


Título: Re: Protocolo HTTP, un dolor de cabeza...
Publicado por: x64core en 1 Abril 2014, 11:22 am
Pues vas a tener que depurar el código C/C++ así como el PHP ya que hay mucho que tomar en cuenta, nadie sabe que tipo,cantidad de
datos enviamos y recibimos, etc. porqué no intentas hacer unas simples peticiones con código lo más pequeño posible y luego vas
agregando más y más. si llegas al punto donde no sabes porqué del error entonces publicas el código completo aquí. No el proyecto
completo, sino un código más trabajable.


Título: Re: Protocolo HTTP, un dolor de cabeza...
Publicado por: Eternal Idol en 1 Abril 2014, 13:44 pm
Para poder solucionar el bad request, previo borrado del CRLF de mas que tenes en el Host, tenes que poner un CRLF justo antes de los datos.

Código
  1. char post_msg[] = {  
  2. "POST /php/core2.php HTTP/1.1\r\nHost: www.elhost.com\r\nUser-Agent: Mozilla/5.0 (Windows NT 5.1; rv:22.0) Gecko/20100101 Firefox/22.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: es-ar,es;q=0.8,en-us;q=0.5,en;q=0.3\r\nReferer: http://www.elhost.com/php/coso.html\r\nConnection: keep-alive\r\nContent-Type: multipart/form-data; boundary=---------------------------78302333330941\r\nContent-Length: 2\r\n\r\n-----------------------------78302333330941\r\nContent-Disposition: form-data; name=\"VAR\"\r\nTS\r\n-----------------------------78302333330941--\r\n"
  3. };

PD. Y si, la proxima vez hacela facil para nosotros y deja codigo funcional y que se comunique con un servidor real. Yo consegui pasar de un 400 a un 404 unicamente. Ah y le saque el encoding para ver que respondia el servidor ...


Título: Re: Protocolo HTTP, un dolor de cabeza...
Publicado por: Vaagish en 1 Abril 2014, 19:22 pm
Gracias por responder compas! Es que puse ahi:

Citar
Bueno, las diferencias como el Content-Length es porque el navegador también envía el botón submit (ya probé agregar eso a mi código, igualar los tamaños, aumentarlos, disminuirlos.. etc) Y el "\r\n" que hay después del "Host" es porque a mi no me funciona sin ese CRLF (también probé sacarlo, pero me dice BAD REQUEST)

Y otra cosa:
Citar
el servidor responde 200 OK, pero el dato no llega

Esta bien, concuerdo en esto
Citar
PD. Y si, la proxima vez hacela facil para nosotros y deja codigo funcional y que se comunique con un servidor real. Yo consegui pasar de un 400 a un 404 unicamente. Ah y le saque el encoding para ver que respondia el servidor ...

Ahora me pongo a armar algo simple, es que me daba cosa poner el servidor, (nunca falta el chistoso...) voy a intentar con un hosting gratuito y actualizo..

Saludos!

Ha, quería aclarar esto:
Citar
estás haciendo una petición POST al servidor... yo probaría primero con una petición GET, que son más sencillas

Ya probé, con GET funciona, inclusive si uso una petición POST del tipo Clave-Valor, que seria asi: VAR=TS, pero usando Content-Type: application/x-www-form-urlencoded, (que es lo correcto cuando los datos viajan por POST en forma de Clave-Valor) funciona, de la única manera que no me funciona es la que tengo que usar, que ironía.. :-(


Título: Re: Protocolo HTTP, un dolor de cabeza...
Publicado por: Eternal Idol en 1 Abril 2014, 19:36 pm
¿Probaste con la cadena que deje? ¿Que resultado tuvo? 400 no puede ser ...


Título: Re: Protocolo HTTP, un dolor de cabeza...
Publicado por: Vaagish en 1 Abril 2014, 20:04 pm
Citar
¿Probaste con la cadena que deje? ¿Que resultado tuvo? 400 no puede ser ...

Sep,, 400, pero si uso "\r\n\r\n" despues del host pasa a ser un 200 OK de respuesta, pero Content-Length: 0 :/


Título: Re: Protocolo HTTP, un dolor de cabeza...
Publicado por: Eternal Idol en 1 Abril 2014, 20:26 pm
Sep,, 400, pero si uso "\r\n\r\n" despues del host pasa a ser un 200 OK de respuesta, pero Content-Length: 0 :/

Es que estas compensando el CRLF que te falta antes de los datos poniendolo despues del Host. ¿400 y que mas? ¿Copiaste y pegaste esa cadena exacta? A mi me da 404 al no existir el /php/core2.php ...


Ahora:
HTTP/1.1 404 Not Found
Date: Tue, 01 Apr 2014 18:30:39 GMT
Server: Apache
Vary: Accept-Encoding
Content-Length: 211
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /php/core2.php was not found on this server.</p>
</body></html>


Antes:
HTTP/1.1 400 Bad Request
Date: Tue, 01 Apr 2014 18:32:55 GMT
Server: Apache
Vary: Accept-Encoding
Content-Length: 335
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
Request header field is missing ':' separator.<br />
<pre>
-----------------------------78302333330941</pre>
</p>
</body></html>


Título: Re: Protocolo HTTP, un dolor de cabeza...
Publicado por: Vaagish en 1 Abril 2014, 20:36 pm
Citar
Es que estas compensando el CRLF que te falta antes de los datos poniendolo despues del Host.

Pero si siempre estuvo ese CRLF antes de los datos jaja
Aguantame 30' que subo a un hosting gratis y pongo todo el codigo "funcional"


Título: Re: Protocolo HTTP, un dolor de cabeza...
Publicado por: Eternal Idol en 1 Abril 2014, 20:40 pm
No, yo en el primer mensaje del hilo veo esto seguido:
Content-Length: 2
-----------------------------78302333330941

y tiene que ser asi:
Content-Length: 2

-----------------------------78302333330941

¿Copiaste y pegaste la cadena, o no?


Título: Re: Protocolo HTTP, un dolor de cabeza...
Publicado por: Vaagish en 1 Abril 2014, 20:51 pm
Citar
No, yo en el primer mensaje del hilo veo esto seguido:
Content-Length: 2
-----------------------------78302333330941

y tiene que ser asi:
Content-Length: 2

-----------------------------78302333330941

Haa,, ok.. ahi lo vi.. ya lo había probado igual.. la cadena la copie literalmente sep, ahora en el codigo que pongo uso esa misma cadena,, ya lo subo..

EDITO

Bueno, al diablo.. el servidor mediocre este gratuito me da errores por todos lados ahora... aca dejo el codigo tal cual lo uso yo, con el servidor..

MAIN.CPP

Código
  1. #include "main.h"
  2. #include <Windows.h>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. WSADATA WSA;
  8. SOCKET Socket;
  9. SOCKADDR_IN Server;
  10.  
  11. SOCKET Connection;
  12.  
  13. char recvbuf[DEFAULT_BUFLEN];
  14. int  recvbuflen = DEFAULT_BUFLEN;
  15.  
  16. int main()
  17. {
  18. Connection = StartUpSocket();
  19. SendRequest(Connection, HTTP);
  20. ReadSocket();
  21. cin.get();
  22. return 0;
  23. }
  24.  
  25. SOCKET StartUpSocket()
  26. {
  27. int rtn;
  28.  
  29. if ((rtn = WSAStartup(MAKEWORD(2, 2), &WSA)) != 0) return 1;
  30. if ((Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) return 1;
  31.  
  32. HOSTENT *host = gethostbyname("www.montevideoaldia.com");
  33.  
  34. if (!host) return -1;
  35.  
  36. char *hostip = inet_ntoa(*(struct in_addr*)(host->h_addr_list[0]));
  37.  
  38. Server.sin_family = AF_INET;
  39. Server.sin_port = htons(PUERTO);
  40. Server.sin_addr.s_addr = inet_addr(hostip);
  41.  
  42. if ((rtn = connect(Socket, (struct sockaddr*) &Server, sizeof(Server))) == SOCKET_ERROR) return 1;
  43.  
  44. return Socket;
  45. }
  46.  
  47. int SendRequest(SOCKET s, char *data1) // -> Se puede pasar por aca la cadena, o no
  48. {
  49. FILE *file;
  50. file = fopen ( "DUMP.txt", "wb+" );
  51.  
  52. fputs(data1, file);
  53. fclose(file);
  54.  
  55. cout << data1 << endl;
  56.  
  57. send(s, data1, strlen(data1), 0);
  58.  
  59. return 0;
  60. }
  61.  
  62. int ReadSocket()
  63. {
  64. int iResult;
  65.  
  66. do {
  67. iResult = recv(Socket, recvbuf, recvbuflen, 0);
  68. cout << recvbuf << endl;
  69. } while (iResult > 0);
  70.  
  71. return 0;
  72. }
  73.  

MAIN.H
Código
  1. #include <winsock2.h>
  2. #pragma comment(lib, "ws2_32.lib")
  3.  
  4. #define PUERTO 80
  5. #define DEFAULT_BUFLEN 512
  6.  
  7. SOCKET StartUpSocket();
  8. int SendRequest(SOCKET s, char *data1);
  9. int ReadSocket();
  10.  
  11. static TCHAR HTTP[] = "POST /php/core2.php HTTP/1.1\r\n"
  12.  "Host: www.montevideoaldia.com\r\n"
  13.  "User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:22.0) Gecko/20100101 Firefox/22.0\r\n"
  14.  "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
  15.  "Accept-Language: es-ar,es;q=0.8,en-us;q=0.5,en;q=0.3\r\n"
  16.  "Referer: http://www.montevideoaldia.com/php/coso.html\r\n"
  17.  "Connection: keep-alive\r\n"
  18.  "Content-Type: multipart/form-data; boundary=---------------------------78302333330941\r\n"
  19.  "Content-Length: 2\r\n\r\n"
  20.  "-----------------------------78302333330941\r\n"
  21.  "Content-Disposition: form-data; name=\"VAR\"\r\n"
  22.  "TS\r\n"
  23.  "-----------------------------78302333330941--\r\n";
  24.  


Título: Re: Protocolo HTTP, un dolor de cabeza...
Publicado por: Vaagish en 1 Abril 2014, 21:15 pm
Y el php

Código
  1. <?php
  2. if(isset($_POST["VAR"])){
  3. $Var = $_POST["VAR"];
  4. echo "Este es el dato: ".$Var;
  5. }
  6. ?>
  7.  

Quien es Morcilla? Jaja eso si llego a los Logs de Apache, y tambien otro que dice:
http://www.elhost.com/php/coso.html" "Mozilla/5.0 (Windows NT 5.1; rv:22.0) Gecko/20100101 Firefox/22.0
Ahora el referer es el mismo host..

PD: Gracias por la ayuda!



Citar
Eternal Idol que no entiende este server etc, etc
Jajajaja

Si, esta crudo.. no entiendo por que no funciona.. Queres el arbol de directorios?


Título: Re: Protocolo HTTP, un dolor de cabeza...
Publicado por: Eternal Idol en 1 Abril 2014, 22:26 pm
Bueno, la conclusion es que el Live HTTP Headers NO es confiable.

Despues de Content-Length van 2 CRLF y el Content-Length hay que calcularlo bien, es todo lo que va despues de Content-Length.

PD. ¿Vos estabas caliente? Yo termine abriendo el WinDbg y poniendo un breakpoint en ws2_32!send  ;D



Código
  1. static TCHAR HTTP[] = "POST /php/core2.php HTTP/1.1\r\n"
  2.  "Host: www.montevideoaldia.com\r\n"
  3.  "User-Agent: Aleluya\r\n"
  4.  "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
  5.  "Accept-Language: es-ar,es;q=0.8,en-us;q=0.5,en;q=0.3\r\n"
  6.  "Referer: http://www.montevideoaldia.com/php/coso.html\r\n"
  7.  "Connection: keep-alive\r\n"
  8.  "Content-Type: multipart/form-data; boundary=---------------------------78302333330941\r\n"
  9.  "Content-Length: 142\r\n\r\n"
  10.  "-----------------------------78302333330941\r\n"
  11.  "Content-Disposition: form-data; name=\"VAR\"\r\n\r\n"
  12.  "TS\r\n"
  13.  "-----------------------------78302333330941--\r\n";


Título: Re: Protocolo HTTP, un dolor de cabeza...
Publicado por: Vaagish en 1 Abril 2014, 22:58 pm
NAA! SOS EL MEJOR!! Hoy conseguí entrada para ver al Indio en gualeguaychu, y ahora esto!

Citar
PD. ¿Vos estabas caliente? Yo termine abriendo el WinDbg y poniendo un breakpoint en ws2_32!send  ;D

Jajaja re desconfiado... yo no podía mas, hace meses que empece con esto..

Mil Gracias EI! Si precisas un server me avisas jaja

Saludos!


Título: Re: Protocolo HTTP, un dolor de cabeza...
Publicado por: Eternal Idol en 1 Abril 2014, 23:03 pm
NAA! SOS EL MEJOR!! Hoy conseguí entrada para ver al Indio en gualeguaychu, y ahora esto!

Esto seguro fue mas barato  ;D

Jajaja re desconfiado... yo no podía mas, hace meses que empece con esto..

Y es que no era confiable al final, asi copie identico, con los dos datos que mandaba y vi que funcionaba, despues saque el segundo y me avive de que el tamaño estaba mal al principio pero el doble CRLF despues de Content-Length no se ve en el GUI ni se graba en el archivo que genera el Live HTTP Headers.

Mil Gracias EI! Si precisas un server me avisas jaja

De nadas y se agradece la oferta.


Título: Re: Protocolo HTTP, un dolor de cabeza...
Publicado por: Vaagish en 1 Abril 2014, 23:22 pm
Si, maldito Live HTTP Headers, si hay algo que odio mas igual, es el mismo protocolo HTTP, es una bosta!

Citar
Esto seguro fue mas barato  ;D
La solución si, el dolor de cabeza que me dio.. mmm.. no se.. jajaja

Salu2!