Add test for Redirect while ListenTLS/ListenLETSENCRYPT

This commit is contained in:
Gerasimos (Makis) Maropoulos 2016-12-04 06:53:08 +02:00
parent b62302d1d7
commit 0513fa745b
3 changed files with 84 additions and 23 deletions

View File

@ -30,14 +30,15 @@
<br/> <br/>
<b>iris</b> is a web application framework written in Go. <b>Iris</b> is a well known web application framework written in Go.
<b>Easy</b> to <a href="https://github.com/iris-contrib/examples">learn</a>, while it's highly customizable. <br/> <br/>
<b>Easy</b> to <a href="https://github.com/iris-contrib/examples">learn</a>, while it's highly customizable, <br/>
<i>ideally suited for both experienced and novice Developers.</i><br/><br/>
Its only sin? Its only sin?
To be the <b>fastest</b> web framework was ever published under open-source circumstances.<br/> To be the <b>fastest</b> web framework was ever published under open-source circumstances.<br/>
<i>Companies' offers were rejected, free forever.</i><br/><br/>
<b>Enjoy</b> this framework now, without hesitation.<br/> <b>Enjoy yourself!</b><br/>
</p> </p>
@ -45,22 +46,17 @@ To be the <b>fastest</b> web framework was ever published under open-source circ
Quick Start Quick Start
----------- -----------
The only requirement is the [Go Programming Language](https://golang.org/dl), at least v1.7. The only requirement is the [Go Programming Language](https://golang.org/dl) 1.7+
```bash ```bash
$ go get -u github.com/kataras/iris $ go get -u github.com/kataras/iris/iris
``` ```
> Production? Install the [stable version](https://github.com/kataras/iris/tree/4.0.0#versioning) instead ### Hello, JSON!
```bash
$ go get -u gopkg.in/kataras/iris.v4
```
### Hello, World!
```sh ```sh
$ cat helloworld.go $ cat hellojson.go
``` ```
```go ```go
@ -70,21 +66,37 @@ import "github.com/kataras/iris"
func main(){ func main(){
iris.Get("/", func(c *iris.Context){ // http://localhost:5700/api/user/42
c.HTML(iris.StatusOK, "<h1> Hello World! </h1>") // Method: "GET"
iris.Get("/api/user/:id", func(ctx *iris.Context){
// take the :id from the path, parse to integer
// and set it to the new userID local variable.
userID := ctx.ParamInt("id")
// userRepo, imaginary database service <- your only job.
user := userRepo.GetByID(userID)
// send back a response to the client,
// .JSON: content type as application/json; charset="utf-8"
// iris.StatusOK: with 200 http status code.
//
// send user as it is or make use of any json valid golang type,
// like the iris.Map{"username" : user.Username}.
ctx.JSON(iris.StatusOK, user)
}) })
iris.Listen("localhost:5700")
iris.Listen(":8080")
} }
``` ```
```sh ```sh
$ go run helloworld.go $ go run hellojson.go
``` ```
Open your browser at http://localhost:8080 and you should see the `Hello World!`. Open your browser or any other http client at http://localhost:5700/api/user/42.
### New ### New

View File

@ -471,6 +471,10 @@ func (ctx *Context) SetHeader(k string, v string) {
ctx.RequestCtx.Response.Header.Set(k, v) ctx.RequestCtx.Response.Header.Set(k, v)
} }
// it used only inside Redirect,
// keep it here for allocations reason
var httpsSchemeOnlyBytes = []byte("https")
// Redirect redirect sends a redirect response the client // Redirect redirect sends a redirect response the client
// accepts 2 parameters string and an optional int // accepts 2 parameters string and an optional int
// first parameter is the url to redirect // first parameter is the url to redirect
@ -486,12 +490,10 @@ func (ctx *Context) Redirect(urlToRedirect string, statusHeader ...int) {
// #355 // #355
if ctx.IsTLS() { if ctx.IsTLS() {
u := fasthttp.AcquireURI() u := ctx.URI()
ctx.URI().CopyTo(u) u.SetSchemeBytes(httpsSchemeOnlyBytes)
u.SetScheme("https")
u.Update(urlToRedirect) u.Update(urlToRedirect)
ctx.SetHeader("Location", string(u.FullURI())) ctx.SetHeader("Location", string(u.FullURI()))
fasthttp.ReleaseURI(u)
ctx.SetStatusCode(httpStatus) ctx.SetStatusCode(httpStatus)
return return
} }

View File

@ -751,3 +751,50 @@ func TestCache(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
} }
func TestRedirectHTTPS(t *testing.T) {
host := "localhost:5700"
expectedBody := "Redirected to https://" + host + "/redirected"
iris.ResetDefault()
defer iris.Close()
iris.Set(iris.OptionDisableBanner(true))
iris.Get("/redirect", func(ctx *iris.Context) { ctx.Redirect("/redirected") })
iris.Get("/redirected", func(ctx *iris.Context) { ctx.Text(iris.StatusOK, "Redirected to "+ctx.URI().String()) })
// create the key and cert files on the fly, and delete them when this test finished
// note: code dublication but it's ok we may change that to local ListenLETSENCRYPT
certFile, ferr := ioutil.TempFile("", "cert")
if ferr != nil {
t.Fatal(ferr.Error())
}
keyFile, ferr := ioutil.TempFile("", "key")
if ferr != nil {
t.Fatal(ferr.Error())
}
defer func() {
certFile.Close()
time.Sleep(350 * time.Millisecond)
os.Remove(certFile.Name())
keyFile.Close()
time.Sleep(350 * time.Millisecond)
os.Remove(keyFile.Name())
}()
certFile.WriteString(testTLSCert)
keyFile.WriteString(testTLSKey)
go iris.ListenTLS(host, certFile.Name(), keyFile.Name())
if ok := <-iris.Default.Available; !ok {
t.Fatal("Unexpected error: server cannot start, please report this as bug!!")
}
e := httptest.New(iris.Default, t, httptest.ExplicitURL(true))
e.Request("GET", "https://"+host+"/redirect").Expect().Status(iris.StatusOK).Body().Equal(expectedBody)
}