tcl中的Http Post Headers - > 400坏请求

时间:2014-07-24 15:01:25

标签: rest http post header tcl

我正在尝试使用tcl发送http post请求。我的代码如下:

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 / 1.1 400 Bad Request,HTTP header lexer error at character' ' (0xd)在buf_p = 0x5b8c7074 offset = 32之前。

来自" \ n"在第一行。我的标题出了什么问题?感谢

2 个答案:

答案 0 :(得分:1)

Tcl转换通道上的输入和输出,以便您可以在脚本中使用\n(可能隐式地,通过puts),并且当字节到达时使用的平台具有正确的换行符样式OS。它主要是默认情况下正确的,但并非总是如此。

如果您想要\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命令也是如此。两者都产生字节数组(一个特殊的字符串,其中的字符很方便地对应于字节)。

答案 1 :(得分:0)

我发现错误的套接字缓冲区不接受/ r / n。因此,要使其正常工作,请逐行写入请求