@@ -4,58 +4,85 @@ import (
44 "fmt"
55 "log"
66 "math/rand"
7+ "net/http"
78 "os"
89 "time"
910)
1011
11- var r * rand.Rand
12+ var (
13+ random * rand.Rand
14+ defaultDuration time.Duration = time .Second * 2
15+ )
1216
1317func init () {
18+ random = rand .New (rand .NewSource (time .Now ().Unix ()))
1419
15- r = rand .New (rand .NewSource (time .Now ().Unix ()))
20+ if val , ok := os .LookupEnv ("sleep_duration" ); ok && len (val ) > 0 {
21+ var err error
22+ defaultDuration , err = time .ParseDuration (val )
23+ if err != nil {
24+ log .Fatalf ("Error parsing sleep_duration environment variable: %v" , err )
25+ }
26+ }
1627}
1728
1829// Handle a serverless request
1930// 1. When no headers are given, sleep for the environment variable: sleep_duration.
2031// 2. When an X-Sleep header is given, sleep for that amount of time.
2132// 3. When the X-Min-Sleep and X-Max-Sleep headers are given, sleep for a random amount
2233// of time between those two figures
23- func Handle (req []byte ) string {
24-
25- if v := os .Getenv ("Http_Path" ); v == "/_/ready" {
26- return "ok"
27- }
28-
29- if minV , ok := os .LookupEnv ("Http_X_Min_Sleep" ); ok && len (minV ) > 0 {
30- if maxV , ok := os .LookupEnv ("Http_X_Max_Sleep" ); ok && len (maxV ) > 0 {
31- minSleep , _ := time .ParseDuration (minV )
32- maxSleep , _ := time .ParseDuration (maxV )
34+ func Handle (w http.ResponseWriter , r * http.Request ) {
35+ if minV := r .Header .Get ("X-Min-Sleep" ); len (minV ) > 0 {
36+ if maxV := r .Header .Get ("X-Max-Sleep" ); len (maxV ) > 0 {
37+ minSleep , err := time .ParseDuration (minV )
38+ if err != nil {
39+ log .Printf ("Error parsing X-Min-Sleep header: %v" , err )
40+ w .WriteHeader (http .StatusBadRequest )
41+ fmt .Fprintf (w , "Error parsing X-Min-Sleep header: %v" , err )
42+ return
43+ }
44+ maxSleep , err := time .ParseDuration (maxV )
45+ if err != nil {
46+ log .Printf ("Error parsing X-Max-Sleep header: %v" , err )
47+ w .WriteHeader (http .StatusBadRequest )
48+ fmt .Fprintf (w , "Error parsing X-Max-Sleep header: %v" , err )
49+ return
50+ }
3351
3452 minMs := minSleep .Milliseconds ()
3553 maxMs := maxSleep .Milliseconds ()
3654
37- randMs := r .Int63n (maxMs - minMs ) + minMs
55+ randMs := random .Int63n (maxMs - minMs ) + minMs
3856
3957 sleepDuration , _ := time .ParseDuration (fmt .Sprintf ("%dms" , randMs ))
4058
4159 log .Printf ("Start sleep for: %fs\n " , sleepDuration .Seconds ())
4260 time .Sleep (sleepDuration )
4361 log .Printf ("Sleep done for: %fs\n " , sleepDuration .Seconds ())
44- return fmt .Sprintf ("Slept for: %fs" , sleepDuration .Seconds ())
62+
63+ w .WriteHeader (http .StatusOK )
64+ fmt .Fprintf (w , "Slept for: %fs" , sleepDuration .Seconds ())
65+ return
4566 }
4667 }
4768
48- sleepDuration := time . Second * 2
69+ sleepDuration := defaultDuration
4970
50- if val , ok := os .LookupEnv ("Http_X_Sleep" ); ok && len (val ) > 0 {
51- sleepDuration , _ = time .ParseDuration (val )
52- } else if val , ok := os .LookupEnv ("sleep_duration" ); ok && len (val ) > 0 {
53- sleepDuration , _ = time .ParseDuration (val )
71+ var err error
72+ if val := r .Header .Get ("X-Sleep" ); len (val ) > 0 {
73+ sleepDuration , err = time .ParseDuration (val )
74+ if err != nil {
75+ log .Printf ("Error parsing X-Sleep header: %v" , err )
76+ w .WriteHeader (http .StatusBadRequest )
77+ fmt .Fprintf (w , "Error parsing X-Sleep header: %v" , err )
78+ return
79+ }
5480 }
5581
5682 log .Printf ("Start sleep for: %fs\n " , sleepDuration .Seconds ())
5783 time .Sleep (sleepDuration )
5884 log .Printf ("Sleep done for: %fs\n " , sleepDuration .Seconds ())
5985
60- return fmt .Sprintf ("Slept for: %fs" , sleepDuration .Seconds ())
86+ w .WriteHeader (http .StatusOK )
87+ fmt .Fprintf (w , "Slept for: %fs" , sleepDuration .Seconds ())
6188}
0 commit comments