* remove go1.6 support * remove build tag * remove todo * remove go1.6 support: https://github.com/gin-gonic/gin/pull/1383/commits * update readme * remove go1.7 support * fix embedmd error * test * revert it * revert it * remove context_17 * add pusher test * v1.4.0 rc1
This commit is contained in:
		@ -3,8 +3,6 @@ language: go
 | 
				
			|||||||
matrix:
 | 
					matrix:
 | 
				
			||||||
  fast_finish: true
 | 
					  fast_finish: true
 | 
				
			||||||
  include:
 | 
					  include:
 | 
				
			||||||
  - go: 1.6.x
 | 
					 | 
				
			||||||
  - go: 1.7.x
 | 
					 | 
				
			||||||
  - go: 1.8.x
 | 
					  - go: 1.8.x
 | 
				
			||||||
  - go: 1.9.x
 | 
					  - go: 1.9.x
 | 
				
			||||||
  - go: 1.10.x
 | 
					  - go: 1.10.x
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										58
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@ -1,4 +1,60 @@
 | 
				
			|||||||
# CHANGELOG
 | 
					
 | 
				
			||||||
 | 
					### Gin 1.4.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- [NEW] Support for [Go Modules](https://github.com/golang/go/wiki/Modules)  [#1569](https://github.com/gin-gonic/gin/pull/1569)
 | 
				
			||||||
 | 
					- [NEW] Refactor of form mapping multipart requesta [#1829](https://github.com/gin-gonic/gin/pull/1829)
 | 
				
			||||||
 | 
					- [FIX] Truncate Latency precision in long running request [#1830](https://github.com/gin-gonic/gin/pull/1830)
 | 
				
			||||||
 | 
					- [FIX] IsTerm flag should not be affected by DisableConsoleColor method. [#1802](https://github.com/gin-gonic/gin/pull/1802)
 | 
				
			||||||
 | 
					- [NEW] Supporting file binding [#1264](https://github.com/gin-gonic/gin/pull/1264)
 | 
				
			||||||
 | 
					- [NEW] Add support for mapping arrays [#1797](https://github.com/gin-gonic/gin/pull/1797)
 | 
				
			||||||
 | 
					- [FIX] Readme updates [#1793](https://github.com/gin-gonic/gin/pull/1793) [#1788](https://github.com/gin-gonic/gin/pull/1788) [1789](https://github.com/gin-gonic/gin/pull/1789)
 | 
				
			||||||
 | 
					- [FIX] StaticFS: Fixed Logging two log lines on 404.  [#1805](https://github.com/gin-gonic/gin/pull/1805), [#1804](https://github.com/gin-gonic/gin/pull/1804)
 | 
				
			||||||
 | 
					- [NEW] Make context.Keys available as LogFormatterParams [#1779](https://github.com/gin-gonic/gin/pull/1779)
 | 
				
			||||||
 | 
					- [NEW] Use internal/json for Marshal/Unmarshal [#1791](https://github.com/gin-gonic/gin/pull/1791)
 | 
				
			||||||
 | 
					- [NEW] Support mapping time.Duration [#1794](https://github.com/gin-gonic/gin/pull/1794)
 | 
				
			||||||
 | 
					- [NEW] Refactor form mappings [#1749](https://github.com/gin-gonic/gin/pull/1749)
 | 
				
			||||||
 | 
					- [NEW] Added flag to context.Stream indicates if client disconnected in middle of stream [#1252](https://github.com/gin-gonic/gin/pull/1252)
 | 
				
			||||||
 | 
					- [FIX] Moved [examples](https://github.com/gin-gonic/examples) to stand alone Repo [#1775](https://github.com/gin-gonic/gin/pull/1775)
 | 
				
			||||||
 | 
					- [NEW] Extend context.File to allow for the content-dispositon attachments via a new method context.Attachment [#1260](https://github.com/gin-gonic/gin/pull/1260)
 | 
				
			||||||
 | 
					- [FIX] Support HTTP content negotiation wildcards [#1112](https://github.com/gin-gonic/gin/pull/1112)
 | 
				
			||||||
 | 
					- [NEW] Add prefix from X-Forwarded-Prefix in redirectTrailingSlash [#1238](https://github.com/gin-gonic/gin/pull/1238)
 | 
				
			||||||
 | 
					- [FIX] context.Copy() race condition [#1020](https://github.com/gin-gonic/gin/pull/1020)
 | 
				
			||||||
 | 
					- [NEW] Add context.HandlerNames() [#1729](https://github.com/gin-gonic/gin/pull/1729)
 | 
				
			||||||
 | 
					- [FIX] Change color methods to public in the defaultLogger. [#1771](https://github.com/gin-gonic/gin/pull/1771)
 | 
				
			||||||
 | 
					- [FIX] Update writeHeaders method to use http.Header.Set [#1722](https://github.com/gin-gonic/gin/pull/1722)
 | 
				
			||||||
 | 
					- [NEW] Add response size to LogFormatterParams [#1752](https://github.com/gin-gonic/gin/pull/1752)
 | 
				
			||||||
 | 
					- [NEW] Allow ignoring field on form mapping [#1733](https://github.com/gin-gonic/gin/pull/1733)
 | 
				
			||||||
 | 
					- [NEW] Add a function to force color in console output. [#1724](https://github.com/gin-gonic/gin/pull/1724)
 | 
				
			||||||
 | 
					- [FIX] Context.Next() - recheck len of handlers on every iteration. [#1745](https://github.com/gin-gonic/gin/pull/1745)
 | 
				
			||||||
 | 
					- [FIX] Fix all errcheck warnings [#1739](https://github.com/gin-gonic/gin/pull/1739) [#1653](https://github.com/gin-gonic/gin/pull/1653)
 | 
				
			||||||
 | 
					- [NEW] context: inherits context cancellation and deadline from http.Request context for Go>=1.7 [#1690](https://github.com/gin-gonic/gin/pull/1690)
 | 
				
			||||||
 | 
					- [NEW] Binding for URL Params [#1694](https://github.com/gin-gonic/gin/pull/1694)
 | 
				
			||||||
 | 
					- [NEW] Add LoggerWithFormatter method [#1677](https://github.com/gin-gonic/gin/pull/1677)
 | 
				
			||||||
 | 
					- [FIX] CI testing updates [#1671](https://github.com/gin-gonic/gin/pull/1671) [#1670](https://github.com/gin-gonic/gin/pull/1670) [#1682](https://github.com/gin-gonic/gin/pull/1682) [#1669](https://github.com/gin-gonic/gin/pull/1669)
 | 
				
			||||||
 | 
					- [FIX] StaticFS(): Send 404 when path does not exist [#1663](https://github.com/gin-gonic/gin/pull/1663)
 | 
				
			||||||
 | 
					- [FIX] Handle nil body for JSON binding [#1638](https://github.com/gin-gonic/gin/pull/1638)
 | 
				
			||||||
 | 
					- [FIX] Support bind uri param [#1612](https://github.com/gin-gonic/gin/pull/1612)
 | 
				
			||||||
 | 
					- [FIX] recovery: fix issue with syscall import on google app engine [#1640](https://github.com/gin-gonic/gin/pull/1640)
 | 
				
			||||||
 | 
					- [FIX] Make sure the debug log contains line breaks [#1650](https://github.com/gin-gonic/gin/pull/1650)
 | 
				
			||||||
 | 
					- [FIX] Panic stack trace being printed during recovery of broken pipe [#1089](https://github.com/gin-gonic/gin/pull/1089) [#1259](https://github.com/gin-gonic/gin/pull/1259)
 | 
				
			||||||
 | 
					- [NEW] RunFd method to run http.Server through a file descriptor [#1609](https://github.com/gin-gonic/gin/pull/1609)
 | 
				
			||||||
 | 
					- [NEW] Yaml binding support [#1618](https://github.com/gin-gonic/gin/pull/1618)
 | 
				
			||||||
 | 
					- [FIX] Pass MaxMultipartMemory when FormFile is called [#1600](https://github.com/gin-gonic/gin/pull/1600)
 | 
				
			||||||
 | 
					- [FIX] LoadHTML* tests [#1559](https://github.com/gin-gonic/gin/pull/1559)
 | 
				
			||||||
 | 
					- [FIX] Removed use of sync.pool from HandleContext [#1565](https://github.com/gin-gonic/gin/pull/1565)
 | 
				
			||||||
 | 
					- [FIX] Format output log to os.Stderr [#1571](https://github.com/gin-gonic/gin/pull/1571)
 | 
				
			||||||
 | 
					- [FIX] Make logger use a yellow background and a darkgray text for legibility [#1570](https://github.com/gin-gonic/gin/pull/1570)
 | 
				
			||||||
 | 
					- [FIX] Remove sensitive request information from panic log. [#1370](https://github.com/gin-gonic/gin/pull/1370)
 | 
				
			||||||
 | 
					- [FIX] log.Println() does not print timestamp [#829](https://github.com/gin-gonic/gin/pull/829) [#1560](https://github.com/gin-gonic/gin/pull/1560)
 | 
				
			||||||
 | 
					- [NEW] Add PureJSON renderer [#694](https://github.com/gin-gonic/gin/pull/694)
 | 
				
			||||||
 | 
					- [FIX] Add missing copyright and update if/else [#1497](https://github.com/gin-gonic/gin/pull/1497)
 | 
				
			||||||
 | 
					- [FIX] Update msgpack usage [#1498](https://github.com/gin-gonic/gin/pull/1498)
 | 
				
			||||||
 | 
					- [FIX] Use protobuf on render [#1496](https://github.com/gin-gonic/gin/pull/1496)
 | 
				
			||||||
 | 
					- [FIX] Add support for Protobuf format response [#1479](https://github.com/gin-gonic/gin/pull/1479)
 | 
				
			||||||
 | 
					- [NEW] Set default time format in form binding [#1487](https://github.com/gin-gonic/gin/pull/1487)
 | 
				
			||||||
 | 
					- [FIX] Add BindXML and ShouldBindXML [#1485](https://github.com/gin-gonic/gin/pull/1485)
 | 
				
			||||||
 | 
					- [NEW] Upgrade dependency libraries [#1491](https://github.com/gin-gonic/gin/pull/1491)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Gin 1.3.0
 | 
					### Gin 1.3.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -69,7 +69,7 @@ Gin is a web framework written in Go (Golang). It features a martini-like API wi
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
To install Gin package, you need to install Go and set your Go workspace first.
 | 
					To install Gin package, you need to install Go and set your Go workspace first.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. Download and install it:
 | 
					1. The first need [Go](https://golang.org/) installed (**version 1.8+ is required**), then you can use the below Go command to install Gin.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```sh
 | 
					```sh
 | 
				
			||||||
$ go get -u github.com/gin-gonic/gin
 | 
					$ go get -u github.com/gin-gonic/gin
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										19
									
								
								context.go
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								context.go
									
									
									
									
									
								
							@ -439,11 +439,6 @@ func (c *Context) GetPostFormArray(key string) ([]string, bool) {
 | 
				
			|||||||
	if values := req.PostForm[key]; len(values) > 0 {
 | 
						if values := req.PostForm[key]; len(values) > 0 {
 | 
				
			||||||
		return values, true
 | 
							return values, true
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if req.MultipartForm != nil && req.MultipartForm.File != nil {
 | 
					 | 
				
			||||||
		if values := req.MultipartForm.Value[key]; len(values) > 0 {
 | 
					 | 
				
			||||||
			return values, true
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return []string{}, false
 | 
						return []string{}, false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -462,13 +457,7 @@ func (c *Context) GetPostFormMap(key string) (map[string]string, bool) {
 | 
				
			|||||||
			debugPrint("error on parse multipart form map: %v", err)
 | 
								debugPrint("error on parse multipart form map: %v", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	dicts, exist := c.get(req.PostForm, key)
 | 
						return c.get(req.PostForm, key)
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if !exist && req.MultipartForm != nil && req.MultipartForm.File != nil {
 | 
					 | 
				
			||||||
		dicts, exist = c.get(req.MultipartForm.Value, key)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return dicts, exist
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// get is an internal method and returns a map which satisfy conditions.
 | 
					// get is an internal method and returns a map which satisfy conditions.
 | 
				
			||||||
@ -828,6 +817,12 @@ func (c *Context) AsciiJSON(code int, obj interface{}) {
 | 
				
			|||||||
	c.Render(code, render.AsciiJSON{Data: obj})
 | 
						c.Render(code, render.AsciiJSON{Data: obj})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// PureJSON serializes the given struct as JSON into the response body.
 | 
				
			||||||
 | 
					// PureJSON, unlike JSON, does not replace special html characters with their unicode entities.
 | 
				
			||||||
 | 
					func (c *Context) PureJSON(code int, obj interface{}) {
 | 
				
			||||||
 | 
						c.Render(code, render.PureJSON{Data: obj})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// XML serializes the given struct as XML into the response body.
 | 
					// XML serializes the given struct as XML into the response body.
 | 
				
			||||||
// It also sets the Content-Type as "application/xml".
 | 
					// It also sets the Content-Type as "application/xml".
 | 
				
			||||||
func (c *Context) XML(code int, obj interface{}) {
 | 
					func (c *Context) XML(code int, obj interface{}) {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,17 +0,0 @@
 | 
				
			|||||||
// Copyright 2018 Gin Core Team.  All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a MIT style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// +build go1.7
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package gin
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"github.com/gin-gonic/gin/render"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// PureJSON serializes the given struct as JSON into the response body.
 | 
					 | 
				
			||||||
// PureJSON, unlike JSON, does not replace special html characters with their unicode entities.
 | 
					 | 
				
			||||||
func (c *Context) PureJSON(code int, obj interface{}) {
 | 
					 | 
				
			||||||
	c.Render(code, render.PureJSON{Data: obj})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,27 +0,0 @@
 | 
				
			|||||||
// Copyright 2018 Gin Core Team.  All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a MIT style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// +build go1.7
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package gin
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"net/http"
 | 
					 | 
				
			||||||
	"net/http/httptest"
 | 
					 | 
				
			||||||
	"testing"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/stretchr/testify/assert"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Tests that the response is serialized as JSON
 | 
					 | 
				
			||||||
// and Content-Type is set to application/json
 | 
					 | 
				
			||||||
// and special HTML characters are preserved
 | 
					 | 
				
			||||||
func TestContextRenderPureJSON(t *testing.T) {
 | 
					 | 
				
			||||||
	w := httptest.NewRecorder()
 | 
					 | 
				
			||||||
	c, _ := CreateTestContext(w)
 | 
					 | 
				
			||||||
	c.PureJSON(http.StatusCreated, H{"foo": "bar", "html": "<b>"})
 | 
					 | 
				
			||||||
	assert.Equal(t, http.StatusCreated, w.Code)
 | 
					 | 
				
			||||||
	assert.Equal(t, "{\"foo\":\"bar\",\"html\":\"<b>\"}\n", w.Body.String())
 | 
					 | 
				
			||||||
	assert.Equal(t, "application/json; charset=utf-8", w.Header().Get("Content-Type"))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -622,8 +622,7 @@ func TestContextGetCookie(t *testing.T) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestContextBodyAllowedForStatus(t *testing.T) {
 | 
					func TestContextBodyAllowedForStatus(t *testing.T) {
 | 
				
			||||||
	// todo(thinkerou): go1.6 not support StatusProcessing
 | 
						assert.False(t, false, bodyAllowedForStatus(http.StatusProcessing))
 | 
				
			||||||
	assert.False(t, false, bodyAllowedForStatus(102))
 | 
					 | 
				
			||||||
	assert.False(t, false, bodyAllowedForStatus(http.StatusNoContent))
 | 
						assert.False(t, false, bodyAllowedForStatus(http.StatusNoContent))
 | 
				
			||||||
	assert.False(t, false, bodyAllowedForStatus(http.StatusNotModified))
 | 
						assert.False(t, false, bodyAllowedForStatus(http.StatusNotModified))
 | 
				
			||||||
	assert.True(t, true, bodyAllowedForStatus(http.StatusInternalServerError))
 | 
						assert.True(t, true, bodyAllowedForStatus(http.StatusInternalServerError))
 | 
				
			||||||
@ -794,6 +793,18 @@ func TestContextRenderNoContentAsciiJSON(t *testing.T) {
 | 
				
			|||||||
	assert.Equal(t, "application/json", w.Header().Get("Content-Type"))
 | 
						assert.Equal(t, "application/json", w.Header().Get("Content-Type"))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Tests that the response is serialized as JSON
 | 
				
			||||||
 | 
					// and Content-Type is set to application/json
 | 
				
			||||||
 | 
					// and special HTML characters are preserved
 | 
				
			||||||
 | 
					func TestContextRenderPureJSON(t *testing.T) {
 | 
				
			||||||
 | 
						w := httptest.NewRecorder()
 | 
				
			||||||
 | 
						c, _ := CreateTestContext(w)
 | 
				
			||||||
 | 
						c.PureJSON(http.StatusCreated, H{"foo": "bar", "html": "<b>"})
 | 
				
			||||||
 | 
						assert.Equal(t, http.StatusCreated, w.Code)
 | 
				
			||||||
 | 
						assert.Equal(t, "{\"foo\":\"bar\",\"html\":\"<b>\"}\n", w.Body.String())
 | 
				
			||||||
 | 
						assert.Equal(t, "application/json; charset=utf-8", w.Header().Get("Content-Type"))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Tests that the response executes the templates
 | 
					// Tests that the response executes the templates
 | 
				
			||||||
// and responds with Content-Type set to text/html
 | 
					// and responds with Content-Type set to text/html
 | 
				
			||||||
func TestContextRenderHTML(t *testing.T) {
 | 
					func TestContextRenderHTML(t *testing.T) {
 | 
				
			||||||
@ -1092,9 +1103,7 @@ func TestContextRenderRedirectAll(t *testing.T) {
 | 
				
			|||||||
	assert.Panics(t, func() { c.Redirect(299, "/resource") })
 | 
						assert.Panics(t, func() { c.Redirect(299, "/resource") })
 | 
				
			||||||
	assert.Panics(t, func() { c.Redirect(309, "/resource") })
 | 
						assert.Panics(t, func() { c.Redirect(309, "/resource") })
 | 
				
			||||||
	assert.NotPanics(t, func() { c.Redirect(http.StatusMultipleChoices, "/resource") })
 | 
						assert.NotPanics(t, func() { c.Redirect(http.StatusMultipleChoices, "/resource") })
 | 
				
			||||||
	// todo(thinkerou): go1.6 not support StatusPermanentRedirect(308)
 | 
						assert.NotPanics(t, func() { c.Redirect(http.StatusPermanentRedirect, "/resource") })
 | 
				
			||||||
	// when we upgrade go version we can use http.StatusPermanentRedirect
 | 
					 | 
				
			||||||
	assert.NotPanics(t, func() { c.Redirect(308, "/resource") })
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestContextNegotiationWithJSON(t *testing.T) {
 | 
					func TestContextNegotiationWithJSON(t *testing.T) {
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										4
									
								
								debug.go
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								debug.go
									
									
									
									
									
								
							@ -14,7 +14,7 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const ginSupportMinGoVer = 6
 | 
					const ginSupportMinGoVer = 8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IsDebugging returns true if the framework is running in debug mode.
 | 
					// IsDebugging returns true if the framework is running in debug mode.
 | 
				
			||||||
// Use SetMode(gin.ReleaseMode) to disable debug mode.
 | 
					// Use SetMode(gin.ReleaseMode) to disable debug mode.
 | 
				
			||||||
@ -69,7 +69,7 @@ func getMinVer(v string) (uint64, error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func debugPrintWARNINGDefault() {
 | 
					func debugPrintWARNINGDefault() {
 | 
				
			||||||
	if v, e := getMinVer(runtime.Version()); e == nil && v <= ginSupportMinGoVer {
 | 
						if v, e := getMinVer(runtime.Version()); e == nil && v <= ginSupportMinGoVer {
 | 
				
			||||||
		debugPrint(`[WARNING] Now Gin requires Go 1.6 or later and Go 1.7 will be required soon.
 | 
							debugPrint(`[WARNING] Now Gin requires Go 1.8 or later and Go 1.9 will be required soon.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
`)
 | 
					`)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
@ -91,7 +91,7 @@ func TestDebugPrintWARNINGDefault(t *testing.T) {
 | 
				
			|||||||
	})
 | 
						})
 | 
				
			||||||
	m, e := getMinVer(runtime.Version())
 | 
						m, e := getMinVer(runtime.Version())
 | 
				
			||||||
	if e == nil && m <= ginSupportMinGoVer {
 | 
						if e == nil && m <= ginSupportMinGoVer {
 | 
				
			||||||
		assert.Equal(t, "[GIN-debug] [WARNING] Now Gin requires Go 1.6 or later and Go 1.7 will be required soon.\n\n[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.\n\n", re)
 | 
							assert.Equal(t, "[GIN-debug] [WARNING] Now Gin requires Go 1.8 or later and Go 1.9 will be required soon.\n\n[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.\n\n", re)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		assert.Equal(t, "[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.\n\n", re)
 | 
							assert.Equal(t, "[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.\n\n", re)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
@ -8,6 +8,7 @@ import (
 | 
				
			|||||||
	"bufio"
 | 
						"bufio"
 | 
				
			||||||
	"crypto/tls"
 | 
						"crypto/tls"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
						"html/template"
 | 
				
			||||||
	"io/ioutil"
 | 
						"io/ioutil"
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
@ -69,6 +70,42 @@ func TestRunTLS(t *testing.T) {
 | 
				
			|||||||
	testRequest(t, "https://localhost:8443/example")
 | 
						testRequest(t, "https://localhost:8443/example")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestPusher(t *testing.T) {
 | 
				
			||||||
 | 
						var html = template.Must(template.New("https").Parse(`
 | 
				
			||||||
 | 
					<html>
 | 
				
			||||||
 | 
					<head>
 | 
				
			||||||
 | 
					  <title>Https Test</title>
 | 
				
			||||||
 | 
					  <script src="/assets/app.js"></script>
 | 
				
			||||||
 | 
					</head>
 | 
				
			||||||
 | 
					<body>
 | 
				
			||||||
 | 
					  <h1 style="color:red;">Welcome, Ginner!</h1>
 | 
				
			||||||
 | 
					</body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
 | 
					`))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						router := New()
 | 
				
			||||||
 | 
						router.Static("./assets", "./assets")
 | 
				
			||||||
 | 
						router.SetHTMLTemplate(html)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						go func() {
 | 
				
			||||||
 | 
							router.GET("/pusher", func(c *Context) {
 | 
				
			||||||
 | 
								if pusher := c.Writer.Pusher(); pusher != nil {
 | 
				
			||||||
 | 
									pusher.Push("/assets/app.js", nil)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								c.String(http.StatusOK, "it worked")
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							assert.NoError(t, router.RunTLS(":8449", "./testdata/certificate/cert.pem", "./testdata/certificate/key.pem"))
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// have to wait for the goroutine to start and run the server
 | 
				
			||||||
 | 
						// otherwise the main thread will complete
 | 
				
			||||||
 | 
						time.Sleep(5 * time.Millisecond)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert.Error(t, router.RunTLS(":8449", "./testdata/certificate/cert.pem", "./testdata/certificate/key.pem"))
 | 
				
			||||||
 | 
						testRequest(t, "https://localhost:8449/pusher")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestRunEmptyWithEnv(t *testing.T) {
 | 
					func TestRunEmptyWithEnv(t *testing.T) {
 | 
				
			||||||
	os.Setenv("PORT", "3123")
 | 
						os.Setenv("PORT", "3123")
 | 
				
			||||||
	router := New()
 | 
						router := New()
 | 
				
			||||||
 | 
				
			|||||||
@ -2,8 +2,6 @@
 | 
				
			|||||||
// Use of this source code is governed by a MIT style
 | 
					// Use of this source code is governed by a MIT style
 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					// license that can be found in the LICENSE file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// +build go1.7
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package gin
 | 
					package gin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
				
			|||||||
@ -43,6 +43,11 @@ type AsciiJSON struct {
 | 
				
			|||||||
// SecureJSONPrefix is a string which represents SecureJSON prefix.
 | 
					// SecureJSONPrefix is a string which represents SecureJSON prefix.
 | 
				
			||||||
type SecureJSONPrefix string
 | 
					type SecureJSONPrefix string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// PureJSON contains the given interface object.
 | 
				
			||||||
 | 
					type PureJSON struct {
 | 
				
			||||||
 | 
						Data interface{}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var jsonContentType = []string{"application/json; charset=utf-8"}
 | 
					var jsonContentType = []string{"application/json; charset=utf-8"}
 | 
				
			||||||
var jsonpContentType = []string{"application/javascript; charset=utf-8"}
 | 
					var jsonpContentType = []string{"application/javascript; charset=utf-8"}
 | 
				
			||||||
var jsonAsciiContentType = []string{"application/json"}
 | 
					var jsonAsciiContentType = []string{"application/json"}
 | 
				
			||||||
@ -174,3 +179,16 @@ func (r AsciiJSON) Render(w http.ResponseWriter) (err error) {
 | 
				
			|||||||
func (r AsciiJSON) WriteContentType(w http.ResponseWriter) {
 | 
					func (r AsciiJSON) WriteContentType(w http.ResponseWriter) {
 | 
				
			||||||
	writeContentType(w, jsonAsciiContentType)
 | 
						writeContentType(w, jsonAsciiContentType)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Render (PureJSON) writes custom ContentType and encodes the given interface object.
 | 
				
			||||||
 | 
					func (r PureJSON) Render(w http.ResponseWriter) error {
 | 
				
			||||||
 | 
						r.WriteContentType(w)
 | 
				
			||||||
 | 
						encoder := json.NewEncoder(w)
 | 
				
			||||||
 | 
						encoder.SetEscapeHTML(false)
 | 
				
			||||||
 | 
						return encoder.Encode(r.Data)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// WriteContentType (PureJSON) writes custom ContentType.
 | 
				
			||||||
 | 
					func (r PureJSON) WriteContentType(w http.ResponseWriter) {
 | 
				
			||||||
 | 
						writeContentType(w, jsonContentType)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,31 +0,0 @@
 | 
				
			|||||||
// Copyright 2018 Gin Core Team.  All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a MIT style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// +build go1.7
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package render
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"net/http"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/gin-gonic/gin/internal/json"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// PureJSON contains the given interface object.
 | 
					 | 
				
			||||||
type PureJSON struct {
 | 
					 | 
				
			||||||
	Data interface{}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Render (PureJSON) writes custom ContentType and encodes the given interface object.
 | 
					 | 
				
			||||||
func (r PureJSON) Render(w http.ResponseWriter) error {
 | 
					 | 
				
			||||||
	r.WriteContentType(w)
 | 
					 | 
				
			||||||
	encoder := json.NewEncoder(w)
 | 
					 | 
				
			||||||
	encoder.SetEscapeHTML(false)
 | 
					 | 
				
			||||||
	return encoder.Encode(r.Data)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// WriteContentType (PureJSON) writes custom ContentType.
 | 
					 | 
				
			||||||
func (r PureJSON) WriteContentType(w http.ResponseWriter) {
 | 
					 | 
				
			||||||
	writeContentType(w, jsonContentType)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -18,9 +18,7 @@ type Redirect struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Render (Redirect) redirects the http request to new location and writes redirect response.
 | 
					// Render (Redirect) redirects the http request to new location and writes redirect response.
 | 
				
			||||||
func (r Redirect) Render(w http.ResponseWriter) error {
 | 
					func (r Redirect) Render(w http.ResponseWriter) error {
 | 
				
			||||||
	// todo(thinkerou): go1.6 not support StatusPermanentRedirect(308)
 | 
						if (r.Code < http.StatusMultipleChoices || r.Code > http.StatusPermanentRedirect) && r.Code != http.StatusCreated {
 | 
				
			||||||
	// when we upgrade go version we can use http.StatusPermanentRedirect
 | 
					 | 
				
			||||||
	if (r.Code < 300 || r.Code > 308) && r.Code != 201 {
 | 
					 | 
				
			||||||
		panic(fmt.Sprintf("Cannot redirect with status code %d", r.Code))
 | 
							panic(fmt.Sprintf("Cannot redirect with status code %d", r.Code))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	http.Redirect(w, r.Request, r.Location, r.Code)
 | 
						http.Redirect(w, r.Request, r.Location, r.Code)
 | 
				
			||||||
 | 
				
			|||||||
@ -1,26 +0,0 @@
 | 
				
			|||||||
// Copyright 2018 Gin Core Team.  All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a MIT style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// +build go1.7
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package render
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"net/http/httptest"
 | 
					 | 
				
			||||||
	"testing"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/stretchr/testify/assert"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func TestRenderPureJSON(t *testing.T) {
 | 
					 | 
				
			||||||
	w := httptest.NewRecorder()
 | 
					 | 
				
			||||||
	data := map[string]interface{}{
 | 
					 | 
				
			||||||
		"foo":  "bar",
 | 
					 | 
				
			||||||
		"html": "<b>",
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	err := (PureJSON{data}).Render(w)
 | 
					 | 
				
			||||||
	assert.NoError(t, err)
 | 
					 | 
				
			||||||
	assert.Equal(t, "{\"foo\":\"bar\",\"html\":\"<b>\"}\n", w.Body.String())
 | 
					 | 
				
			||||||
	assert.Equal(t, "application/json; charset=utf-8", w.Header().Get("Content-Type"))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -215,6 +215,18 @@ func TestRenderAsciiJSONFail(t *testing.T) {
 | 
				
			|||||||
	assert.Error(t, (AsciiJSON{data}).Render(w))
 | 
						assert.Error(t, (AsciiJSON{data}).Render(w))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestRenderPureJSON(t *testing.T) {
 | 
				
			||||||
 | 
						w := httptest.NewRecorder()
 | 
				
			||||||
 | 
						data := map[string]interface{}{
 | 
				
			||||||
 | 
							"foo":  "bar",
 | 
				
			||||||
 | 
							"html": "<b>",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						err := (PureJSON{data}).Render(w)
 | 
				
			||||||
 | 
						assert.NoError(t, err)
 | 
				
			||||||
 | 
						assert.Equal(t, "{\"foo\":\"bar\",\"html\":\"<b>\"}\n", w.Body.String())
 | 
				
			||||||
 | 
						assert.Equal(t, "application/json; charset=utf-8", w.Header().Get("Content-Type"))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type xmlmap map[string]interface{}
 | 
					type xmlmap map[string]interface{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Allows type H to be used with xml.Marshal
 | 
					// Allows type H to be used with xml.Marshal
 | 
				
			||||||
 | 
				
			|||||||
@ -16,7 +16,8 @@ const (
 | 
				
			|||||||
	defaultStatus = http.StatusOK
 | 
						defaultStatus = http.StatusOK
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type responseWriterBase interface {
 | 
					// ResponseWriter ...
 | 
				
			||||||
 | 
					type ResponseWriter interface {
 | 
				
			||||||
	http.ResponseWriter
 | 
						http.ResponseWriter
 | 
				
			||||||
	http.Hijacker
 | 
						http.Hijacker
 | 
				
			||||||
	http.Flusher
 | 
						http.Flusher
 | 
				
			||||||
@ -37,6 +38,9 @@ type responseWriterBase interface {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Forces to write the http header (status code + headers).
 | 
						// Forces to write the http header (status code + headers).
 | 
				
			||||||
	WriteHeaderNow()
 | 
						WriteHeaderNow()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// get the http.Pusher for server push
 | 
				
			||||||
 | 
						Pusher() http.Pusher
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type responseWriter struct {
 | 
					type responseWriter struct {
 | 
				
			||||||
@ -113,3 +117,10 @@ func (w *responseWriter) Flush() {
 | 
				
			|||||||
	w.WriteHeaderNow()
 | 
						w.WriteHeaderNow()
 | 
				
			||||||
	w.ResponseWriter.(http.Flusher).Flush()
 | 
						w.ResponseWriter.(http.Flusher).Flush()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w *responseWriter) Pusher() (pusher http.Pusher) {
 | 
				
			||||||
 | 
						if pusher, ok := w.ResponseWriter.(http.Pusher); ok {
 | 
				
			||||||
 | 
							return pusher
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,12 +0,0 @@
 | 
				
			|||||||
// +build !go1.8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Copyright 2018 Gin Core Team.  All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a MIT style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package gin
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ResponseWriter ...
 | 
					 | 
				
			||||||
type ResponseWriter interface {
 | 
					 | 
				
			||||||
	responseWriterBase
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,25 +0,0 @@
 | 
				
			|||||||
// +build go1.8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Copyright 2018 Gin Core Team.  All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a MIT style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package gin
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"net/http"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ResponseWriter ...
 | 
					 | 
				
			||||||
type ResponseWriter interface {
 | 
					 | 
				
			||||||
	responseWriterBase
 | 
					 | 
				
			||||||
	// get the http.Pusher for server push
 | 
					 | 
				
			||||||
	Pusher() http.Pusher
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (w *responseWriter) Pusher() (pusher http.Pusher) {
 | 
					 | 
				
			||||||
	if pusher, ok := w.ResponseWriter.(http.Pusher); ok {
 | 
					 | 
				
			||||||
		return pusher
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										82
									
								
								vendor/vendor.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										82
									
								
								vendor/vendor.json
									
									
									
									
										vendored
									
									
								
							@ -1,5 +1,5 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	"comment": "v1.3.0",
 | 
						"comment": "v1.4.0",
 | 
				
			||||||
	"ignore": "test",
 | 
						"ignore": "test",
 | 
				
			||||||
	"package": [
 | 
						"package": [
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
@ -13,16 +13,16 @@
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			"checksumSHA1": "QeKwBtN2df+j+4stw3bQJ6yO4EY=",
 | 
								"checksumSHA1": "QeKwBtN2df+j+4stw3bQJ6yO4EY=",
 | 
				
			||||||
			"path": "github.com/gin-contrib/sse",
 | 
								"path": "github.com/gin-contrib/sse",
 | 
				
			||||||
			"revision": "22d885f9ecc78bf4ee5d72b937e4bbcdc58e8cae",
 | 
								"revision": "5545eab6dad3bbbd6c5ae9186383c2a9d23c0dae",
 | 
				
			||||||
			"revisionTime": "2017-01-09T09:34:21Z"
 | 
								"revisionTime": "2019-03-01T06:25:29Z"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"checksumSHA1": "mE9XW26JSpe4meBObM6J/Oeq0eg=",
 | 
								"checksumSHA1": "Y2MOwzNZfl4NRNDbLCZa6sgx7O0=",
 | 
				
			||||||
			"path": "github.com/golang/protobuf/proto",
 | 
								"path": "github.com/golang/protobuf/proto",
 | 
				
			||||||
			"revision": "aa810b61a9c79d51363740d207bb46cf8e620ed5",
 | 
								"revision": "c823c79ea1570fb5ff454033735a8e68575d1d0f",
 | 
				
			||||||
			"revisionTime": "2018-08-14T21:14:27Z",
 | 
								"revisionTime": "2019-02-05T22:20:52Z",
 | 
				
			||||||
			"version": "v1.2",
 | 
								"version": "v1.3",
 | 
				
			||||||
			"versionExact": "v1.2.0"
 | 
								"versionExact": "v1.3.0"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"checksumSHA1": "WqeEgS7pqqkwK8mlrAZmDgtWJMY=",
 | 
								"checksumSHA1": "WqeEgS7pqqkwK8mlrAZmDgtWJMY=",
 | 
				
			||||||
@ -33,12 +33,24 @@
 | 
				
			|||||||
			"versionExact": "v1.1.5"
 | 
								"versionExact": "v1.1.5"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"checksumSHA1": "w5RcOnfv5YDr3j2bd1YydkPiZx4=",
 | 
								"checksumSHA1": "rrXDDvz+nQ2KRLQk6nxWaE5Zj1U=",
 | 
				
			||||||
			"path": "github.com/mattn/go-isatty",
 | 
								"path": "github.com/mattn/go-isatty",
 | 
				
			||||||
			"revision": "6ca4dbf54d38eea1a992b3c722a76a5d1c4cb25c",
 | 
								"revision": "369ecd8cea9851e459abb67eb171853e3986591e",
 | 
				
			||||||
			"revisionTime": "2017-11-07T05:05:31Z",
 | 
								"revisionTime": "2019-02-25T17:38:24Z",
 | 
				
			||||||
			"version": "v0.0",
 | 
								"version": "v0.0",
 | 
				
			||||||
			"versionExact": "v0.0.4"
 | 
								"versionExact": "v0.0.6"
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								"checksumSHA1": "ZTcgWKWHsrX0RXYVXn5Xeb8Q0go=",
 | 
				
			||||||
 | 
								"path": "github.com/modern-go/concurrent",
 | 
				
			||||||
 | 
								"revision": "bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94",
 | 
				
			||||||
 | 
								"revisionTime": "2018-03-06T01:26:44Z"
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								"checksumSHA1": "qvH48wzTIV3QKSDqI0dLFtVjaDI=",
 | 
				
			||||||
 | 
								"path": "github.com/modern-go/reflect2",
 | 
				
			||||||
 | 
								"revision": "94122c33edd36123c84d5368cfb2b69df93a0ec8",
 | 
				
			||||||
 | 
								"revisionTime": "2018-07-18T01:23:57Z"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"checksumSHA1": "LuFv4/jlrmFNnDb/5SCSEPAM9vU=",
 | 
								"checksumSHA1": "LuFv4/jlrmFNnDb/5SCSEPAM9vU=",
 | 
				
			||||||
@ -46,6 +58,20 @@
 | 
				
			|||||||
			"revision": "5d4384ee4fb2527b0a1256a821ebfc92f91efefc",
 | 
								"revision": "5d4384ee4fb2527b0a1256a821ebfc92f91efefc",
 | 
				
			||||||
			"revisionTime": "2018-12-26T10:54:42Z"
 | 
								"revisionTime": "2018-12-26T10:54:42Z"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								"checksumSHA1": "cpNsoLqBprpKh+VZTBOZNVXzBEk=",
 | 
				
			||||||
 | 
								"path": "github.com/stretchr/objx",
 | 
				
			||||||
 | 
								"revision": "c61a9dfcced1815e7d40e214d00d1a8669a9f58c",
 | 
				
			||||||
 | 
								"revisionTime": "2019-02-11T16:23:28Z"
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								"checksumSHA1": "DBdcVxnvaINHhWyyGgih/Mel6gE=",
 | 
				
			||||||
 | 
								"path": "github.com/stretchr/testify",
 | 
				
			||||||
 | 
								"revision": "ffdc059bfe9ce6a4e144ba849dbedead332c6053",
 | 
				
			||||||
 | 
								"revisionTime": "2018-12-05T02:12:43Z",
 | 
				
			||||||
 | 
								"version": "v1.3",
 | 
				
			||||||
 | 
								"versionExact": "v1.3.0"
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"checksumSHA1": "c6pbpF7eowwO59phRTpF8cQ80Z0=",
 | 
								"checksumSHA1": "c6pbpF7eowwO59phRTpF8cQ80Z0=",
 | 
				
			||||||
			"path": "github.com/stretchr/testify/assert",
 | 
								"path": "github.com/stretchr/testify/assert",
 | 
				
			||||||
@ -55,12 +81,26 @@
 | 
				
			|||||||
			"versionExact": "v1.2.2"
 | 
								"versionExact": "v1.2.2"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"checksumSHA1": "5Bd8RPhhaKcEXkagzPqymP4Gx5E=",
 | 
								"checksumSHA1": "fg3TzS9/QK3wZbzei3Z6O8XPLHg=",
 | 
				
			||||||
 | 
								"path": "github.com/stretchr/testify/http",
 | 
				
			||||||
 | 
								"revision": "ffdc059bfe9ce6a4e144ba849dbedead332c6053",
 | 
				
			||||||
 | 
								"revisionTime": "2018-12-05T02:12:43Z",
 | 
				
			||||||
 | 
								"version": "v1.3",
 | 
				
			||||||
 | 
								"versionExact": "v1.3.0"
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								"checksumSHA1": "lsdl3fgOiM4Iuy7xjTQxiBtAwB0=",
 | 
				
			||||||
 | 
								"path": "github.com/stretchr/testify/mock",
 | 
				
			||||||
 | 
								"revision": "ffdc059bfe9ce6a4e144ba849dbedead332c6053",
 | 
				
			||||||
 | 
								"revisionTime": "2018-12-05T02:12:43Z",
 | 
				
			||||||
 | 
								"version": "v1.3",
 | 
				
			||||||
 | 
								"versionExact": "v1.3.0"
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								"checksumSHA1": "WIhpR3EKGueRSJsYOZ6PIsfL4SI=",
 | 
				
			||||||
			"path": "github.com/ugorji/go/codec",
 | 
								"path": "github.com/ugorji/go/codec",
 | 
				
			||||||
			"revision": "b4c50a2b199d93b13dc15e78929cfb23bfdf21ab",
 | 
								"revision": "e444a5086c436778cf9281a7059a3d58b9e17935",
 | 
				
			||||||
			"revisionTime": "2018-04-07T10:07:33Z",
 | 
								"revisionTime": "2019-02-04T20:13:41Z"
 | 
				
			||||||
			"version": "v1.1",
 | 
					 | 
				
			||||||
			"versionExact": "v1.1.1"
 | 
					 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"checksumSHA1": "GtamqiJoL7PGHsN454AoffBFMa8=",
 | 
								"checksumSHA1": "GtamqiJoL7PGHsN454AoffBFMa8=",
 | 
				
			||||||
@ -83,12 +123,12 @@
 | 
				
			|||||||
			"versionExact": "v8.18.2"
 | 
								"versionExact": "v8.18.2"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"checksumSHA1": "ZSWoOPUNRr5+3dhkLK3C4cZAQPk=",
 | 
								"checksumSHA1": "QqDq2x8XOU7IoOR98Cx1eiV5QY8=",
 | 
				
			||||||
			"path": "gopkg.in/yaml.v2",
 | 
								"path": "gopkg.in/yaml.v2",
 | 
				
			||||||
			"revision": "5420a8b6744d3b0345ab293f6fcba19c978f1183",
 | 
								"revision": "51d6538a90f86fe93ac480b35f37b2be17fef232",
 | 
				
			||||||
			"revisionTime": "2018-03-28T19:50:20Z",
 | 
								"revisionTime": "2018-11-15T11:05:04Z",
 | 
				
			||||||
			"version": "v2.2",
 | 
								"version": "v2.2",
 | 
				
			||||||
			"versionExact": "v2.2.1"
 | 
								"versionExact": "v2.2.2"
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	],
 | 
						],
 | 
				
			||||||
	"rootPath": "github.com/gin-gonic/gin"
 | 
						"rootPath": "github.com/gin-gonic/gin"
 | 
				
			||||||
 | 
				
			|||||||
@ -5,4 +5,4 @@
 | 
				
			|||||||
package gin
 | 
					package gin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Version is the current gin framework's version.
 | 
					// Version is the current gin framework's version.
 | 
				
			||||||
const Version = "v1.4.0-dev"
 | 
					const Version = "v1.4.0"
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user