Skip to content

Commit

Permalink
Route supports HTTPS (#24)
Browse files Browse the repository at this point in the history
  • Loading branch information
hwbrzzl authored Feb 7, 2023
1 parent c2855d6 commit 5d9bf95
Show file tree
Hide file tree
Showing 13 changed files with 1,418 additions and 11 deletions.
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
go.sum
.env
.idea
.DS_Store
1 change: 1 addition & 0 deletions contracts/http/response.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ type Response interface {
Success() ResponseSuccess
Header(key, value string) Response
Origin() ResponseOrigin
Writer() http.ResponseWriter
}

//go:generate mockery --name=ResponseSuccess
Expand Down
1 change: 1 addition & 0 deletions contracts/route/route.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ type GroupFunc func(routes Route)
type Engine interface {
Route
Run(addr string) error
RunTLS(addr, certFile, keyFile string) error
ServeHTTP(w http.ResponseWriter, req *http.Request)
GlobalMiddleware(...httpcontract.Middleware)
}
Expand Down
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ require (
github.com/stretchr/objx v0.5.0 // indirect
github.com/subosito/gotenv v1.2.0 // indirect
github.com/ugorji/go/codec v1.2.6 // indirect
github.com/unrolled/secure v1.13.0 // indirect
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
github.com/xdg-go/scram v1.0.2 // indirect
github.com/xdg-go/stringprep v1.0.2 // indirect
Expand Down
1,231 changes: 1,231 additions & 0 deletions go.sum

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions http/gin_response.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@ func (r *GinResponse) Origin() httpcontract.ResponseOrigin {
return r.origin
}

func (c *GinResponse) Writer() http.ResponseWriter {
return c.instance.Writer
}

type GinSuccess struct {
instance *gin.Context
}
Expand Down
24 changes: 24 additions & 0 deletions http/middleware/tls.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package middleware

import (
nethttp "net/http"

"github.com/unrolled/secure"

"github.com/goravel/framework/contracts/http"
)

func Tls(attr string) http.Middleware {
return func(ctx http.Context) {
secureMiddleware := secure.New(secure.Options{
SSLRedirect: true,
SSLHost: attr,
})

if err := secureMiddleware.Process(ctx.Response().Writer(), ctx.Request().Origin()); err != nil {
ctx.Request().AbortWithStatus(nethttp.StatusForbidden)
}

ctx.Request().Next()
}
}
17 changes: 8 additions & 9 deletions route/gin.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
package route

import (
"fmt"
"net/http"

"github.com/gin-gonic/gin"
"github.com/gookit/color"

httpcontract "github.com/goravel/framework/contracts/http"
"github.com/goravel/framework/contracts/route"
"github.com/goravel/framework/facades"
goravelhttp "github.com/goravel/framework/http"
)

Expand All @@ -34,18 +32,19 @@ func NewGin() *Gin {
}

func (r *Gin) Run(addr string) error {
if facades.Config.GetBool("app.debug") && !runningInConsole() {
routes := r.instance.Routes()
for _, item := range routes {
fmt.Printf("%-10s %s\n", item.Method, colonToBracket(item.Path))
}
}

outputRoutes(r.instance.Routes())
color.Greenln("Listening and serving HTTP on " + addr)

return r.instance.Run([]string{addr}...)
}

func (r *Gin) RunTLS(addr, certFile, keyFile string) error {
outputRoutes(r.instance.Routes())
color.Greenln("Listening and serving HTTPS on " + addr)

return r.instance.RunTLS(addr, certFile, keyFile)
}

func (r *Gin) ServeHTTP(w http.ResponseWriter, req *http.Request) {
r.instance.ServeHTTP(w, req)
}
Expand Down
59 changes: 59 additions & 0 deletions route/gin_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,85 @@ package route

import (
"bytes"
"crypto/tls"
"encoding/json"
"errors"
"fmt"
"io"
"io/ioutil"
"mime/multipart"
"net/http"
"net/http/httptest"
"os"
"path/filepath"
"strings"
"testing"
"time"

"github.com/stretchr/testify/assert"

mockconfig "github.com/goravel/framework/contracts/config/mocks"
httpcontract "github.com/goravel/framework/contracts/http"
"github.com/goravel/framework/contracts/validation"
"github.com/goravel/framework/http/middleware"
"github.com/goravel/framework/testing/mock"
)

func TestRun(t *testing.T) {
mockConfig := mock.Config()
mockConfig.On("GetBool", "app.debug").Return(true).Twice()

addr := "127.0.0.1:3000"
route := NewGin()
route.Get("/", func(ctx httpcontract.Context) {
ctx.Response().Json(200, httpcontract.Json{
"Hello": "Goravel",
})
})
go func() {
assert.Nil(t, route.Run(addr))
}()

time.Sleep(1 * time.Second)
resp, err := http.Get("http://" + addr)
defer resp.Body.Close()
assert.Nil(t, err)
body, err := ioutil.ReadAll(resp.Body)
assert.Nil(t, err)
assert.Equal(t, "{\"Hello\":\"Goravel\"}", string(body))
mockConfig.AssertExpectations(t)
}

func TestRunTLS(t *testing.T) {
mockConfig := mock.Config()
mockConfig.On("GetBool", "app.debug").Return(true).Twice()

addr := "127.0.0.1:3001"
route := NewGin()
route.GlobalMiddleware(middleware.Tls(addr))
route.Get("/", func(ctx httpcontract.Context) {
ctx.Response().Json(200, httpcontract.Json{
"Hello": "Goravel",
})
})
go func() {
assert.Nil(t, route.RunTLS(addr, "test_ca.crt", "test_ca.key"))
}()

time.Sleep(1 * time.Second)
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{Transport: tr}
resp, err := client.Get("https://" + addr)
defer resp.Body.Close()
assert.Nil(t, err)
body, err := ioutil.ReadAll(resp.Body)
assert.Nil(t, err)
assert.Equal(t, "{\"Hello\":\"Goravel\"}", string(body))
mockConfig.AssertExpectations(t)
}

func TestGinRequest(t *testing.T) {
var (
gin *Gin
Expand Down
28 changes: 28 additions & 0 deletions route/test_ca.crt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
-----BEGIN CERTIFICATE-----
MIIEzDCCArQCCQDen8AQ/8eTlDANBgkqhkiG9w0BAQsFADAoMRAwDgYDVQQKDAdn
b3JhdmVsMRQwEgYDVQQDDAtnb3JhdmVsLmRldjAeFw0yMzAyMDYxNDIwMDFaFw0z
MzAyMDMxNDIwMDFaMCgxEDAOBgNVBAoMB2dvcmF2ZWwxFDASBgNVBAMMC2dvcmF2
ZWwuZGV2MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA60xLNlYSotID
hvCRcygPj5gj3ujC74NNE3fNwCNuRUQ0X41LRJU0JZ3ejSl4kpW8h1tD8Iyi9geE
zmGvUA/HF9EEY/KsmE6p4+pGFDbP1NLpAq6dwyO9qaTSJZajRN9BJN6So32QYSNx
qHKuTQcIYH9FJz7PZ8jfhfyzhH5/5BafBTotsYoGj1TI6O9iwisimqEMP7lXJKjM
Wzly1g29+lIAsnH722F6wBleOPc1Gs8gQAjsy10K8RNtxGAfKuYorEBDTA3xCt+2
K0+JFERK8kGHY4/fMfN4O4S32VvvFcuT1PGXxXkjMDVruI3Mf8xiZVq8ZKhrODOu
PxlRKhTF8NVAREDfMiY4YrEIgvrGsK4MN7eR1AdW72606n0XfYxDeTQwVwXvTvL2
onj1uU2J6uGmFhsG9Bnm4YuEc1VgHUvD0G82TBnMfq3AwoD0do7VgAqSdwLkgc/E
iJ4XDIsYfXbj7A5JeLeGQUMPSqyrjGAZy3dx0eQebao0146VK3Z/Q7Q+iWYWx9D6
LA8MgZoB7O8kgvWKjvSFPfHnCDhChb/FhAhSmHyqNZjjzsfOhpi9nW/2ZELKinsr
QjV3f/6asuViRzPIAnhSOx61zQRPXSU7MbJUIep3yxbC9zv1YsHzM2CipENw/Hzf
hYUv1Yi29+cp616HrCidWJuTibpHnFECAwEAATANBgkqhkiG9w0BAQsFAAOCAgEA
Pb2O9MT3xRc2Bn6acvcWRw1u1Fcbd/hC1jkOFVk2hbZ4SgeOGtxemIoDQglADdMc
PSSe+fbNMvQLURmdLAkahfrSDG7VXl6CqWQ25tnIhm/Bj8uo6VEAXpmvvlriGkRe
2xaq9cr3rRedZBy+7nMmceXi8HzBhnjzUGiRMdBvZg4jhtoNUaPTiXhbH7xmcKbR
KCyUjjRWXwLRrO5mME2dlnA+HMxN6eq0EJ6gSDREW2IsJnsT5K3Fa/Ia7PTEli2r
Dbhm6fSIw7Tdz/aYAaap7LU8S/ZDkUkj81NAHeBNUHKDARLPm/r1tJWgHT3y5N6M
J0akClUNFluco8Mr4tyEQthbGKHJWmK7TmKRgIYJBFn6Rt4Ch4vTsvDSCboo6LC+
28nj4uTBkjQfyyhwL1CjG5DtLD+WTvo0+vRBaIuNgslVoND6LfdLBlvUVA1XxU8/
OhFB5uSxmRv4EdTqgODrZJqzrHgKeHfRaJaYwWVsHzzuuNEQHSdCFhLQKrH+bhY3
Pvmue4TnU9zZhoDRZLkd7/BaDwAaKj1C/i4PA1OkspiHUlZT3mvmnsSPvq3OzNjD
pN+cej0Z84s05K8kbc3Sz49b73LGSdpeXXpbpsbwgf9OA9gIl9yN9UhhXOK4+//8
skBk8dF7NZguV3rSF4nal22eaIfIsaLoA46f/HiCGBM=
-----END CERTIFICATE-----
52 changes: 52 additions & 0 deletions route/test_ca.key
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
Ber+po/sQ5DgR7wLC4YxUTsKs1NO69I=
-----END PRIVATE KEY-----
8 changes: 8 additions & 0 deletions route/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,3 +105,11 @@ func runningInConsole() bool {

return len(args) >= 2 && args[1] == "artisan"
}

func outputRoutes(routes gin.RoutesInfo) {
if facades.Config.GetBool("app.debug") && !runningInConsole() {
for _, item := range routes {
fmt.Printf("%-10s %s\n", item.Method, colonToBracket(item.Path))
}
}
}
2 changes: 1 addition & 1 deletion support/constant.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package support

const Version string = "1.8.1"
const Version string = "1.8.3"

var RootPath string

0 comments on commit 5d9bf95

Please sign in to comment.