1234567891011121314151617181920212223242526272829303132333435363738 |
- package dpcore
- import (
- "mime"
- "net/http"
- "time"
- )
- // Auto sniff of flush interval from header
- func (p *ReverseProxy) getFlushInterval(req *http.Request, res *http.Response) time.Duration {
- contentType := req.Header.Get("Content-Type")
- if actualContentType, _, _ := mime.ParseMediaType(contentType); actualContentType == "text/event-stream" {
- return -1
- }
- if req.ContentLength == -1 || p.isBidirectionalStream(req, res) {
- return -1
- }
- //Cannot sniff anything. Use default value
- return p.FlushInterval
- }
- // Check for bidirectional stream, copy from Caddy :D
- func (p *ReverseProxy) isBidirectionalStream(req *http.Request, res *http.Response) bool {
- // We have to check the encoding here; only flush headers with identity encoding.
- // Non-identity encoding might combine with "encode" directive, and in that case,
- // if body size larger than enc.MinLength, upper level encode handle might have
- // Content-Encoding header to write.
- // (see https://github.com/caddyserver/caddy/issues/3606 for use case)
- ae := req.Header.Get("Accept-Encoding")
- return req.ProtoMajor == 2 &&
- res.ProtoMajor == 2 &&
- res.ContentLength == -1 &&
- (ae == "identity" || ae == "")
- }
|