質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Firefox

Mozilla Foundationによって作られた無料、オープンソース、クロスプラットフォームなウェブブラウザ

Q&A

1回答

9554閲覧

ChromeとFirefoxにおけるContent-Lengthの仕様

imaharu

総合スコア32

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Firefox

Mozilla Foundationによって作られた無料、オープンソース、クロスプラットフォームなウェブブラウザ

0グッド

2クリップ

投稿2018/11/12 11:50

編集2018/11/12 12:40

質問

  1. ChromeとFirefoxでContent-Lengthの処理に違いがあるのか?あるならばどのような違いがあるのか(詳細に記述した疑問が解決したい)

  2. GETの場合はContent-Lengthを0にするということなのですが、サイト内ではContent-Lengthに自然数を指定います。これは、なぜなのでしょうか?

GETを投げているのはクライアント側で該当サイトでは、サーバなので2の質問は取り消します

Content-Length: HTTP エンティティー・ヘッダー

お時間がない場合は、参考になるサイト等を教えて頂けると助かります。

詳細

Geekなページを参考にHTTPサーバの勉強をしております。

snprintf(buf, sizeof(buf), "HTTP/1.0 200 OK\r\n" "Content-Length: 20\r\n" "Content-Type: text/html\r\n" "\r\n" "HELLO\r\n");

においてContent-Lengthを20とするとHELLOが表示されません。

そこで、Chromeデベロッパー・ツールの機能のconsoleを確認すると

**net::ERR_CONTENT_LENGTH_MISMATCH 200 (OK)**というエラーメッセージが発生していたため

Content-Lengthを7にして再度コンパイルして実行するとHELLOが表示されました。

ここで、WebクライアントをFirefox。Content-Lengthを20にすると、Chromeとは異なり表示されます。

このことから、FirefoxとChromeのリクエストヘッダーの処理の仕方が異なるのではないかと疑問に持ち調べたのですが、納得するものがなかったので質問させていただきました。

よろしくお願いします

他に試したこと

// コード snprintf(buf, sizeof(buf), "HTTP/1.0 200 OK\r\n" "Content-Length: 20\r\n" "Content-Type: text/html\r\n" "\r\n" "HELLO\r\nHELLO\r\n");
Content-LengthChromeFirefox
コメントアウト表示されないHELLO HELLO
0表示されないHELLO HELLO
2HEHELLO HELLO
12HELLO HELLOHELLO HELLO
20表示されないHELLO HELLO

該当コードをそのままコンパイルすると、エラーが出るのでmacで動くコードを下記に示す

#include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> int main(){ int sock0; struct sockaddr_in addr; struct sockaddr_in client; unsigned len; int sock; int yes = 1; char buf[2048]; char inbuf[2048]; sock0 = socket(AF_INET, SOCK_STREAM, 0); if (sock0 < 0){ perror("socket"); return 1; } addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.s_addr = INADDR_ANY; setsockopt(sock0, SOL_SOCKET, SO_REUSEADDR, (const char *)&yes, sizeof(yes)); if (bind(sock0, (struct sockaddr *)&addr, sizeof(addr)) != 0){ perror("bind"); return 1; } if ( listen(sock0, 5) != 0){ perror("listen"); return 1; } memset(buf, 0, sizeof(buf)); snprintf(buf, sizeof(buf), "HTTP/1.0 200 OK\r\n" "Content-Length: 12\r\n" "Content-Type: text/html\r\n" "\r\n" "HELLO\r\nHELLO"); while(1) { len = sizeof(client); sock = accept(sock0, (struct sockaddr *)&client, &len); if (sock < 0){ perror("accept"); break; } memset(inbuf, 0, sizeof(inbuf)); recv(sock, inbuf, sizeof(inbuf), 0); printf("%s", inbuf); send(sock, buf, (int)strlen(buf), 0); close(sock); } close(sock0); return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

macof

2018/11/13 10:24

RFC7230の3.3.3.を見る限りではFirefox側の挙動が違反しているように見えますね(レスポンスの破棄を行なっていないので)
imaharu

2018/11/13 12:17

回答ありがとうございます。メッセージを妥当でないものとして却下する。 重複されたヘッダ値を[ 10 進値を包含している, 1 個の妥当な Content-Length ヘッダ ]に置換する。 の部分ですかね。FireFoxの内部を見たくなってきました。挙動違反に伴うセキュリテイの穴などがあるかご存知でしょうか?
macof

2018/11/13 12:29

Content-Lengthを鵜呑みにしてバッファ確保とかしてればあり得なくはないですけど、このフィールドは昔から割と良く嘘吐かれるのでそんな実装にはしてないと思いますよ。昔は2GB超えるファイルで負数になるとかも良くありました。
guest

回答1

0

1.一般論としては、規格に外れた入力に対して、
考え方1:エラーとして処理しない、または処理を途中でやめる
考え方2:適当に処理する。エラーメッセージだけは出すかも、出さないかも
という2つの異なった考え方があります。
それぞれに従っているのでしょう。

「出力は厳密に(規格に従う)、入力は(規格に外れていても)寛容に」という言葉もありますね。

2.これは質問の意味がわかりません。

投稿2018/11/12 12:30

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問