Domanda

Alla ricerca di un po 'di aiuto, ho attualmente scritto un server HTTP. Attualmente gestisce le richieste GET fini. Tuttavia, durante l'utilizzo del lettore POST tamponata sembra bloccarsi. Quando la richiesta viene fermato il resto del flusso di ingresso viene letto tramite il lettore tamponata. Ho trovato un paio di cose su google. Ho provato a cambiare il CRLF e la versione del protocollo 1,1-1,0 (browser rendono automaticamente richieste come 1.1) Tutte le idee o aiuto sarebbe apprezzato. Grazie

È stato utile?

Soluzione 3

Questa non è sicuro! Ma mostra come ottenere i dati POST durante un flusso di input dopo le intestazioni HTTP iniziali.

Anche questo funziona solo per i dati POST in arrivo come "esempio = true & bad = false", ecc.

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();
    }
}

Altri suggerimenti

Sono d'accordo con Hans che si dovrebbe utilizzare una libreria standard e ben collaudato per fare questo. Tuttavia, se si sta scrivendo un server per conoscere HTTP, ecco alcune informazioni a fare quello che vuoi fare.

Non si può davvero usare un BufferedReader perché tampona l'ingresso e potrebbe leggere troppi byte dal socket. Ecco perché il codice è appeso, il BufferedReader sta cercando di leggere più byte che sono disponibili sulla presa (in quanto i dati POST non ha un fine linea), ed è in attesa di ulteriori byte (che non saranno mai disponibili) .

Il processo per analizzare semplicemente una richiesta POST è utilizzare l'InputStream direttamente

  
      
  • Per ogni riga nell'intestazione   leggere un byte alla volta fino ad ottenere una '\ r' e poi un '\ n'

  •   
  • Cercare una riga che inizia con "Content-Length:"., Estrarre il numero alla fine di quella linea

  •   
  • Quando si ottiene una riga di intestazione che è vuota, il gioco è fatto con le intestazioni.

  •   
  • Ora leggere esattamente il # di byte che è venuto dalla intestazione Content-Length.

  •   

Ora è possibile scrivere la vostra risposta.

Non sarebbe scrivere il mio propria implementazione. Guarda le seguenti componenti esistenti, se si vuole:

Come karoroberts detto che controlla la lunghezza del contenuto inviato nel post. Ma è ancora possibile usare BufferedReader.

Basta controllare per l'intestazione Content-Length per le dimensioni di esso e dopo aver terminato la lettura di tutte le intestazioni è possibile impostare un array di caratteri di quelle dimensioni e rendere la lettura del contenuto POST:

char [] tampone = new char [contentLength]; request.read (buffer);

Dove richiesta è BufferedReader. Se è necessario il contenuto POST in una stringa, è possibile utilizzare: String.valueOf (buffer);

Nota:. BufferedReader.read restituisce un int dei personaggi readed, così da poter controllare lì per incongruenze con l'intestazione Content-Length

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top