質問
-
ChromeとFirefoxでContent-Lengthの処理に違いがあるのか?あるならばどのような違いがあるのか(詳細に記述した疑問が解決したい)
-
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-Length | Chrome | Firefox |
---|---|---|
コメントアウト | 表示されない | HELLO HELLO |
0 | 表示されない | HELLO HELLO |
2 | HE | HELLO HELLO |
12 | HELLO HELLO | HELLO 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; }
