我正在编写一个小型 HTTP 服务器,它从一些嵌入式设备接收 HTTP POST。不幸的是,这些设备发送不包含 PATH 组件的格式错误的 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 永远不会将请求传递给我的任何处理程序,并且总是以 400 Bad Request 进行响应。
由于这些是嵌入式设备,并且改变它们发送请求的方式不是一种选择,但我也许可以拦截 HTTP 请求,如果不存在 PATH,则在它传递给 SeverMux 之前向其添加一个(例如 /)。
我通过创建自己的 CameraMux 尝试了这一点,但即使在从我的自定义 ServeMux 调用 ServeHTTP() 方法之前,Go 也总是以 400 Bad Request 响应(参见下面的代码)。
有没有办法在 Go http 响应 Bad Request 之前的某个时间修改 Request 对象,或者有办法让 Go 接受请求,即使它没有 PATH?
package main
import (
"net/http"
"log"
"os"
)
type CameraMux struct {
mux *http.ServeMux
}
func (handler *CameraMux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// Try to fix URL.Path here but the server never reaches this method.
log.Printf("URL %v\n", r.URL.Path)
handler.mux.ServeHTTP(w, r)
}
func process(path string) error {
log.Printf("Processing %v\n", path)
// Do processing based on path and body
return nil
}
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
path := r.URL.Path[1:]
log.Printf("Processing path %v\n", path)
err := process(path)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
} else {
w.WriteHeader(http.StatusOK)
}
})
err := http.ListenAndServe(":8080", &CameraMux{http.DefaultServeMux})
if err != nil {
log.Println(err)
os.Exit(1)
}
os.Exit(0)
}
Helenr
慕丝7291255
相关分类