2

私が本当に抽出する必要がある情報は次のとおりです。

a)GET依頼か否か

b) ファイルアドレス (例: index.html)

c) ホスト情報 (例: localhost:8081)

私は今これを行うコードを持っています (投稿の下部を参照) が、非効率的で静的で、ホスト情報を取得していないようです。

したがって、C で HTTP リクエストを解析するための適切なソリューションが必要です。乾杯!

HTTP リクエスト

GET /index.html HTTP/1.1
Host: localhost:8081
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.70 Safari/537.17
DNT: 1
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,en-GB;q=0.6
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

現在のコード

int parsehttp(char *inputstring, int *type, char *getaddress) {
    if((strncmp(inputstring, "GET", 3)) == 0) {
        *type = 1;
    } else {
        *type = 0;
    }
    char firstline[BUFLEN] = "";
    int charoffset = getlineend(inputstring); //this function returns the int offset of '\r\n'
    strncpy(firstline, inputstring, charoffset-2);
    firstline[charoffset-1] = '\0';
    sscanf(firstline,"%*s %s %*s",getaddress);
    inputstring = (inputstring + charoffset);
    return 1;
}
4

2 に答える 2

3

あなたを助けるかもしれないのは、strstr-functionです。指定した文字列内で特定の文字列を見つけようとします。HTTP リクエストは 0xD,0xA で終わる行で構成されているため、行を分割できます。通常、テキスト行の情報は空白を使用して区切られます。したがって、「GET」または「POST」を見つけるには、使用します

char* getpost = strstr("GET /index.html HTTP/1.1", "GET");

getpost が != NULL の場合、文字列が得られ、GET または POST の後でそれを切り取ることができます。

次に、「Host:」を探し、0xD,0xA に到達するまでその部分をスキップして、ホスト アドレスを取得します。

strstrのマンページについては、strstr を参照してください。

于 2013-02-15T12:03:39.283 に答える
0

これが非効率であることを心配する必要はありません。結局のところ、これはネットワークであり、CPU、キャッシュ、RAM よりも常にはるかに遅くなります。

http サーバーを作成している場合、気にする必要があるのは、メモリの安全性と、クライアントが予期しないものを送信した場合のコードの動作だけです。

いくつかの例: あなたのコード (およびこれに続くコード / はその解析に依存するコード) は、次の場合に何をしますか?

  • クライアントは 10 MB を超えるデータを送信しますが、すべて不正な形式です。たとえば、改行がまったくありません。
  • クライアントが間違った 10 進数を送信する (つまり、ip/port/content-length)
  • クライアントは正しいデータを送信しますが、悪意を持ってゆっくりと送信します (たとえば、1 秒あたり 1 バイト)。
  • ...はるかに。
于 2013-02-15T12:08:41.347 に答える