-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsserver.go
More file actions
72 lines (62 loc) · 1.62 KB
/
sserver.go
File metadata and controls
72 lines (62 loc) · 1.62 KB
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
package main
import (
"flag"
"fmt"
"github.com/valyala/fasthttp"
"log"
"math/rand"
"os"
"time"
)
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
const (
letterIdxBits = 6 // 6 bits to represent a letter index
letterIdxMask = 1<<letterIdxBits - 1 // All 1-bits, as many as letterIdxBits
letterIdxMax = 63 / letterIdxBits // # of letter indices fitting in 63 bits
)
var (
listen = flag.String("listen", fmt.Sprintf(":%s", os.Getenv("PORT")), "TCP address to listen to")
compress = flag.Bool("compress", false, "Whether to enable transparent response compression")
)
var src = rand.NewSource(time.Now().UnixNano())
var r13k = RandStringBytesMaskImprSrc(13 * 1024)
var r1m = RandStringBytesMaskImprSrc(1024 * 1024)
func main() {
flag.Parse()
h := requestHandler
if *compress {
h = fasthttp.CompressHandler(h)
}
if err := fasthttp.ListenAndServe(*listen, h); err != nil {
log.Fatalf("Error in ListenAndServe: %s", err)
}
}
func RandStringBytesMaskImprSrc(n int) string {
b := make([]byte, n)
for i, cache, remain := n-1, src.Int63(), letterIdxMax; i >= 0; {
if remain == 0 {
cache, remain = src.Int63(), letterIdxMax
}
if idx := int(cache & letterIdxMask); idx < len(letterBytes) {
b[i] = letterBytes[idx]
i--
}
cache >>= letterIdxBits
remain--
}
return string(b)
}
func requestHandler(ctx *fasthttp.RequestCtx) {
switch string(ctx.Path()) {
case "/1m":
fmt.Fprintf(ctx, r1m)
case "/13k":
fmt.Fprintf(ctx, r13k)
case "/1b":
fmt.Fprintf(ctx, "A")
case "/":
fmt.Fprintf(ctx, "A")
default:
ctx.Error("not found", fasthttp.StatusNotFound)
}
}