8
votes

Analyse de la demande HTTP RAW

Je travaille sur le jeu de données de trafic HTTP composé de poste complet et d'obtenir la demande comme indiqué ci-dessous. J'ai écrit du code dans Java qui a séparé chacune de ces demandes et l'a enregistré comme élément de chaîne dans la liste des matrices. Maintenant, je suis confus Comment analyser cette requête HTTP RAW en Java est là une méthode meilleure que la analyse manuelle? xxx


6 commentaires

Où avez-vous besoin de l'analyser? Dans le servlet ou la technologie similaire (ou) classe Java unie?


D'où vient les données? Et que devez-vous analyser?


Si vous devez absolument faire directement HTTP et ce n'est pas pour une classe, je suggère fortement d'utiliser quelque chose comme l'Apache Commons httpClient. Il y a beaucoup de pièges à le faire vous-même. (E.G. Encodage de transfert chunded)


Je travaille actuellement avec Apache Common mais rien n'a travaillé pour moi jusqu'à présent. Dois-je transformer la chaîne de demande brute pour le faire fonctionner?


@Aliahmad - qu'essayez-vous d'accomplir exactement? Vous n'avez pas besoin d'analyser manuellement le flux de données HTTP si vous utilisez les classes httpclient.


Vous avez demandé comment analyser HTTP, mais cela peut signifier beaucoup de choses en fonction de ce que vous essayez d'extraire du courant brut. Sans indiquer votre objectif ultime, la question se déroule d'être «non constructive» pour ainsi.


3 Réponses :


7
votes

i [am] Travailler sur [A] jeu de données de trafic HTTP composé de poste complet et d'obtenir la demande [S]

Vous voulez donc analyser un fichier ou une liste contenant plusieurs demandes HTTP. Quelles données voulez-vous extraire? De toute façon ici est une classe d'analyse HTTP Java, qui peut lire La méthode, la version et l'URI utilisées dans la ligne de demande et qui lit tous les en-têtes dans une haquetable.

Vous pouvez l'utiliser ou écrire vous-même si vous avez envie de réinventer la roue. Jetez un coup d'œil au RFC pour voir quelle demande ressemble à afin d'analyser correctement: xxx


0 commentaires

19
votes

Voici un analyseur de requête HTTP Général pour tous les types de méthodes (obtenir, post, etc.) pour votre conviction:

    package util.dpi.capture;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.Hashtable;

/**
 * Class for HTTP request parsing as defined by RFC 2612:
 * 
 * Request = Request-Line ; Section 5.1 (( general-header ; Section 4.5 |
 * request-header ; Section 5.3 | entity-header ) CRLF) ; Section 7.1 CRLF [
 * message-body ] ; Section 4.3
 * 
 * @author izelaya
 *
 */
public class HttpRequestParser {

    private String _requestLine;
    private Hashtable<String, String> _requestHeaders;
    private StringBuffer _messagetBody;

    public HttpRequestParser() {
        _requestHeaders = new Hashtable<String, String>();
        _messagetBody = new StringBuffer();
    }

    /**
     * Parse and HTTP request.
     * 
     * @param request
     *            String holding http request.
     * @throws IOException
     *             If an I/O error occurs reading the input stream.
     * @throws HttpFormatException
     *             If HTTP Request is malformed
     */
    public void parseRequest(String request) throws IOException, HttpFormatException {
        BufferedReader reader = new BufferedReader(new StringReader(request));

        setRequestLine(reader.readLine()); // Request-Line ; Section 5.1

        String header = reader.readLine();
        while (header.length() > 0) {
            appendHeaderParameter(header);
            header = reader.readLine();
        }

        String bodyLine = reader.readLine();
        while (bodyLine != null) {
            appendMessageBody(bodyLine);
            bodyLine = reader.readLine();
        }

    }

    /**
     * 
     * 5.1 Request-Line The Request-Line begins with a method token, followed by
     * the Request-URI and the protocol version, and ending with CRLF. The
     * elements are separated by SP characters. No CR or LF is allowed except in
     * the final CRLF sequence.
     * 
     * @return String with Request-Line
     */
    public String getRequestLine() {
        return _requestLine;
    }

    private void setRequestLine(String requestLine) throws HttpFormatException {
        if (requestLine == null || requestLine.length() == 0) {
            throw new HttpFormatException("Invalid Request-Line: " + requestLine);
        }
        _requestLine = requestLine;
    }

    private void appendHeaderParameter(String header) throws HttpFormatException {
        int idx = header.indexOf(":");
        if (idx == -1) {
            throw new HttpFormatException("Invalid Header Parameter: " + header);
        }
        _requestHeaders.put(header.substring(0, idx), header.substring(idx + 1, header.length()));
    }

    /**
     * The message-body (if any) of an HTTP message is used to carry the
     * entity-body associated with the request or response. The message-body
     * differs from the entity-body only when a transfer-coding has been
     * applied, as indicated by the Transfer-Encoding header field (section
     * 14.41).
     * @return String with message-body
     */
    public String getMessageBody() {
        return _messagetBody.toString();
    }

    private void appendMessageBody(String bodyLine) {
        _messagetBody.append(bodyLine).append("\r\n");
    }

    /**
     * For list of available headers refer to sections: 4.5, 5.3, 7.1 of RFC 2616
     * @param headerName Name of header
     * @return String with the value of the header or null if not found.
     */
    public String getHeaderParam(String headerName){
        return _requestHeaders.get(headerName);
    }
}


0 commentaires

5
votes

Si vous voulez simplement envoyer la demande brute, c'est très facile, il est très facile, il suffit d'envoyer la chaîne réelle à l'aide d'une prise TCP!

quelque chose comme ceci: p>

    Socket socket = new Socket(host, port);

    BufferedWriter out = new BufferedWriter(
            new OutputStreamWriter(socket.getOutputStream(), "UTF8"));

    for (String line : getContents(request)) {
        System.out.println(line);
        out.write(line + "\r\n");
    }

    out.write("\r\n");
    out.flush();


0 commentaires