teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

データ例示部分を修正、加筆

2018/09/07 01:52

投稿

dodox86
dodox86

スコア9416

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レスポンスを返すようにサーバー側を実装する必要があります。