第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go http 無法處理沒有 PATH 的 HTTP 請求

Go http 無法處理沒有 PATH 的 HTTP 請求

Go
哈士奇WWW 2021-07-09 09:40:17
我正在編寫一個小型 HTTP 服務(wù)器,它從一些嵌入式設(shè)備接收 HTTP POST。不幸的是,這些設(shè)備發(fā)送不包含 PATH 組件的格式錯誤的 POST 請求:POST  HTTP/1.1Host: 192.168.13.130:8080Content-Length: 572Connection: Keep-Alive<?xml version="1.0"?>....REST OF XML BODY因此,Go http 永遠(yuǎn)不會將請求傳遞給我的任何處理程序,并且總是以 400 Bad Request 進(jìn)行響應(yīng)。由于這些是嵌入式設(shè)備,并且改變它們發(fā)送請求的方式不是一種選擇,但我也許可以攔截 HTTP 請求,如果不存在 PATH,則在它傳遞給 SeverMux 之前向其添加一個(例如 /)。我通過創(chuàng)建自己的 CameraMux 嘗試了這一點,但即使在從我的自定義 ServeMux 調(diào)用 ServeHTTP() 方法之前,Go 也總是以 400 Bad Request 響應(yīng)(參見下面的代碼)。有沒有辦法在 Go http 響應(yīng) Bad Request 之前的某個時間修改 Request 對象,或者有辦法讓 Go 接受請求,即使它沒有 PATH?package mainimport (  "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)}
查看完整描述

2 回答

?
Helenr

TA貢獻(xiàn)1780條經(jīng)驗 獲得超4個贊

您看到的錯誤發(fā)生在請求解析邏輯中,該邏輯發(fā)生在ServeHTTP調(diào)用之前。

HTTP 請求是由包中的ReadRequest函數(shù)從套接字讀取的net/http。它將使用空 URL 部分標(biāo)記請求的第一行,然后繼續(xù)解析 URL

if req.URL, err = url.ParseRequestURI(rawurl); err != nil {
    return nil, err
    }

不幸的是,此函數(shù)將返回一個空 URL 字符串的錯誤,這將反過來中止請求讀取過程。

因此,在不修改標(biāo)準(zhǔn)庫代碼的情況下,似乎沒有一種簡單的方法可以實現(xiàn)您的目標(biāo)。


查看完整回答
反對 回復(fù) 2021-07-12
?
慕絲7291255

TA貢獻(xiàn)1859條經(jīng)驗 獲得超6個贊

我不確定 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{})

}


查看完整回答
反對 回復(fù) 2021-07-12
  • 2 回答
  • 0 關(guān)注
  • 305 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號