これは有効なHTTPレスポンスですか?

私はすべての要求に対して次のように応答するC ++を使用してWebサーバーを作成しています。

static std::string rsp[] = { 
    "HTTP/1.1 200 OK\r\n",
    "Server: WebServer\r\n",
    "Content-Type: text/html\r\n",
    "Content-Length: 3\r\n",
    "Connection: close\r\n",
    "\r\n",
    "123"
};

コンテンツ「123」をブラウザに正常に表示することができる。しかし、私がapache-abを使ってテストを行うと、abは常に次のようなエラーを表示します:

ab -n 1 -c 1 http://127.0.0.1:1080/
apr_socket_recv: Connection reset by peer (104)

私はソケットをあまりにも早く閉じていると思ったので、close()関数にコメントしました。しかし、ちょうどホールド、abは完全な応答を待っているようです。

3
@ChrisMorgan、MIMEは、 \ r \ n はMIMEドキュメントのヘッダーで終わる正規の行(HTTP応答)であると述べています。
追加された 著者 d11wtq,
なぜ \ n ではなく \ r \ n ですか?
追加された 著者 Chris Morgan,
OK、そうです。
追加された 著者 Chris Morgan,

1 答え

あなたのブラウザで応答(123)を正しくレンダリングすることができれば、サーバーに何も問題はないが、サーバーに送信された要求はサーバーが理解できないことを意味します。

abの要求は、必ずしもWebブラウザの要求と同じではありません。そして、abは完全にhttp 1.1申し立て人ではなく、http1.0クライアントです。

"It(ab)はHTTP/1.xを完全に実装しておらず、" expected "   応答形式。

ソース

これを試してください:
verbosity引数を使用して、サーバーに送信されているリクエストを確認してください: ab -n 5 -c 5 -v 10 http://127.0.0.1:8000/ 次のようなものが表示されます。

    GET/HTTP/1.0
    Host: 127.0.0.1:8000
    User-Agent: ApacheBench/2.3
    Accept: */*
  1. 火かき棒などを使用して、ブラウザから送信されたリクエストを取得します。
  2. さあ、それに合わせて、送信されるリクエストの違いを見てください。 ab -H を使用して、これらのカスタムヘッダーをWebサーバーにabから送信します。
1
追加された
私はあなたが答えを見つけてうれしいです。
追加された 著者 zengr,
ありがとうございますzengr。理由を見つけました。私のサーバーはソケットをあまりにも早く閉じています。これは、close(fd)の代わりにshutdown(fd、RD)を呼び出すことで解決できます。
追加された 著者 fatmck,