-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
123 lines (108 loc) · 2.88 KB
/
main.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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package main
import (
"encoding/xml"
"flag"
"fmt"
"io"
"log"
"net/http"
"path/filepath"
"strings"
"github.com/jackwhelpton/fasthttp-routing"
"github.com/jackwhelpton/fasthttp-routing/file"
"github.com/valyala/fasthttp"
"github.com/dags-/orepack/ore"
)
func main() {
port := flag.Int("port", 8095, "server port")
flag.Parse()
router := routing.New()
router.Get("/", file.Content("assets/index.html"))
router.Get("/badge", file.Content("assets/badge.svg"))
router.Get("/index.html", file.Content("assets/index.html"))
router.Get("/script.js", file.Content("assets/script.js"))
router.Get("/style.css", file.Content("assets/style.css"))
router.Get("/favicon.ico", file.Content("assets/favicon.ico"))
router.Get("/com/orepack/<owner>/<project>/<version>/<filename>", repoHandlerWrapper)
server := fasthttp.Server{
Handler: router.HandleRequest,
DisableKeepalive: true,
GetOnly: true,
MaxConnsPerIP: 5,
MaxRequestsPerConn: 5,
}
log.Println("serving on port", *port)
e := server.ListenAndServe(fmt.Sprintf(":%v", *port))
if e != nil {
panic(e)
}
}
func repoHandlerWrapper(ctx *routing.Context) error {
owner := ctx.Param("owner")
project := ctx.Param("project")
version := ctx.Param("version")
filename := ctx.Param("filename")
if strings.HasSuffix(filename, "-sources.jar") {
return http.ErrNotSupported
}
if filename == "maven-metadata.xml" {
return meta(ctx, owner, project, version)
}
switch filepath.Ext(filename) {
case ".pom":
return pom(ctx, owner, project, version)
case ".md5":
return md5(ctx, owner, project, version)
case ".jar":
return jar(ctx, owner, project, version)
case ".sha1":
return nil
default:
return http.ErrNotSupported
}
}
func jar(ctx *routing.Context, owner, project, version string) error {
p, e := ore.GetProject(owner, project)
if e != nil {
return e
}
r, e := ore.GetJar(p.ID, version)
if e != nil {
return e
}
defer r.Close()
_, e = io.Copy(ctx.Response.BodyWriter(), r)
return e
}
func md5(ctx *routing.Context, owner, project, version string) error {
p, e := ore.GetProject(owner, project)
if e != nil {
return e
}
v, e := ore.GetVersion(p.ID, version)
if e != nil {
return e
}
_, e = fmt.Fprintln(ctx.Response.BodyWriter(), v.MD5)
return e
}
func pom(ctx *routing.Context, owner, project, version string) error {
p, e := ore.GetProject(owner, project)
if e != nil {
return e
}
v, e := ore.GetVersion(p.ID, version)
if e != nil {
return e
}
ctx.Response.Header.SetContentType("application/xml")
en := xml.NewEncoder(ctx.Response.BodyWriter())
en.Indent("", " ")
return en.Encode(ore.NewPom(owner, project, v.Name))
}
func meta(ctx *routing.Context, owner, project, version string) error {
ctx.Response.Header.SetContentType("application/xml")
en := xml.NewEncoder(ctx.Response.BodyWriter())
en.Indent("", " ")
return en.Encode(ore.NewMeta(owner, project, version))
}