This repository has been archived by the owner on Aug 31, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
swagger.go
100 lines (86 loc) · 2.39 KB
/
swagger.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
95
96
97
98
99
100
package grpcgw
import (
"encoding/json"
"net/http"
"path/filepath"
"strings"
"sync"
"github.com/golang-tire/pkg/log"
)
type swaggerFile struct {
Swagger string `json:"swagger"`
Info struct {
Title string `json:"title"`
Version string `json:"version"`
} `json:"info"`
Host string `json:"host"`
Schemes []string `json:"schemes"`
Consumes []string `json:"consumes"`
Produces []string `json:"produces"`
Paths map[string]interface{} `json:"paths"`
Definitions map[string]interface{} `json:"definitions"`
}
type swaggerServer struct {
swaggerBaseURL string
}
var (
swaggerLock sync.RWMutex
data = swaggerFile{
Swagger: "2.0",
Info: struct {
Title string `json:"title"`
Version string `json:"version"`
}{Title: "Swagger", Version: "1.0"},
Schemes: []string{"https", "http"},
Consumes: []string{"application/json"},
Produces: []string{"application/json"},
Host: "",
Paths: make(map[string]interface{}),
Definitions: make(map[string]interface{}),
}
)
// RegisterSwagger register each service paths and definitions to show in final swagger file
func RegisterSwagger(paths, definitions map[string]interface{}) {
swaggerLock.Lock()
defer swaggerLock.Unlock()
for k, v := range paths {
data.Paths[k] = v
}
for k, v := range definitions {
data.Definitions[k] = v
}
}
func (sw *swaggerServer) swaggerHandler(w http.ResponseWriter, r *http.Request) {
swaggerLock.Lock()
defer swaggerLock.Unlock()
reqFile := strings.TrimPrefix(r.RequestURI, sw.swaggerBaseURL)
if reqFile == "index.json" {
data.Host = r.Host
w.Header().Add("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(data); err != nil {
log.Error("serve swagger json failed", log.Err(err))
w.WriteHeader(http.StatusInternalServerError)
}
return
}
if reqFile == "" {
reqFile = "index.html"
}
fileData, err := Asset(reqFile)
if err != nil {
log.Error("asset file not found", log.Err(err))
w.WriteHeader(http.StatusNotFound)
return
}
switch strings.ToLower(filepath.Ext(reqFile)) {
case ".json":
w.Header().Add("Content-Type", "application/json")
case ".css":
w.Header().Add("Content-Type", "text/css")
case ".js":
w.Header().Add("Content-Type", "text/javascript")
case ".html":
w.Header().Add("Content-Type", "text/html")
}
_, _ = w.Write(fileData)
}