報錯信息如下:
創(chuàng)新互聯(lián)是專業(yè)的密云網站建設公司,密云接單;提供網站制作、成都網站設計,網頁設計,網站設計,建網站,PHP網站建設等專業(yè)做網站服務;采用PHP框架,可快速的進行密云網站開發(fā)網頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網站,專業(yè)的做網站團隊,希望更多企業(yè)前來合作!
[logid: 3628171316][json.err: EOF] [exception:EOF] goroutine 20521 [running]:
原因:
在請求體為json的請求中,調用了parsePostForm方法,方法大致內容如下:
在這個方法中,會讀取http的請求體。
在這里被讀取的時候,后面又重新讀取一次,之后解json
后面讀到的請求體是空的,解json的時候就會報錯EOF
總結:golang中http請求報錯eof,多半是因為多次讀取了請求體
先配置Header最長讀取時間、req最長讀取時間、req最大讀取長度默認6M。
RFC7230禁止\r\n參數,Url中只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字符以及所有保留字符。但go net/http包放寬了這個要求。
先構建newTextprotoReader,由于緩沖區(qū)是對象復用的,用完后要defer put。共完以以下解析任務:
TextprotoReader數據結構,將字節(jié)碼Reader轉成文本Reader。
第一步,從第一行解析出method uri prototype。
第二步解析URL。url.URL數據結構:
解析Scheme,協(xié)議前綴(小寫)。有查詢參數?,則配置url.ForceQuery url.RawQuery。有認證信息///...//,則解析url.User url.Host。最后配置url.Path和url.RawPath,如果Path==RawPath,則RawPath=""。
第三步解析MIMEHeader。
第四步readTransfer。重新配置如下參數:RequestMethod ProtoMajor ProtoMinor Header Trailer ContentLength Close。對于Body,如果encodings支持chunked,讀取流用chunkedReader包裹。默認情況用LimitedReader,無body賦空的struct{}。
以下情況返回非空err,示得到正確的請求:
最后配置req.ctx req.RemoteAddr req.TLS body.doEarlyClose = true。
構建Response:
其中closeNotifyCh必須在構建時初始化,沒有content所以先置contentLength為-1。
配置w.cw并被w.w包裹。w.cw緩沖默認大小2M。
獲取Request可能出現如下錯誤:
先上響應數據結構:
response字段可以分類為:大對象、緩沖、KV對或bool型的狀態(tài)參數。
大對象有:
狀態(tài)字段:
chunkWriter數據結構:
chunkWriter包裹了Response,功能之一是完成Header設置,包括Content-Type Content-Length chunk-header。bufio.Writer是chunkWriter是緩沖包裹。
handler將響應寫入到response.w。
調用w.w.Flush()將w寫入到cw,注意到Flush()操作,如果未刷空緩存并報錯,觸發(fā)拷貝操作。報錯不會退回已寫出的數據。
進而調用cw.Write(),根據cw.chunking參數。
putBufioWriter(w.w)清空resp.w緩沖,如果池化放回sync.pool。
根據chunkWriter的定義,w.cw.close()負責cw的結束工作:寫入換行符和resp.trailers數據。
最后刷新TCP緩沖w.conn.bufw.Flush(),完成響應包發(fā)送。并正確關閉request。
1.在后端服務開發(fā)中,如過一個HTTP請求,請求一致占用,將會帶來大的性能影響,所以需要為每個請求加上超時設置
2.在go語言中利用 context 進行上下文控制,要想達到精確時間控制,如下:
3.同時我們也可以利用context的context.WithDeadline()函數來進行超時控制