Skip to content

Commit

Permalink
optimze memory alloc
Browse files Browse the repository at this point in the history
  • Loading branch information
kazeburo committed Jun 6, 2019
1 parent 16410a7 commit a16f198
Showing 1 changed file with 29 additions and 11 deletions.
40 changes: 29 additions & 11 deletions proxy/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"net/http"
"net/url"
"strings"
"sync"

"github.com/kazeburo/chocon/upstream"
"github.com/renstrom/shortuuid"
Expand Down Expand Up @@ -45,15 +46,20 @@ type Proxy struct {
Transport http.RoundTripper
upstream *upstream.Upstream
logger *zap.Logger
pool *sync.Pool
}

// New : Create a request-based reverse-proxy.
func New(transport *http.RoundTripper, version string, upstream *upstream.Upstream, logger *zap.Logger) *Proxy {
pool := sync.Pool{
New: func() interface{} { return make([]byte, 32*1024) },
}
return &Proxy{
Version: version,
Transport: *transport,
upstream: upstream,
logger: logger,
pool: &pool,
}
}

Expand Down Expand Up @@ -126,20 +132,27 @@ func (proxy *Proxy) ServeHTTP(writer http.ResponseWriter, originalRequest *http.
defer response.Body.Close()

// Copy all header fields.
for key, values := range response.Header {
if key == proxyIDHeader {
nv := 0
for _, vv := range response.Header {
nv += len(vv)
}
sv := make([]string, nv)
for k, vv := range response.Header {
if k == proxyIDHeader {
continue
}
for _, value := range values {
writer.Header().Add(key, value)
}
n := copy(sv, vv)
writer.Header()[k] = sv[:n:n]
sv = sv[n:]
}

// Copy a status code.
writer.WriteHeader(response.StatusCode)

// Copy a response body.
io.Copy(writer, response.Body)
buf := proxy.pool.Get().([]byte)
defer proxy.pool.Put(buf)
io.CopyBuffer(writer, response.Body, buf)
}

func (proxy *Proxy) rewriteProxyHost(r *http.Request, pr *http.Request, ps *Status) {
Expand Down Expand Up @@ -188,13 +201,18 @@ func (proxy *Proxy) copyRequest(originalRequest *http.Request) *http.Request {
proxyRequest.URL.Path = originalRequest.URL.Path

// Copy all header fields except ignoredHeaderNames'.
for key, values := range originalRequest.Header {
if _, ok := ignoredHeaderNames[key]; ok {
nv := 0
for _, vv := range originalRequest.Header {
nv += len(vv)
}
sv := make([]string, nv)
for k, vv := range originalRequest.Header {
if _, ok := ignoredHeaderNames[k]; ok {
continue
}
for _, value := range values {
proxyRequest.Header.Add(key, value)
}
n := copy(sv, vv)
proxyRequest.Header[k] = sv[:n:n]
sv = sv[n:]
}

// Append this machine's host name into X-Forwarded-For.
Expand Down

0 comments on commit a16f198

Please sign in to comment.