Skip to content

Commit 0a7753b

Browse files
authored
feat: response server version in response header (#61)
1 parent f4b46f7 commit 0a7753b

File tree

4 files changed

+77
-8
lines changed

4 files changed

+77
-8
lines changed

Makefile

+10-5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
SHELL = bash
2+
13
all: help
24

35
##@ General
@@ -24,12 +26,15 @@ fmt: ## Run go fmt against code.
2426
vet: ## Run go vet against code.
2527
go vet ./...
2628

27-
run-server: fmt vet ## Run server.
28-
echo "test" > local_dev.token
29-
go run . serve --db-dsn ./test.sqlite3?_journal_mode=WAL --http-addr 127.0.0.1:8080 --metrics-addr 127.0.0.1:8081 --pprof-addr 127.0.0.1:8082 --log-devel --log-level 12 --auth-token-file local_dev.token
29+
build-server: fmt vet ## Build server.
30+
go build .
31+
32+
run-server: build-server ## Run server.
33+
echo -n "test" > local_dev.token
34+
./sqlite-rest serve --db-dsn ./test.sqlite3?_journal_mode=WAL --http-addr 127.0.0.1:8080 --metrics-addr 127.0.0.1:8081 --pprof-addr 127.0.0.1:8082 --log-devel --log-level 12 --auth-token-file local_dev.token --security-allow-table fruit
3035

31-
run-migrate: fmt vet ## Run migration.
32-
go run . migrate --db-dsn ./test.sqlite3?_journal_mode=WAL --log-devel --log-level 12 ./data
36+
run-migrate: build-server ## Run migration.
37+
./sqlite-rest migrate --db-dsn ./test.sqlite3?_journal_mode=WAL --log-devel --log-level 12 ./data
3338

3439
##@ Build
3540

fs.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ func readFileWithStatCache(file string) func() ([]byte, error) {
99
mu := new(sync.RWMutex)
1010
var (
1111
lastReadContent []byte
12-
lastStat os.FileInfo
12+
lastStat os.FileInfo
1313
)
1414

1515
fast := func() (bool, []byte, error) {

server.go

+9-2
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ func NewServer(opts *ServerOptions) (*dbServer, error) {
8383
logger: opts.Logger.WithName("db-server"),
8484
server: &http.Server{
8585
Addr: opts.Addr,
86+
// TODO: make it configurable
87+
ReadHeaderTimeout: 5 * time.Second,
8688
},
8789
queryer: opts.Queryer,
8890
execer: opts.Execer,
@@ -137,6 +139,11 @@ func (server *dbServer) Start(done <-chan struct{}) {
137139
server.server.Shutdown(shutdownCtx)
138140
}
139141

142+
func (server *dbServer) responseHeader(w http.ResponseWriter, statusCode int) {
143+
w.Header().Set("Server", ServerVersion)
144+
w.WriteHeader(statusCode)
145+
}
146+
140147
func (server *dbServer) responseError(w http.ResponseWriter, err error) {
141148
var serverError *ServerError
142149
switch {
@@ -149,7 +156,7 @@ func (server *dbServer) responseError(w http.ResponseWriter, err error) {
149156
}
150157

151158
func (server *dbServer) responseData(w http.ResponseWriter, data interface{}, statusCode int) {
152-
w.WriteHeader(statusCode)
159+
server.responseHeader(w, statusCode)
153160

154161
enc := json.NewEncoder(w)
155162
if encodeErr := enc.Encode(data); encodeErr != nil {
@@ -160,7 +167,7 @@ func (server *dbServer) responseData(w http.ResponseWriter, data interface{}, st
160167
}
161168

162169
func (server *dbServer) responseEmptyBody(w http.ResponseWriter, statusCode int) {
163-
w.WriteHeader(statusCode)
170+
server.responseHeader(w, statusCode)
164171
}
165172

166173
func (server *dbServer) handleQueryTableOrView(

version.go

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"runtime/debug"
6+
)
7+
8+
// ServerVersion defines the server application version.
9+
// Use -ldflags "-X main.ServerVersion=1.0.0" to override the version.
10+
var ServerVersion string
11+
12+
func loadServerVersionFromBuildInfo() string {
13+
info, ok := debug.ReadBuildInfo()
14+
if !ok {
15+
return ""
16+
}
17+
18+
var (
19+
commit string = "unknown"
20+
dirty bool
21+
)
22+
for _, s := range info.Settings {
23+
switch {
24+
case s.Key == "vcs.revision":
25+
commit = s.Value
26+
if len(s.Value) > 10 {
27+
commit = commit[:10]
28+
}
29+
case s.Key == "vcs.modified":
30+
dirty = s.Value == "true"
31+
}
32+
}
33+
if dirty {
34+
commit += "-dirty"
35+
}
36+
37+
s := fmt.Sprintf("sqlite-rest/%s (%s, commit/%s)", info.Main.Version, info.GoVersion, commit)
38+
39+
return s
40+
}
41+
42+
func setServerVersion() {
43+
if ServerVersion != "" {
44+
return
45+
}
46+
47+
if v := loadServerVersionFromBuildInfo(); v != "" {
48+
ServerVersion = v
49+
return
50+
}
51+
52+
ServerVersion = "(devel)"
53+
}
54+
55+
func init() {
56+
setServerVersion()
57+
}

0 commit comments

Comments
 (0)