2014-07-24 46 views
0

我正在嘗試使用tcl發送http發佈請求。我的代碼如下:tcl中的Http Post標題 - > 400錯誤的請求

proc ::rest::setRequest {req} { 
    upvar $req str 
    set str "POST domain.com HTTP/1.1\r\n" 
    append str "Host: blablabla\r\n" 
    append str "Content-Length:11\r\n" 
    append str "Content-Type:text/xml\r\n" 
    append str "Authorization: Basic ZGVmYXVsdDpkZWZhdWx0\r\n\r\n" 
} 

proc ::rest::sendRestMsg {ip port request} { 


    set chan [socket $ip $port] 
    puts $chan $request 
    flush $chan 
    puts "[gets $chan]" 
    puts "[gets $chan]" 
    puts "[gets $chan]" 
    puts "[gets $chan]" 
    puts "[gets $chan]" 
    puts "[gets $chan]" 
    puts "[gets $chan]" 
    puts "[gets $chan]" 
    puts "[gets $chan]" 
    puts "[gets $chan]" 
    puts "[gets $chan]" 
    puts "[gets $chan]" 
    puts "[gets $chan]" 
    puts "[gets $chan]" 
    puts "[gets $chan]" 
    puts "[gets $chan]" 
    puts "[gets $chan]" 


} 

我的問題是,服務器解析器都跟我HTTP /前buf_p = 0x5b8c7074 1.1 400錯誤的請求,HTTP報頭詞法分析器誤差在字符「 」(0xd中)偏移量= 32。

它從第一行的「\ n」投訴。我的標題有什麼問題?謝謝

回答

1

Tcl的轉換通道上的輸入和輸出,這樣就可以使用\n內部腳本(可能暗示,通過puts),但有使用時,平臺的權利換行符風格字節命中操作系統。它主要是默認情況下正確,但並非總是如此。

使用您希望\r\n作爲分隔符的套接字時,應該明確地配置它。

set chan [socket $ip $port] 
fconfigure $chan -translation crlf 
# You might also need to configure the character -encoding 

之後,你可以假裝一切都很簡單,它應該都「只是工作」。

如果做不到這一點,如果你想在什麼字節發送精確控制,將譯文更改爲binary和使用puts -nonewline正確地寫字節序列:

fconfigure $chan -translation binary 
puts -nonewline $chan "these_are really raw_bytes\r\n" 

binary format命令可以創建消息的幫助,正如encoding convertto命令一樣;都產生字節數組(一個特殊的字符串,其中包含字符,方便地與字節相對應)。

0

我發現mistak套接字緩衝區不接受/ r/n。因此,爲了得到它的工作寫一行請求行