在go中通过tcp连接发出http请求

dced5bon  于 2023-04-09  发布在  Go
关注(0)|答案(1)|浏览(209)
package main

import (
    "crypto/tls"
    "fmt"
)

func main() {
    conf := &tls.Config{}
    conn, _ := tls.Dial("tcp", "www.google.com:443", conf)
    data := []byte("GET / HTTP1.1\r\nHost: www.google.com\r\n\r\n")
    conn.Write(data)
    buf := make([]byte, 5000)
    conn.Read(buf)
    fmt.Println(string(buf[:]))
}

我试图通过原始TCP连接数据进行HTTP请求,但得到400 Bad Request的错误响应,这是什么问题?

3hvapo4f

3hvapo4f1#

数据中有一处排印错误。
HTTP1.1应该是HTTP/1.1
我想分享我是如何发现错字的,希望能帮助到别人。
当我想解决一个我不太熟悉的问题时,我做的第一件事就是找出它工作时的样子。我以前用过nc,所以我先试试。
下面是nc手册页中的一个示例:

$ printf "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80

所以我先用www.google.com替换了host.example.com

$ printf "GET / HTTP/1.0\r\n\r\n" | nc www.google.com 80

成功了!
然后将HTTP/1.0替换为HTTP/1.1。仍然有效!
然后添加Host头文件:

$ printf "GET / HTTP/1.1\r\nHost: www.google.com\r\n\r\n" | nc www.google.com 80

工作!
然后从问题中复制字符串:

$ printf "GET / HTTP1.1\r\nHost: www.google.com\r\n\r\n" | nc www.google.com 80

这次得到了400 Bad Request
这是一个很大的进步!请求中有一些错误。通过比较两个请求很容易发现错别字。
最后,修复原始演示中的错字,并运行演示以验证问题已得到解决。完成!
感谢阅读!

相关问题