Question

À la recherche d'un peu d'aide, j'ai actuellement écrit un serveur HTTP.Il gère actuellement correctement les requêtes GET.Cependant, lors de l'utilisation de POST, le lecteur tamponné semble se bloquer.Lorsque la requête est arrêtée, le reste du flux d'entrée est lu via le lecteur tamponné.J'ai trouvé quelques choses sur Google.J'ai essayé de changer le CRLF et la version du protocole de 1.1 à 1.0 (les navigateurs font automatiquement des requêtes en 1.1). Toute idée ou aide serait appréciée.Merci

Était-ce utile?

La solution 3

Ce n'est pas sûr !Mais montre comment obtenir les données POST lors d'un flux d'entrée après les en-têtes HTTP initiaux.

Cela ne fonctionne également que pour les données POST entrantes sous la forme "example=true&bad=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();
    }
}

Autres conseils

Je suis d'accord avec Hans que vous devez utiliser une bibliothèque standard et bien testé pour le faire. Toutefois, si vous écrivez un serveur pour en savoir plus sur HTTP, voici quelques informations sur ce que vous voulez faire.

Vous ne pouvez vraiment pas utiliser un BufferedReader car il tamponne l'entrée et peut lire trop d'octets de la prise. Voilà pourquoi votre code est suspendu, le BufferedReader essaie de lire plus d'octets sont disponibles sur la prise (puisque les données POST ne pas une fin de ligne), et il est en attente de plus d'octets (qui ne sera jamais disponible) .

Le processus pour analyser simplement une demande POST est d'utiliser le InputStream directement

  
      
  • Pour chaque ligne dans l'en-tête   lire un octet à la fois jusqu'à ce que vous obtenez un « \ r » et un « \ n »

  •   
  • Recherchez une ligne qui commence par "Content-Length:"., Extraire le numéro à la fin de cette ligne

  •   
  • Lorsque vous obtenez une ligne d'en-tête qui est vide, vous avez terminé avec les en-têtes.

  •   
  • Maintenant, lisez exactement le # d'octets qui venait de l'en-tête Content-Length.

  •   

Maintenant, vous pouvez écrire votre réponse.

n'écrirais pas ma propre mise en œuvre. Regardez les composants existants suivants, si vous voulez:

Comme karoroberts dit que vous devez vérifier la longueur du contenu envoyé dans le POST. Mais vous pouvez toujours utiliser BufferedReader.

Juste pour vérifier l'en-tête Content-Length pour la taille de celui-ci et après avoir terminé la lecture de tous les en-têtes, vous pouvez définir un tableau de caractères de cette taille et de faire la lecture du contenu POST:

char [] buffer = new char [ContentLength]; request.read (tampon);

Si la demande est le BufferedReader. Si vous avez besoin du contenu POST dans une chaîne, vous pouvez utiliser: String.valueOf (buffer);

Note:. BufferedReader.read retourne un entier des personnages readed, de sorte que vous pouvez vérifier il des incohérences avec l'en-tête Content-Length

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top