He creado una aplicación C++ utilizando WinSck, que tiene un pequeño (maneja solo algunas características que necesito) servidor http implementado. Esto se usa para comunicarse con el mundo exterior usando solicitudes http. Funciona, pero a veces las solicitudes no se manejan correctamente, porque el análisis falla. Ahora estoy bastante seguro de que las solicitudes están formadas correctamente, ya que las envían los principales navegadores web como firefox/chrome o perl/C# (que tienen módulos http/dll).Cómo analizar correctamente las solicitudes HTTP entrantes
Después de algunas depuraciones descubrí que el problema está en la recepción del mensaje. Cuando el mensaje viene en más de una parte (no se lee en una llamada recv()
), a veces el análisis falla. He pasado por numerosos intentos sobre cómo resolver esto, pero nada parece ser lo suficientemente confiable.
Lo que hago ahora es que leo en los datos hasta que encuentre la secuencia "\r\n\r\n"
que indica el final del encabezado. Si WSAGetLastError()
informa algo diferente a 10035 (conexión cerrada/fallida) antes de que se encuentre dicha secuencia, descarto el mensaje. Cuando sé que tengo todo el encabezado, lo analizo y busco información sobre la longitud del cuerpo. Sin embargo, no estoy seguro de si esta información es obligatoria (creo que no) y qué debo hacer si no hay tal información, ¿significa que no habrá un cuerpo? Otro problema es que no sé si debo buscar un "\r\n\r\n"
después del cuerpo (si su longitud es mayor que cero).
¿Alguien sabe cómo analizar confiablemente un mensaje http?
Nota: sé que hay implementaciones de servidores http por ahí. Quiero lo mío por varias razones. Y sí, reinventar la rueda es malo, eso también lo sé.
A menos que esté haciendo esto por diversión, consulte el enlace http-analizador que Jack ha proporcionado a continuación. Se ve brillante, y no se atreve a secuestrar su zócalo/lo que sea. –
@Matt Joiner: lo miré y de hecho se ve muy bien. Pero realmente necesito escribir el mío, que solo admite una fracción de todas las funciones de http y, al mismo tiempo, conoce algunos comandos especiales. Si necesitaba un servidor http completo, definitivamente no escribiría el mío. – PeterK
Tenga en cuenta que el código provisto es __tiny__ y no le impone requisitos. Puede detenerlo, ignorarlo y envolverlo de la manera que desee mediante la personalización de las pocas devoluciones de llamada que proporciona. Simpatizo con el deseo de hacer las cosas usted mismo, pero esto le ahorrará horas de depuración y errores debido a la entrada imprevista más adelante. –