2015-06-27 123 views
1

我構建了一個簡單的HTTP服務器,並且在處理POST請求時遇到了一些問題。這裏的方法來創建它:Ruby中的簡單HTTP服務器

def make_post_request 
    puts "Enter the name: " 
    name = gets.chomp 
    puts "Enter the email: " 
    email = gets.chomp 

    data = { person: { name: name, email: email } } 
    puts data.to_json 

    request = "POST /thanks.html HTTP/1.0\nContent-Length: #{data.to_s.length}\r\n\r\n#{data.to_json}" 

    return request 
end 

和這裏的服務器代碼(不完全):

request = "" 

    while line = client.gets 
     request << line.chomp 
    end 

麻煩的是,該服務器沒有收到後爲「\ r \自帶的部分n \ r \ n「,我的代碼有什麼問題?

+0

你是什麼意思,不收到?這段代碼看起來很好。該錯誤必須在其他地方 –

回答

1

從代碼中不清楚你正在做什麼,但我懷疑你的問題是你依靠gets,它會嘗試從IO對象返回完整的一行。這意味着它將繼續阻塞等待來自套接字的換行符(或者將其關閉)。由於你的數據並沒有以換行符結束,並且客戶端可能正在等待響應(所以不會關閉連接),所以服務器正在等待永不到來的換行符。

你可以在請求的末尾添加一個\n,這可能會讓你的代碼在這裏工作,但是通常用body來解析HTTP消息比這更復雜一些。基本的方法是解析頭文件並提取內容長度,然後您可以從正文中讀取很多字節,並且您將知道您已到達消息的末尾。當然,如果你開始考慮像分塊傳輸編碼這樣的話,這會變得更加複雜。

+0

是的,服務器是一個困難的業務:) –

+0

爲什麼利用預先編寫的服務器,如Sinatra,是一個好主意。 –

+0

謝謝,從標題中讀取文件長度是正確的想法) – poctek