我以每個GET/POST的製表符分隔形式提供HTTP頭請求和回覆數據,並在不同的行中進行回覆。這個數據是這樣的,一個TCP流有多個GET,POST和REPLY。我只需要從這些案例中選擇第一個有效的GET - REPLY對。一個例子(簡體)是:Perl在不同情況下找到有效的行對
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'只是一對,所以很容易。 但是也有假兩種情況都是GET,POST或REPLY。所以,這種情況被忽略。
對於'2',我會選擇第一個GET - REPLY對。
對於'3',我會選擇第一個GET,但第二個REPLY,因爲Content-Length在第一個中不存在(使得最後的REPLY成爲更好的候選者)。
對於'4',我會選擇第一個POST(或GET),因爲第一個標題不能是REPLY。即使POST之後的內容長度丟失,我也不會在第二次GET之後選擇REPLY,因爲之後有REPLY。所以我只會選擇第一個REPLY。
因此,在選擇最佳請求和回覆對之後,我需要將它們組合在一條線上。對於例如,輸出將是:
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中如何做到這一點?我幾乎陷入了困境,因此我一次只能讀取一行文件。
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);
* 編輯:我已添加一個附加列給出HTTP標題行用於每個ID的數目。這可能有助於瞭解後續要檢查的行數。此外,我修改了ID'4',以便第一個標題行是REPLY。 *
+1。謝謝! –
ID是否足以識別要處理的行組?如果是這樣,那麼在ID中,我們可以假設來源和目的地是一樣的嗎? –
@JonathanLeffler是的,這就足夠了,因爲它表示一個具有相同源和目的地的TCP流,端口等。所以,我需要爲每個ID做一個請求 - 應答對,如圖所示。 – sfactor