mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Bump unrolled/render to v1.1.0 (#15581)
v1.1.0 has improved buffer pooling
This commit is contained in:
		
							
								
								
									
										15
									
								
								vendor/github.com/unrolled/render/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/unrolled/render/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,15 +0,0 @@
 | 
			
		||||
language: go
 | 
			
		||||
 | 
			
		||||
go:
 | 
			
		||||
  - 1.11.x
 | 
			
		||||
  - 1.12.x
 | 
			
		||||
  - tip
 | 
			
		||||
 | 
			
		||||
env:
 | 
			
		||||
  - GO111MODULE=on
 | 
			
		||||
 | 
			
		||||
install:
 | 
			
		||||
  - go mod download 
 | 
			
		||||
 | 
			
		||||
script:
 | 
			
		||||
  - go test -v -race -tags=integration
 | 
			
		||||
							
								
								
									
										3
									
								
								vendor/github.com/unrolled/render/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/unrolled/render/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,5 @@
 | 
			
		||||
# Render [](http://godoc.org/github.com/unrolled/render) [](https://travis-ci.org/unrolled/render)
 | 
			
		||||
# Render [](http://godoc.org/github.com/unrolled/render) [](https://github.com/unrolled/render/actions)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Render is a package that provides functionality for easily rendering JSON, XML, text, binary data, and HTML templates. This package is based on the [Martini](https://github.com/go-martini/martini) [render](https://github.com/martini-contrib/render) work.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								vendor/github.com/unrolled/render/buffer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/unrolled/render/buffer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,9 +2,6 @@ package render
 | 
			
		||||
 | 
			
		||||
import "bytes"
 | 
			
		||||
 | 
			
		||||
// bufPool represents a reusable buffer pool for executing templates into.
 | 
			
		||||
var bufPool *BufferPool
 | 
			
		||||
 | 
			
		||||
// BufferPool implements a pool of bytes.Buffers in the form of a bounded channel.
 | 
			
		||||
// Pulled from the github.com/oxtoacart/bpool package (Apache licensed).
 | 
			
		||||
type BufferPool struct {
 | 
			
		||||
@@ -39,8 +36,3 @@ func (bp *BufferPool) Put(b *bytes.Buffer) {
 | 
			
		||||
	default: // Discard the buffer if the pool is full.
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Initialize buffer pool for writing templates into.
 | 
			
		||||
func init() {
 | 
			
		||||
	bufPool = NewBufferPool(64)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								vendor/github.com/unrolled/render/engine.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								vendor/github.com/unrolled/render/engine.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -30,6 +30,8 @@ type HTML struct {
 | 
			
		||||
	Head
 | 
			
		||||
	Name      string
 | 
			
		||||
	Templates *template.Template
 | 
			
		||||
 | 
			
		||||
	bp GenericBufferPool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// JSON built-in renderer.
 | 
			
		||||
@@ -82,9 +84,14 @@ func (d Data) Render(w io.Writer, v interface{}) error {
 | 
			
		||||
 | 
			
		||||
// Render a HTML response.
 | 
			
		||||
func (h HTML) Render(w io.Writer, binding interface{}) error {
 | 
			
		||||
	// Retrieve a buffer from the pool to write to.
 | 
			
		||||
	out := bufPool.Get()
 | 
			
		||||
	err := h.Templates.ExecuteTemplate(out, h.Name, binding)
 | 
			
		||||
	var buf *bytes.Buffer
 | 
			
		||||
	if h.bp != nil {
 | 
			
		||||
		// If we have a bufferpool, allocate from it
 | 
			
		||||
		buf = h.bp.Get()
 | 
			
		||||
		defer h.bp.Put(buf)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err := h.Templates.ExecuteTemplate(buf, h.Name, binding)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
@@ -92,10 +99,8 @@ func (h HTML) Render(w io.Writer, binding interface{}) error {
 | 
			
		||||
	if hw, ok := w.(http.ResponseWriter); ok {
 | 
			
		||||
		h.Head.Write(hw)
 | 
			
		||||
	}
 | 
			
		||||
	out.WriteTo(w)
 | 
			
		||||
	buf.WriteTo(w)
 | 
			
		||||
 | 
			
		||||
	// Return the buffer to the pool.
 | 
			
		||||
	bufPool.Put(out)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										9
									
								
								vendor/github.com/unrolled/render/genericbufferpool.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/unrolled/render/genericbufferpool.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
package render
 | 
			
		||||
 | 
			
		||||
import "bytes"
 | 
			
		||||
 | 
			
		||||
// GenericBufferPool abstracts buffer pool implementations
 | 
			
		||||
type GenericBufferPool interface {
 | 
			
		||||
	Get() *bytes.Buffer
 | 
			
		||||
	Put(*bytes.Buffer)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										9
									
								
								vendor/github.com/unrolled/render/render.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/unrolled/render/render.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -103,6 +103,10 @@ type Options struct {
 | 
			
		||||
	// Enables using partials without the current filename suffix which allows use of the same template in multiple files. e.g {{ partial "carosuel" }} inside the home template will match carosel-home or carosel.
 | 
			
		||||
	// ***NOTE*** - This option should be named RenderPartialsWithoutSuffix as that is what it does. "Prefix" is a typo. Maintaining the existing name for backwards compatibility.
 | 
			
		||||
	RenderPartialsWithoutPrefix bool
 | 
			
		||||
 | 
			
		||||
	// BufferPool to use when rendering HTML templates. If none is supplied
 | 
			
		||||
	// defaults to SizedBufferPool of size 32 with 512KiB buffers.
 | 
			
		||||
	BufferPool GenericBufferPool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HTMLOptions is a struct for overriding some rendering Options for specific HTML call.
 | 
			
		||||
@@ -176,6 +180,10 @@ func (r *Render) prepareOptions() {
 | 
			
		||||
	if len(r.opt.XMLContentType) == 0 {
 | 
			
		||||
		r.opt.XMLContentType = ContentXML
 | 
			
		||||
	}
 | 
			
		||||
	if r.opt.BufferPool == nil {
 | 
			
		||||
		// 32 buffers of size 512KiB each
 | 
			
		||||
		r.opt.BufferPool = NewSizedBufferPool(32, 1<<19)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *Render) compileTemplates() {
 | 
			
		||||
@@ -410,6 +418,7 @@ func (r *Render) HTML(w io.Writer, status int, name string, binding interface{},
 | 
			
		||||
		Head:      head,
 | 
			
		||||
		Name:      name,
 | 
			
		||||
		Templates: r.templates,
 | 
			
		||||
		bp:        r.opt.BufferPool,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return r.Render(w, h, binding)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										62
									
								
								vendor/github.com/unrolled/render/sizedbufferpool.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								vendor/github.com/unrolled/render/sizedbufferpool.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,62 @@
 | 
			
		||||
package render
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Pulled from the github.com/oxtoacart/bpool package (Apache licensed).
 | 
			
		||||
 | 
			
		||||
// SizedBufferPool implements a pool of bytes.Buffers in the form of a bounded
 | 
			
		||||
// channel. Buffers are pre-allocated to the requested size.
 | 
			
		||||
type SizedBufferPool struct {
 | 
			
		||||
	c chan *bytes.Buffer
 | 
			
		||||
	a int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewSizedBufferPool creates a new BufferPool bounded to the given size.
 | 
			
		||||
// size defines the number of buffers to be retained in the pool and alloc sets
 | 
			
		||||
// the initial capacity of new buffers to minimize calls to make().
 | 
			
		||||
//
 | 
			
		||||
// The value of alloc should seek to provide a buffer that is representative of
 | 
			
		||||
// most data written to the the buffer (i.e. 95th percentile) without being
 | 
			
		||||
// overly large (which will increase static memory consumption). You may wish to
 | 
			
		||||
// track the capacity of your last N buffers (i.e. using an []int) prior to
 | 
			
		||||
// returning them to the pool as input into calculating a suitable alloc value.
 | 
			
		||||
func NewSizedBufferPool(size int, alloc int) (bp *SizedBufferPool) {
 | 
			
		||||
	return &SizedBufferPool{
 | 
			
		||||
		c: make(chan *bytes.Buffer, size),
 | 
			
		||||
		a: alloc,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Get gets a Buffer from the SizedBufferPool, or creates a new one if none are
 | 
			
		||||
// available in the pool. Buffers have a pre-allocated capacity.
 | 
			
		||||
func (bp *SizedBufferPool) Get() (b *bytes.Buffer) {
 | 
			
		||||
	select {
 | 
			
		||||
	case b = <-bp.c:
 | 
			
		||||
		// reuse existing buffer
 | 
			
		||||
	default:
 | 
			
		||||
		// create new buffer
 | 
			
		||||
		b = bytes.NewBuffer(make([]byte, 0, bp.a))
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Put returns the given Buffer to the SizedBufferPool.
 | 
			
		||||
func (bp *SizedBufferPool) Put(b *bytes.Buffer) {
 | 
			
		||||
	b.Reset()
 | 
			
		||||
 | 
			
		||||
	// Release buffers over our maximum capacity and re-create a pre-sized
 | 
			
		||||
	// buffer to replace it.
 | 
			
		||||
	// Note that the cap(b.Bytes()) provides the capacity from the read off-set
 | 
			
		||||
	// only, but as we've called b.Reset() the full capacity of the underlying
 | 
			
		||||
	// byte slice is returned.
 | 
			
		||||
	if cap(b.Bytes()) > bp.a {
 | 
			
		||||
		b = bytes.NewBuffer(make([]byte, 0, bp.a))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	select {
 | 
			
		||||
	case bp.c <- b:
 | 
			
		||||
	default: // Discard the buffer if the pool is full.
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user