Protocolo HTTP, un dolor de cabeza...

Iniciado por Vaagish, 1 Abril 2014, 02:45 AM

0 Miembros y 1 Visitante están viendo este tema.

Vaagish

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 (cpp) [Seleccionar]

SOCKET StartUpSocket()
{
int rtn;

if ((rtn = WSAStartup(MAKEWORD(2, 2), &WSA)) != 0) return 1;
if ((Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) return 1;

HOSTENT *host = gethostbyname("www.elhost.com");

if (!host) return -1;

char *hostip = inet_ntoa(*(struct in_addr*)(host->h_addr_list[0]));

Server.sin_family = AF_INET;
Server.sin_port = htons(PUERTO);
Server.sin_addr.s_addr = inet_addr(hostip);

if ((rtn = connect(Socket, (struct sockaddr*) &Server, sizeof(Server))) == SOCKET_ERROR) return 1;

return Socket;
}


Y lo utilizo asi:

Código (cpp) [Seleccionar]
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!

eferion

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.

ThePinkPanther

#2
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.

CitarPOST /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

x64core

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.

Eternal Idol

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.

char post_msg[] = {  
"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"
};


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 ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

#5
Gracias por responder compas! Es que puse ahi:

CitarBueno, 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:
Citarel servidor responde 200 OK, pero el dato no llega

Esta bien, concuerdo en esto
CitarPD. 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:
Citarestá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.. :-(

Eternal Idol

¿Probaste con la cadena que deje? ¿Que resultado tuvo? 400 no puede ser ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

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 :/

Eternal Idol

#8
Cita de: Vaagish en  1 Abril 2014, 20:04 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>
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

CitarEs 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"