-
Notifications
You must be signed in to change notification settings - Fork 4
/
http_server.go
94 lines (75 loc) · 2.63 KB
/
http_server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package http
import (
"fmt"
"net"
"net/http"
"github.com/SparrowDb/sparrowdb/db"
"github.com/SparrowDb/sparrowdb/slog"
"github.com/gin-gonic/gin"
)
// HTTPServer holds HTTP server configuration and routes
type HTTPServer struct {
Config *db.SparrowConfig
router *gin.Engine
dbManager *db.DBManager
listener net.Listener
}
// Start starts HTTP server listener
func (httpServer *HTTPServer) Start() {
var err error
httpServer.listener, err = net.Listen("tcp", fmt.Sprintf("%s:%s", httpServer.Config.HTTPHost, httpServer.Config.HTTPPort))
if err != nil {
slog.Fatalf(err.Error())
}
handler := NewServeHandler(httpServer.dbManager)
// register basic middleware, for cors and server name
httpServer.router.Use(BasicMiddleware())
// auth group
authorized := httpServer.router.Group("/")
// Checks if auth is active, if true, register auth middleware
if httpServer.Config.AuthenticationActive {
authorized.Use(AuthMiddleware(func(c *gin.Context) {
c.AbortWithStatus(http.StatusUnauthorized)
}))
}
httpServer.router.POST("/user/login", handler.userLogin)
// register routes based on configuration file permission
if !httpServer.Config.ReadOnly {
// database create/delete
authorized.PUT("/api/:dbname", handler.createDatabase)
authorized.DELETE("/api/:dbname", handler.dropDatabase)
// image insert/delete
authorized.PUT("/api/:dbname/:key", handler.uploadData)
authorized.DELETE("/api/:dbname/:key", handler.deleteData)
// register script route
authorized.POST("/script/:name", saveScript)
authorized.DELETE("/script/:name", deleteScript)
}
// if :dbname is "_all" it will retrieve all databases or dbname
// is a valid database name, it will retrive database information
authorized.GET("/api/:dbname", handler.infoDatabase)
// get image information by database/image_key
authorized.GET("/api/:dbname/:key", handler.getDataInfo)
// if :name is "_all" it will retrieve all scripts
authorized.GET("/script/:name", getScriptList)
// get image by database/image_key
httpServer.router.GET("/g/:dbname/:key", handler.get)
httpServer.router.GET("/g/:dbname/:key/:token", handler.get)
httpServer.router.GET("/ping", handler.ping)
httpServer.router.OPTIONS("/*cors", func(c *gin.Context) {})
http.Serve(httpServer.listener, httpServer.router)
}
// Stop stops HTTP server listener
func (httpServer *HTTPServer) Stop() {
slog.Infof("Stopping HTTP Server")
httpServer.listener.Close()
}
// NewHTTPServer returns new HTTPServer
func NewHTTPServer(config *db.SparrowConfig, dbm *db.DBManager) HTTPServer {
gin.SetMode(gin.ReleaseMode)
return HTTPServer{
Config: config,
dbManager: dbm,
router: gin.New(),
}
}