Skip to content

Commit b57bb94

Browse files
committed
Add ability to customize server engine
1 parent 9d57f45 commit b57bb94

File tree

3 files changed

+107
-84
lines changed

3 files changed

+107
-84
lines changed

engine_adapter_go.go

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package revel
2+
3+
import (
4+
"fmt"
5+
"net"
6+
"net/http"
7+
"time"
8+
9+
"golang.org/x/net/websocket"
10+
)
11+
12+
13+
// Register the GOHttpServer engine
14+
func init() {
15+
RegisterServerEngine(&GOHttpServer{})
16+
}
17+
type GOHttpServer struct {
18+
Server *http.Server
19+
ServerInit *EngineInit
20+
}
21+
22+
func (g *GOHttpServer) Init(init *EngineInit) {
23+
g.ServerInit = init
24+
g.Server = &http.Server{
25+
Addr: init.Address,
26+
Handler: http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request){
27+
g.Handle(writer,request)
28+
}),
29+
ReadTimeout: time.Duration(Config.IntDefault("http.timeout.read", 0)) * time.Second,
30+
WriteTimeout: time.Duration(Config.IntDefault("http.timeout.write", 0)) * time.Second,
31+
}
32+
// Server already initialized
33+
34+
35+
}
36+
func (g *GOHttpServer) Start() {
37+
go func() {
38+
time.Sleep(100 * time.Millisecond)
39+
fmt.Printf("Listening on %s...\n", g.Server.Addr)
40+
}()
41+
if HTTPSsl {
42+
if g.ServerInit.Network != "tcp" {
43+
// This limitation is just to reduce complexity, since it is standard
44+
// to terminate SSL upstream when using unix domain sockets.
45+
ERROR.Fatalln("SSL is only supported for TCP sockets. Specify a port to listen on.")
46+
}
47+
ERROR.Fatalln("Failed to listen:",
48+
g.Server.ListenAndServeTLS(HTTPSslCert, HTTPSslKey))
49+
} else {
50+
listener, err := net.Listen(g.ServerInit.Network, g.Server.Addr)
51+
if err != nil {
52+
ERROR.Fatalln("Failed to listen:", err)
53+
}
54+
ERROR.Fatalln("Failed to serve:", g.Server.Serve(listener))
55+
}
56+
57+
}
58+
59+
func (g *GOHttpServer) Handle(w http.ResponseWriter, r *http.Request) {
60+
if maxRequestSize := int64(Config.IntDefault("http.maxrequestsize", 0)); maxRequestSize > 0 {
61+
r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize)
62+
}
63+
64+
upgrade := r.Header.Get("Upgrade")
65+
if upgrade == "websocket" || upgrade == "Websocket" {
66+
websocket.Handler(func(ws *websocket.Conn) {
67+
//Override default Read/Write timeout with sane value for a web socket request
68+
if err := ws.SetDeadline(time.Now().Add(time.Hour * 24)); err != nil {
69+
ERROR.Println("SetDeadLine failed:", err)
70+
}
71+
r.Method = "WS"
72+
g.ServerInit.Callback(w, r, ws)
73+
}).ServeHTTP(w, r)
74+
} else {
75+
g.ServerInit.Callback(w, r, nil)
76+
}
77+
}
78+
79+
const GO_NATIVE_SERVER_ENGINE = "go"
80+
81+
func (g *GOHttpServer) Name() string {
82+
return GO_NATIVE_SERVER_ENGINE
83+
}
84+
85+
func (g *GOHttpServer) Engine() interface{} {
86+
return g.Server
87+
}
88+
89+
func (g *GOHttpServer) Event(event int, args interface{}) {
90+
91+
}
92+

server-engine.go

Lines changed: 1 addition & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@
55
package revel
66

77
import (
8-
"fmt"
9-
"net"
108
"net/http"
11-
"time"
129

1310
"golang.org/x/net/websocket"
1411
)
@@ -20,7 +17,7 @@ type ServerEngine interface {
2017
// Starts the server. This will block until server is stopped
2118
Start()
2219
// Fires a new event to the server
23-
Event(event string, args interface{})
20+
Event(event int, args interface{})
2421
// Returns the engine instance for specific calls
2522
Engine() interface{}
2623
// Returns the engine Name
@@ -34,83 +31,3 @@ type EngineInit struct {
3431
Port int
3532
Callback func(http.ResponseWriter, *http.Request, *websocket.Conn)
3633
}
37-
38-
// Register the GOHttpServer engine
39-
func init() {
40-
RegisterServerEngine(&GOHttpServer{})
41-
}
42-
type GOHttpServer struct {
43-
Server *http.Server
44-
ServerInit *EngineInit
45-
}
46-
47-
func (g *GOHttpServer) Init(init *EngineInit) {
48-
g.ServerInit = init
49-
g.Server = &http.Server{
50-
Addr: init.Address,
51-
Handler: http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request){
52-
g.Handle(writer,request)
53-
}),
54-
ReadTimeout: time.Duration(Config.IntDefault("http.timeout.read", 0)) * time.Second,
55-
WriteTimeout: time.Duration(Config.IntDefault("http.timeout.write", 0)) * time.Second,
56-
}
57-
// Server already initialized
58-
59-
60-
}
61-
func (g *GOHttpServer) Start() {
62-
go func() {
63-
time.Sleep(100 * time.Millisecond)
64-
fmt.Printf("Listening on %s...\n", g.Server.Addr)
65-
}()
66-
if HTTPSsl {
67-
if g.ServerInit.Network != "tcp" {
68-
// This limitation is just to reduce complexity, since it is standard
69-
// to terminate SSL upstream when using unix domain sockets.
70-
ERROR.Fatalln("SSL is only supported for TCP sockets. Specify a port to listen on.")
71-
}
72-
ERROR.Fatalln("Failed to listen:",
73-
g.Server.ListenAndServeTLS(HTTPSslCert, HTTPSslKey))
74-
} else {
75-
listener, err := net.Listen(g.ServerInit.Network, g.Server.Addr)
76-
if err != nil {
77-
ERROR.Fatalln("Failed to listen:", err)
78-
}
79-
ERROR.Fatalln("Failed to serve:", g.Server.Serve(listener))
80-
}
81-
82-
}
83-
84-
func (g *GOHttpServer) Handle(w http.ResponseWriter, r *http.Request) {
85-
if maxRequestSize := int64(Config.IntDefault("http.maxrequestsize", 0)); maxRequestSize > 0 {
86-
r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize)
87-
}
88-
89-
upgrade := r.Header.Get("Upgrade")
90-
if upgrade == "websocket" || upgrade == "Websocket" {
91-
websocket.Handler(func(ws *websocket.Conn) {
92-
//Override default Read/Write timeout with sane value for a web socket request
93-
if err := ws.SetDeadline(time.Now().Add(time.Hour * 24)); err != nil {
94-
ERROR.Println("SetDeadLine failed:", err)
95-
}
96-
r.Method = "WS"
97-
g.ServerInit.Callback(w, r, ws)
98-
}).ServeHTTP(w, r)
99-
} else {
100-
g.ServerInit.Callback(w, r, nil)
101-
}
102-
}
103-
104-
const GO_NATIVE_SERVER_ENGINE = "go"
105-
106-
func (g *GOHttpServer) Name() string {
107-
return GO_NATIVE_SERVER_ENGINE
108-
}
109-
110-
func (g *GOHttpServer) Engine() interface{} {
111-
return g.Server
112-
}
113-
114-
func (g *GOHttpServer) Event(event string, args interface{}) {
115-
116-
}

server.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,15 @@ var (
2424
serverEngineMap = map[string]ServerEngine{}
2525
CurrentEngine ServerEngine
2626
ServerEngineInit *EngineInit
27+
SE_BEGIN="BEGIN_REQUEST"
28+
SE_END="END_REQUEST"
29+
30+
)
31+
32+
const (
33+
ENGINE_EVENT_PREINIT = iota
34+
ENGINE_EVENT_STARTUP
35+
ENGINE_EVENT_SHUTDOWN
2736
)
2837

2938
func RegisterServerEngine(newEngine ServerEngine) {
@@ -108,9 +117,13 @@ func InitServer() {
108117
// If port is non-zero, use that. Else, read the port from app.conf.
109118
func Run(port int) {
110119

120+
// Create the CurrentEngine instance from the application config
111121
InitServerEngine(port, Config.StringDefault("server.engine",GO_NATIVE_SERVER_ENGINE))
122+
CurrentEngine.Event(ENGINE_EVENT_PREINIT,nil)
112123
InitServer()
124+
CurrentEngine.Event(ENGINE_EVENT_STARTUP,nil)
113125
CurrentEngine.Start()
126+
CurrentEngine.Event(ENGINE_EVENT_SHUTDOWN,nil)
114127
}
115128

116129
func InitServerEngine(port int, serverEngine string) {
@@ -137,6 +150,7 @@ func InitServerEngine(port int, serverEngine string) {
137150
if CurrentEngine,ok = serverEngineMap[serverEngine];!ok {
138151
panic("Server Engine " + serverEngine +" Not found")
139152
} else {
153+
TRACE.Println("Found server engine and invoking",CurrentEngine.Name())
140154
ServerEngineInit = &EngineInit{
141155
Address:localAddress,
142156
Network:network,

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy