2012-03-21 58 views
2

出於測試目的,我想用PHP構建一個簡單的HTTP服務器。 我知道HTTP標頭在空行上以\ r \ n結尾,我想檢測該模式,以便知道我的服務器何時收到所有標頭並可以響應客戶端。PHP HTTP頭結束(或檢測CR LF)

即使我還可以模擬客戶端,像這樣:

$in = "HEAD/HTTP/1.1\r\n"; 
$in .= "Host: www.example.com\r\n"; 
$in .= "Connection: Close\r\n\r\n"; 
$out = ''; 

echo "Sending HTTP HEAD request..."; 
socket_write($socket, $in, strlen($in)); 

我無法檢測到標題的末尾。我的思維邏輯必定存在問題。這裏是我的代碼至極嘗試檢測模式:

do { 
    // read client input 
    $input = socket_read($spawn, 1024, 1) or die("Could not read input\n"); 

    if (preg_match ("/^[\r\n|\r|\n]/", $input)) { 
     echo "CRLF detected!!\n"; 
    } else { 
     if (trim($input) != "") { 
      echo "NO CRLF in: ".trim($input)."\n"; 
     } 
    } 
} while (true); 

我也曾嘗試:

if ($input == "\r\n"){ 

if (preg_match ("/[\r\n|\r|\n]{2,}/", $input)) 

和其他很多不同的組合,但沒有一個選項似乎檢測到指示標題結尾的\ r \ n。 任何幫助,非常感謝。

回答

1

謝謝Marc B.

我沒有找到解決此問題的方法。

我使用的解決方法是: - 在您最喜歡的HTTP服務器上運行PHP腳本。 - 檢查$ _REQUEST變量並讓腳本使用該信息編寫相關答案。 - 將相關信息/操作記錄到文件中。

這樣我就可以測試一個與Web服務器交互的應用程序。該應用程序連接到我的腳本。我知道應用程序如何通過拖尾(tail -f)日誌文件與腳本進行交互。腳本爲應用程序提供答案。

1

不是一個答案,但過大/醜陋的評論:

[\r\n|\r|\n]是不是真的正確的語法。字符類([])匹配包含括號內的任何內容,並將它們用作搜索字符串中單個字符的潛在匹配。 |替代運算符在[]內部不起作用,就像在()中那樣。例如

/[abc]/的讀數爲「如果有任何單個字符是'a'或'b'或'c'」,則表示匹配。

/[a|b|c]/幾乎相同,除非它是「如果它是'a'或'b'或'c'或'|'」。

(a|b|c)[abc]是等同的,但()版本也捕獲匹配。