func (t *transaction) prepare() (err error) { method, requestURI, version, err := readRequestLine(t.br) if err != nil { return err } header := web.Header{} err = header.ParseHttpHeader(t.br) if err != nil { return err } u, err := url.ParseRequestURI(requestURI) if err != nil { return err } if u.Host == "" { u.Host = header.Get(web.HeaderHost) if u.Host == "" { u.Host = t.server.DefaultHost } } if t.server.Secure { u.Scheme = "https" } else { u.Scheme = "http" } req, err := web.NewRequest(t.conn.RemoteAddr().String(), method, requestURI, version, u, header) if err != nil { return } t.req = req if s := req.Header.Get(web.HeaderExpect); s != "" { t.write100Continue = strings.ToLower(s) == "100-continue" } connection := strings.ToLower(req.Header.Get(web.HeaderConnection)) if version >= web.ProtocolVersion(1, 1) { t.closeAfterResponse = connection == "close" } else if version == web.ProtocolVersion(1, 0) && req.ContentLength >= 0 { t.closeAfterResponse = connection != "keep-alive" } else { t.closeAfterResponse = true } req.Responder = t te := header.GetList(web.HeaderTransferEncoding) chunked := len(te) > 0 && te[0] == "chunked" switch { case req.Method == "GET" || req.Method == "HEAD": req.Body = identityReader{t} t.requestConsumed = true case chunked: req.Body = chunkedReader{t} case req.ContentLength >= 0: req.Body = identityReader{t} t.requestAvail = req.ContentLength t.requestConsumed = req.ContentLength == 0 default: req.Body = identityReader{t} t.closeAfterResponse = true } return nil }