.setState(
c.rwc,
StateClosed) } }() ..... ctx, cancelCtx := context.
WithCancel(ctx)
c.cancelCtx = cancelCtx
defer cancelCtx()
c.r = &connReader{conn:
c}
c.bufr = newBufioReader(
c.r)
c.bufw = newBufioWriterSize(checkConnErrorWriter{
c},
4<<
10)
for { w, err :=
c.readRequest(ctx)
if c.r.remain !=
c.server.initialReadLimitSize() {
c.setState(
c.rwc,
StateActive) } ................. req := w.req
if req.expectsContinue() {
if req.
ProtoAtLeast(
1,
1) && req.
ContentLength !=
0 { = &expectContinueReader{readCloser: req.
Body, resp: w} } }
else if req.
Header.
get(
"Expect") !=
"" { w.sendExpectationFailed()
return }
c.curReq.
Store(w)
if requestBodyRemains(req.
Body) { registerOnHitEOF(req.
Body, w.conn.r.startBackgroundRead) }
else {
if w.conn.bufr.
Buffered() >
0 { w.conn.r.closeNotifyFromPipelinedRequest() } w.conn.r.startBackgroundRead() } serverHandler{
c.server}.
ServeHTTP(w, w.req) w.cancelCtx()
if c.hijacked() {
return } w.finishRequest()
if !w.shouldReuseConnection() {
if w.requestBodyLimitHit || w.closedRequestBodyEarly() {
c.closeWriteAndWait() }
return }
c.setState(
c.rwc,
StateIdle)
c.curReq.
Store((*response)(
nil))
if !w.conn.server.doKeepAlives() {
return }
if d :=
c.server.idleTimeout(); d !=
0 {
c.rwc.
SetReadDeadline(time.
Now().
Add(d))
if _, err :=
c.bufr.
Peek(
4); err !=
nil {
return
推荐阅读
Linux命令行工具使用小贴士及技巧(三)
在这个系列的第一部分,我们具体地评论辩论了 cd - 敕令,在第二部分,我们深刻商量了 pushd 和 popd 两个敕令,以及它们应用的场景。持续对敕令行的评论辩论,在这篇教程中,我们将会经由>>>详细阅读
本文标题:Go语言HTTP Server源码分析
地址:http://www.17bianji.com/lsqh/34685.html
1/2 1