Pregunta

Buscando un poco de ayuda, he Actualmente escrito un servidor HTTP. En la actualidad las manijas peticiones GET bien. Sin embargo, durante el uso de la POST al lector tamponada parece colgar. Cuando la solicitud se para el resto de la secuencia de entrada se lee a través del lector tamponada. He encontrado algunas cosas en Google. He intentado cambiar el CRLF y la versión de protocolos desde 1.1 a 1.0 (navegadores hacen automáticamente las solicitudes como 1.1) Cualquier idea o ayuda sería apreciada. Gracias

¿Fue útil?

Solución 3

Esto no es seguro! Pero muestra la forma de obtener los datos enviados durante un flujo de entrada después de la inicial de encabezados HTTP.

Esto también sólo funciona para los datos POST que vienen como "ejemplo = true y mala = false", etc.

private HashMap hashMap = new HashMap();
private StringBuffer buff = new StringBuffer();
private int c = 0;
private String[] post;    public PostInputStream(InputStream in) {

    try {
        //Initalizes avaliable buff
        if (in.available() != 0) {
            this.buff.appendCodePoint((this.c = in.read()));
            while (0 != in.available()) {
                //Console.output(buff.toString());
                buff.appendCodePoint((this.c = in.read()));
            }

            this.post = buff.toString().split("&");

            for (int i = 0; i < this.post.length; i++) {
                String[] n = this.post[i].split("=");
                if (n.length == 2) {
                    hashMap.put(URLDecoder.decode(n[0], "UTF-8"), URLDecoder.decode(n[1], "UTF-8"));
                } else {
                    Console.error("Malformed Post Request.");
                }
            }
        } else {
            Console.error("No POST Data");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Otros consejos

Estoy de acuerdo con Hans que se debe utilizar una biblioteca estándar y bien probado para hacer esto. Sin embargo, si usted está escribiendo un servidor para aprender sobre HTTP, aquí hay algo de información en hacer lo que quiere hacer.

Usted realmente no puede utilizar un BufferedReader porque amortigua la entrada y podría leer demasiados bytes desde el zócalo. Es por eso que su código está colgando, el BufferedReader está intentando leer más bytes que están disponibles en el zócalo (ya que los datos POST no tiene un final de línea), y se está a la espera de más bytes (que no estará disponible) .

El proceso para simplemente analizar una solicitud POST es utilizar el InputStream directamente

  
      
  • Para cada línea en la cabecera   leer un byte a la vez hasta que se obtiene una '\ r' y luego a '\ n'

  •   
  • Busque una línea que comienza con "Content-Length:"., Extraen el número al final de esa línea

  •   
  • Cuando se obtiene una línea de cabecera que está vacío, que haya terminado con cabeceras.

  •   
  • Ahora lee exactamente el # de bytes que venía de la cabecera Content-Length.

  •   

Ahora usted puede escribir su respuesta.

¿No escribir mi propia aplicación. Vistazo a los siguientes componentes existentes, si desea:

Como karoroberts dijo que hay que comprobar la longitud de los contenidos enviados por correo. Pero todavía se puede usar BufferedReader.

Sólo tiene que comprobar la cabecera Content-Length para el tamaño de la misma y después de terminar la lectura de todas las cabeceras se puede establecer una matriz de caracteres de ese tamaño y hacer la lectura del contenido de la POST:

char [] buffer = nuevo char [contentLength]; request.read (tampón);

Cuando la solicitud es el BufferedReader. Si necesita el contenido POST en una cadena, puede utilizar: String.valueOf (buffer);

Nota:. BufferedReader.read devuelve un int de los personajes readed, por lo que se puede comprobar que hay inconsistencias con la cabecera Content-Length

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top