¿Crees que la secuencia de caracteres de la mezcla del protocolo http con la secuencia de bytes no es un buen diseño?

En primer lugar, cuando digo flujo de caracteres de mezcla de protocolo http con flujo de bytes, me refiero a que el encabezado de solicitud es flujo de caracteres y el cuerpo de solicitud es flujo de bytes (especificado por la longitud del contenido), están separados por una línea vacía.

Este diseño dificulta la implementación de http. Por ejemplo, si usa java para implementar un servidor http, no puede usar dicho código porque BufferedReader almacenará algunos bytes para leer una línea.

InputStream   stream=socket.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(stream));
String line;
while( !(line=reader.readLine()).equals("") ){
    //do something with line
}
//from stream to read content-length bytes
stream.read(...)

Sería más fácil implementar el protocolo http si usa los primeros dos bytes a la longitud especificada del encabezado de solicitud en lugar de usar una línea vacía.

Respuesta 1

No es solo un mal diseño ... está roto. Lo más probable es que BufferedReaderlea la primera parte del cuerpo de la solicitud en su búfer. Entonces, cuando lees la transmisión al final, no obtendrás todo el cuerpo.

Una vez que haya envuelto un InputStreamarchivo, no debe usarlo directamente ... especialmente si el envoltorio almacena en búfer.


La mejor manera de implementar esto es usar una implementación existente del lado del servidor HTTP. La biblioteca Apache HTTP Components es una buena alternativa a considerar.

Si tiene que implementar esto usted mismo, entonces la solución simple es:

  1. Envuelva el InputStreamen a BufferedInputStream.
  2. Use el BufferedInputStreampara leer las líneas del encabezado de un byte a la vez y acumule las líneas y conviértalas en una Cadena.
  3. Usa el BufferedInputStreampara leer el cuerpo.

Siento que el estúpido diseño del protocolo HTTP hace que la java.iobiblioteca sea inútil.

Yo no diría eso. El problema es que el protocolo HTTP potencialmente requiere que un cliente cambie la forma en que interpreta los caracteres / bytes de un mensaje de solicitud o respuesta a la mitad del mensaje. Pero si lo piensas, eso no es una cosa irrazonable. Las alternativas serían:

  • para enviar mensajes separados que aumentarían los gastos generales del protocolo, o
  • codifique y envíe la línea de solicitud / respuesta y los encabezados como bytes en lugar de como caracteres.

Lo que realmente tenemos es un caso de uso complicado que es demasiado inusual para ser compatible con las java.iobibliotecas genéricas . Una biblioteca de soporte de protocolo se encargaría de esto ... si pudieras usar una.

Respuesta: 2

Tengo este código simple, que hace que llegue a un servicio web. Por alguna razón no se puede conectar y da el error en el registro unknownHostException Este es el código: String URL = "http: //services.sapo.pt / ...

Estoy tratando de generar la sección CDATA usando el siguiente código. Mientras se cumplen otras declaraciones, las secciones de CDATA todavía salen como texto sin sus etiquetas adjuntas (CDATA). Qué soy yo ...

Configuré un rectángulo de dibujo para dibujar texto formateado simple primero alineado a la izquierda como * elemento 1 [1] Algo contenido [2] Algo más <a> algo más ...

El siguiente código es para un proyecto de Google App Engine. ¿Por qué recibo un error de transmisión cerrada sin ver ninguna línea devuelta? Estoy seguro de que la página a la que apunta la URL está activa. URL url = nueva URL ("...