各 GET/POST でタブ区切り形式の HTTP ヘッダー要求と応答データがあり、異なる行で応答します。このデータは、1 つの TCP フローに対して複数の GET、POST、および REPLY があるようなものです。これらのケースから最初の有効な GET - REPLY ペアのみを選択する必要があります。例(簡略化)は次のとおりです。
ID Source Dest Bytes Type Content-Length host lines....
1 A B 10 GET NA yahoo.com 2
1 A B 10 REPLY 10 NA 2
2 C D 40 GET NA google.com 4
2 C D 40 REPLY 20 NA 4
2 C D 40 GET NA google.com 4
2 C D 40 REPLY 30 NA 4
3 A B 250 POST NA mail.yahoo.com 5
3 A B 250 REPLY NA NA 5
3 A B 250 REPLY 15 NA 5
3 A B 250 GET NA yimg.com 5
3 A B 250 REPLY 35 NA 5
4 G H 415 REPLY 10 NA 6
4 G H 415 POST NA facebook.com 6
4 G H 415 REPLY NA NA 6
4 G H 415 REPLY NA NA 6
4 G H 415 GET NA photos.facebook.com 6
4 G H 415 REPLY 50 NA 6
....
したがって、基本的には、ID ごとに 1 つの要求と応答のペアを取得し、それらを新しいファイルに書き込む必要があります。
'1' の場合は 1 組なので簡単です。しかし、両方の行が GET、POST、または REPLY である誤ったケースもあります。したがって、そのような場合は無視されます。
「2」の場合、最初の GET - REPLY ペアを選択します。
「3」の場合、最初の GET を選択しますが、最初の GET には Content-Length がないため、2 番目の REPLY を選択します (サブシークェスト REPLY がより適切な候補になります)。
「4」の場合、最初のヘッダーは REPLY にできないため、最初の POST (または GET) を選択します。2 番目の GET の後に REPLY を選択しませんが、POST の後にコンテンツの長さが欠落していても、REPLY はその後に来るためです。したがって、最初の REPLY を選択します。
したがって、最適な要求と応答のペアを選択したら、それらを 1 行でペアにする必要があります。たとえば、出力は次のようになります。
ID Source Dest Bytes Type Content-Length host ....
1 A B 10 GET 10 yahoo.com
2 C D 40 GET 20 google.com
3 A B 250 POST 15 mail.yahoo.com
4 G H 415 POST NA facebook.com
実際のデータには他にも多くのヘッダーがありますが、この例は必要なものをほとんど示しています。Perl でこれを行うにはどうすればよいでしょうか。私はほとんど最初に立ち往生しているので、一度に1行しかファイルを読むことができませんでした.
open F, "<", "file.txt" || die "Cannot open $f: $!";
while (<F>) {
chomp;
my @line = split /\t/;
# get the valid pairs for cases with multiple request - replies
# get the paired up data together
}
close (F);
*編集: 各 ID の HTTP ヘッダー行の数を示す列を追加しました。これは、チェックする後続の行数を知るのに役立つ場合があります。また、最初のヘッダー行が REPLY になるように ID '4' を変更しました。*