Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go http无法处理没有路径的http请求_Http_Go - Fatal编程技术网

Go http无法处理没有路径的http请求

Go http无法处理没有路径的http请求,http,go,Http,Go,我正在编写一个小型HTTP服务器,它从一些嵌入式设备接收HTTP帖子。不幸的是,这些设备发送的POST请求格式不正确,不包含路径组件: POST HTTP/1.1 Host: 192.168.13.130:8080 Content-Length: 572 Connection: Keep-Alive <?xml version="1.0"?> ....REST OF XML BODY 我不确定Go的HTTP解析器是否允许没有URI路径元素的请求。如果没有,那你就不走运了。若有,

我正在编写一个小型HTTP服务器,它从一些嵌入式设备接收HTTP帖子。不幸的是,这些设备发送的POST请求格式不正确,不包含路径组件:

POST  HTTP/1.1
Host: 192.168.13.130:8080
Content-Length: 572
Connection: Keep-Alive

<?xml version="1.0"?>
....REST OF XML BODY

我不确定Go的HTTP解析器是否允许没有URI路径元素的请求。如果没有,那你就不走运了。若有,;您可以像这样覆盖请求的路径:

type FixPath struct {}

func (f *FixPath) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    r.RequestURI = "/dummy/path" // fix URI path
    http.DefaultServeMux.ServeHTTP(w, r) // forward the fixed request to http.DefaultServeMux
}

func main() {

    // register handlers with http.DefaultServeMux through http.Handle or http.HandleFunc, and then...

    http.ListenAndServe(":8080", &FixPath{})
}

您看到的错误发生在请求解析逻辑中,该逻辑发生在调用ServeHTTP之前

HTTP请求由ReadRequest函数从net/HTTP包从套接字读取。它将使用空URL部分标记请求的第一行,然后继续:

不幸的是,此函数将被禁用,这将反过来中止请求读取过程


因此,似乎没有一种简单的方法可以在不修改标准库代码的情况下实现您想要的功能。

我运气不好,这与我在示例中所做的完全相同,但从未调用ServeHTTP方法。Go在到达此点之前返回错误请求。我想我将不得不使用一个自定义侦听器并修改那里的原始数据,但这似乎很容易出错。这样的请求不是违反了HTTP规范吗?难怪Go不支持它,如果它是的话。根据请求,URI必须是四个变体中的一个,其中任何一个都不能为空。请参见abs_路径定义。是的,这是一个违规行为,但我无法更改客户端嵌入式摄像头以向我发送正确的HTTP帖子。使用ruby/eventmachine,我能够获取原始数据,并在将其传递给处理程序之前对其进行修复。我只是想知道是否有一种方法可以在Go中实现同样的功能。好吧,碰巧你也可以在客户端和你的程序之间放置自定义的代理服务器,它将为你修复请求。代理可以直接在套接字上操作,而不是HTTP请求,所以你也可以在Go中编写它。我不知道是否可以连接到Go HTTP内部,因此,当然,代理可能是除了修改Go库源之外的唯一方法。我将整个net/HTTP源复制到了我的,并修改了request.Go源文件的这一部分。如果rawurl为nil或空白,则在将其传递给url.ParseRequestURI之前,我将其设置为/。这是一个丑陋且错误的解决方案,但适用于我的用例。谢谢
type FixPath struct {}

func (f *FixPath) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    r.RequestURI = "/dummy/path" // fix URI path
    http.DefaultServeMux.ServeHTTP(w, r) // forward the fixed request to http.DefaultServeMux
}

func main() {

    // register handlers with http.DefaultServeMux through http.Handle or http.HandleFunc, and then...

    http.ListenAndServe(":8080", &FixPath{})
}
if req.URL, err = url.ParseRequestURI(rawurl); err != nil {
    return nil, err
}