回答編集履歴
1
データ例示部分を修正、加筆
answer
CHANGED
@@ -2,9 +2,10 @@
|
|
2
2
|
|
3
3
|
抜けているのではなく、`ReadLineAsync`で、POSTのコンテントボディ部受信の時に最後の改行を待ってしまっています。
|
4
4
|
|
5
|
-
以下は、ご提示のWindows Formアプリケーションのクライアントから送出したHTTPリクエストです。(Windows 7 + Visual Studio 2017 + .NET Framework 4.6.1の環境で採取したデータです)
|
5
|
+
以下は、ご提示のWindows Formアプリケーションのクライアントから送出したHTTPリクエストと、そのリクエストをバイナリ16進数でダンプしたものです。(Windows 7 + Visual Studio 2017 + .NET Framework 4.6.1の環境で採取したデータです)
|
6
6
|
|
7
7
|
```plain
|
8
|
+
$ cat res1.txt
|
8
9
|
POST /index.html HTTP/1.1
|
9
10
|
Content-Type: application/x-www-form-urlencoded
|
10
11
|
Host: localhost:1234
|
@@ -13,7 +14,22 @@
|
|
13
14
|
Connection: Keep-Alive
|
14
15
|
|
15
16
|
word=Internet&id=1
|
17
|
+
|
18
|
+
$ od -t xC res1.txt
|
19
|
+
0000000 50 4f 53 54 20 2f 69 6e 64 65 78 2e 68 74 6d 6c
|
20
|
+
0000020 20 48 54 54 50 2f 31 2e 31 0d 0a 43 6f 6e 74 65
|
21
|
+
0000040 6e 74 2d 54 79 70 65 3a 20 61 70 70 6c 69 63 61
|
22
|
+
0000060 74 69 6f 6e 2f 78 2d 77 77 77 2d 66 6f 72 6d 2d
|
23
|
+
0000100 75 72 6c 65 6e 63 6f 64 65 64 0d 0a 48 6f 73 74
|
24
|
+
0000120 3a 20 6c 6f 63 61 6c 68 6f 73 74 3a 31 32 33 34
|
25
|
+
0000140 0d 0a 43 6f 6e 74 65 6e 74 2d 4c 65 6e 67 74 68
|
26
|
+
0000160 3a 20 31 38 0d 0a 45 78 70 65 63 74 3a 20 31 30
|
27
|
+
0000200 30 2d 63 6f 6e 74 69 6e 75 65 0d 0a 43 6f 6e 6e
|
28
|
+
0000220 65 63 74 69 6f 6e 3a 20 4b 65 65 70 2d 41 6c 69
|
29
|
+
0000240 76 65 0d 0a 0d 0a 77 6f 72 64 3d 49 6e 74 65 72
|
30
|
+
0000260 6e 65 74 26 69 64 3d 31
|
31
|
+
0000270
|
16
32
|
```
|
17
|
-
コンテントボディ部はヘッダとの区切り、空行を挟んでの`word=Internet&id=1`の部分ですが、この文字列の末尾は改行では終わっていません。ヘッダーでは`Content-Length: 18`となっているので、18文字で正しいです。クライアント側に問題はありません。
|
33
|
+
コンテントボディ部はヘッダとの区切り、空行(0Dh+0Ah)を挟んでの`word=Internet&id=1`の部分ですが、この文字列の末尾は改行では終わっていません。ヘッダーでは`Content-Length: 18`となっているので、18文字で正しいです。クライアント側に問題はありません。
|
18
34
|
|
19
35
|
ヘッダー部に`Content-Length:`フィールドがある限り、コンテントボディのデータ長は`Content-Length:`フィールドで記述されているバイト長です。データの末尾に改行を期待する`StreamReader.ReadLine`系のメソッドを使うべきではありませんし、改行で終わる保証はありません。ヘッダー部の`Content-Length: `で示されるデータ長分を読み出し、HTTPレスポンスを返すようにサーバー側を実装する必要があります。
|