Skip to content

Commit fc5eac7

Browse files
authored
Feature/download router (#15)
* Add Download file helper in response and a express.Router instance based app.use() * update readme
1 parent 85afadf commit fc5eac7

File tree

4 files changed

+84
-10
lines changed

4 files changed

+84
-10
lines changed

README.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,29 @@ func main (){
3131
app.Start("8080")
3232
}
3333
```
34+
35+
__Note__: You can also adhoc an ```express.Router()``` instance too much like it is done in expressjs
36+
```go
37+
package main
38+
import (
39+
express "github.com/DronRathore/goexpress"
40+
request "github.com/DronRathore/goexpress/request"
41+
response "github.com/DronRathore/goexpress/response"
42+
)
43+
var LibRoutes = func (){
44+
// create a new Router instance which works in similar way as app.Get/Post etc
45+
var LibRouter = express.Router()
46+
LibRouter.Get("/lib/:api_version", func(req *request.Request, res *response.Response, next func()){
47+
res.Json(req.Params["api_version"])
48+
})
49+
return *LibRoutes
50+
}() // immediate invocation
51+
func main(){
52+
var app = express.Express()
53+
app.Use(LibRoutes) // attaches the Library Routes
54+
app.Start("8080")
55+
}
56+
```
3457
## Middleware
3558
You can write custom middlewares, wrappers in the similar fashion. Middlewares can be used to add websocket upgradation lib, session handling lib, static assets server handler
3659
```go
@@ -86,6 +109,15 @@ func main (){
86109
app.Start("8080")
87110
}
88111
```
112+
__Note__: You can now also send an auto downloadable file too using ```res.Download``` api
113+
```go
114+
/*
115+
@params:
116+
path: Full path to the file in local machine
117+
filename: The name to be sent to the client
118+
*/
119+
res.Download(path string, filename string)
120+
```
89121

90122
## Post Body
91123
```go

express.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,18 @@ func (e *express) Delete(url string, middleware router.Middleware) *express{
121121
}
122122

123123
// Extension to provide Router.Use functionality
124-
func (e *express) Use(middleware router.Middleware) *express{
124+
func (e *express) Use(middleware interface{}) *express{
125125
e.router.Use(middleware)
126126
return e
127127
}
128128

129+
// Returns a new instance of express Router
130+
func Router() *router.Router {
131+
var route *router.Router = &router.Router{}
132+
route.Init()
133+
return route;
134+
}
135+
129136
// Sets global app properties that can be accessed under express struct
130137
func (e *express) SetProp(key string, value interface{}) *express{
131138
e.properties[key] = value

response/response.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,17 @@ func (res *Response) SendFile(url string, noCache bool) bool {
222222
<-channel
223223
return true
224224
}
225+
// Send a download file to the client
226+
func (res *Response) Download(path string, file_name string) bool {
227+
if res.Header.CanSendHeader() == true {
228+
res.Header.Set("Content-Disposition", "attachment; filename=\"" + file_name+ "\"")
229+
return res.SendFile(path, false)
230+
} else {
231+
log.Print("Cannot Send header after being flushed")
232+
res.End()
233+
return false
234+
}
235+
}
225236

226237
// Ends a response and drops the connection with client
227238
func (res *Response) End(){

router/router.go

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -71,18 +71,42 @@ func (r* Router) Delete(url string, middleware Middleware) *Router{
7171
r.addHandler("delete", false, compileRegex(url), middleware)
7272
return r
7373
}
74-
75-
func (r* Router) Use(middleware Middleware) *Router{
76-
var regex = compileRegex("(.*)")
77-
// A middleware is for all type of routes
78-
r.addHandler("get", true, regex, middleware)
79-
r.addHandler("post", true, regex, middleware)
80-
r.addHandler("put", true, regex, middleware)
81-
r.addHandler("patch", true, regex, middleware)
82-
r.addHandler("delete", true, regex, middleware)
74+
// Router.Use can take a function or a new express.Router() instance as argument
75+
func (r* Router) Use(middleware interface{}) *Router{
76+
router, ok := middleware.(Router)
77+
if ok {
78+
r.useRouter(router)
79+
} else {
80+
mware, ok := middleware.(func(request *request.Request, response *response.Response, next func()))
81+
if ok {
82+
var regex = compileRegex("(.*)")
83+
// A middleware is for all type of routes
84+
r.addHandler("get", true, regex, mware)
85+
r.addHandler("post", true, regex, mware)
86+
r.addHandler("put", true, regex, mware)
87+
r.addHandler("patch", true, regex, mware)
88+
r.addHandler("delete", true, regex, mware)
89+
} else {
90+
panic("express.Router.Use can only take a function or a Router instance")
91+
}
92+
}
8393
return r
8494
}
8595

96+
func (r* Router) useRouter(router Router) *Router {
97+
routes := router.getRoutes()
98+
for route_type, list := range routes {
99+
if r.routes[route_type] == nil {
100+
r.routes[route_type] = []*Route{}
101+
}
102+
r.routes[route_type] = append(r.routes[route_type], list...)
103+
}
104+
return r;
105+
}
106+
107+
func (r* Router) getRoutes() map[string][]*Route {
108+
return r.routes
109+
}
86110
// Finds the suitable router for given url and method
87111
// It returns the middleware if found and a cursor index of array
88112
func (r* Router) FindNext(index int, method string, url string, request *request.Request) (Middleware, int, bool){

0 commit comments

Comments
 (0)