Skip to content

Commit 1ac20b6

Browse files
committed
added CORS handler
1 parent cc94809 commit 1ac20b6

File tree

3 files changed

+146
-55
lines changed

3 files changed

+146
-55
lines changed

coverage.out

Lines changed: 57 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -92,57 +92,60 @@ github.com/GolangToolKits/grrt/reqRoute.go:273.14,274.41 1 1
9292
github.com/GolangToolKits/grrt/reqRoute.go:274.41,276.4 1 1
9393
github.com/GolangToolKits/grrt/reqRoute.go:278.8,280.3 1 1
9494
github.com/GolangToolKits/grrt/reqRoute.go:284.55,288.2 3 1
95-
github.com/GolangToolKits/grrt/reqRouter.go:31.70,37.15 3 1
96-
github.com/GolangToolKits/grrt/reqRouter.go:45.2,45.33 1 1
97-
github.com/GolangToolKits/grrt/reqRouter.go:37.15,40.22 3 1
98-
github.com/GolangToolKits/grrt/reqRouter.go:40.22,43.4 1 1
99-
github.com/GolangToolKits/grrt/reqRouter.go:45.33,47.3 1 1
100-
github.com/GolangToolKits/grrt/reqRouter.go:47.8,47.42 1 1
101-
github.com/GolangToolKits/grrt/reqRouter.go:47.42,49.3 1 1
102-
github.com/GolangToolKits/grrt/reqRouter.go:49.8,52.3 2 1
103-
github.com/GolangToolKits/grrt/reqRouter.go:56.37,60.2 3 1
104-
github.com/GolangToolKits/grrt/reqRouter.go:63.68,66.16 3 1
105-
github.com/GolangToolKits/grrt/reqRouter.go:80.2,80.11 1 1
106-
github.com/GolangToolKits/grrt/reqRouter.go:66.16,68.3 1 1
107-
github.com/GolangToolKits/grrt/reqRouter.go:68.8,70.28 2 1
108-
github.com/GolangToolKits/grrt/reqRouter.go:76.3,76.12 1 1
109-
github.com/GolangToolKits/grrt/reqRouter.go:70.28,71.55 1 1
110-
github.com/GolangToolKits/grrt/reqRouter.go:71.55,74.5 2 1
111-
github.com/GolangToolKits/grrt/reqRouter.go:76.12,78.4 1 1
112-
github.com/GolangToolKits/grrt/reqRouter.go:84.94,87.16 3 1
113-
github.com/GolangToolKits/grrt/reqRouter.go:101.2,101.11 1 1
114-
github.com/GolangToolKits/grrt/reqRouter.go:87.16,89.3 1 1
115-
github.com/GolangToolKits/grrt/reqRouter.go:89.8,91.28 2 1
116-
github.com/GolangToolKits/grrt/reqRouter.go:97.3,97.12 1 1
117-
github.com/GolangToolKits/grrt/reqRouter.go:91.28,92.55 1 1
118-
github.com/GolangToolKits/grrt/reqRouter.go:92.55,95.5 2 1
119-
github.com/GolangToolKits/grrt/reqRouter.go:97.12,99.4 1 1
120-
github.com/GolangToolKits/grrt/reqRouter.go:105.48,108.16 3 1
121-
github.com/GolangToolKits/grrt/reqRouter.go:111.2,111.11 1 1
122-
github.com/GolangToolKits/grrt/reqRouter.go:108.16,110.3 1 1
123-
github.com/GolangToolKits/grrt/reqRouter.go:115.33,117.2 1 1
124-
github.com/GolangToolKits/grrt/reqRouter.go:120.56,121.28 1 1
125-
github.com/GolangToolKits/grrt/reqRouter.go:121.28,123.20 2 1
126-
github.com/GolangToolKits/grrt/reqRouter.go:126.3,126.55 1 1
127-
github.com/GolangToolKits/grrt/reqRouter.go:123.20,124.12 1 1
128-
github.com/GolangToolKits/grrt/reqRouter.go:131.53,133.2 1 1
129-
github.com/GolangToolKits/grrt/reqRouter.go:136.53,137.28 1 1
130-
github.com/GolangToolKits/grrt/reqRouter.go:137.28,139.20 2 1
131-
github.com/GolangToolKits/grrt/reqRouter.go:142.3,142.55 1 1
132-
github.com/GolangToolKits/grrt/reqRouter.go:139.20,140.12 1 1
133-
github.com/GolangToolKits/grrt/reqRouter.go:146.48,150.2 3 1
134-
github.com/GolangToolKits/grrt/reqRouter.go:152.69,160.23 8 1
135-
github.com/GolangToolKits/grrt/reqRouter.go:181.2,181.19 1 1
136-
github.com/GolangToolKits/grrt/reqRouter.go:160.23,161.13 1 1
137-
github.com/GolangToolKits/grrt/reqRouter.go:166.3,168.17 3 1
138-
github.com/GolangToolKits/grrt/reqRouter.go:161.13,162.12 1 1
139-
github.com/GolangToolKits/grrt/reqRouter.go:163.9,163.19 1 1
140-
github.com/GolangToolKits/grrt/reqRouter.go:163.19,164.9 1 1
141-
github.com/GolangToolKits/grrt/reqRouter.go:168.17,169.28 1 1
142-
github.com/GolangToolKits/grrt/reqRouter.go:169.28,170.38 1 1
143-
github.com/GolangToolKits/grrt/reqRouter.go:170.38,174.11 4 1
144-
github.com/GolangToolKits/grrt/reqRouter.go:177.9,179.4 1 1
145-
github.com/GolangToolKits/grrt/reqRouter.go:184.95,186.36 2 1
146-
github.com/GolangToolKits/grrt/reqRouter.go:191.2,192.27 2 1
147-
github.com/GolangToolKits/grrt/reqRouter.go:186.36,187.32 1 1
148-
github.com/GolangToolKits/grrt/reqRouter.go:187.32,189.4 1 1
95+
github.com/GolangToolKits/grrt/reqRouter.go:34.70,38.53 1 1
96+
github.com/GolangToolKits/grrt/reqRouter.go:42.2,44.15 3 1
97+
github.com/GolangToolKits/grrt/reqRouter.go:52.2,52.33 1 1
98+
github.com/GolangToolKits/grrt/reqRouter.go:38.53,40.3 1 1
99+
github.com/GolangToolKits/grrt/reqRouter.go:44.15,47.22 3 1
100+
github.com/GolangToolKits/grrt/reqRouter.go:47.22,50.4 1 1
101+
github.com/GolangToolKits/grrt/reqRouter.go:52.33,54.3 1 1
102+
github.com/GolangToolKits/grrt/reqRouter.go:54.8,54.42 1 1
103+
github.com/GolangToolKits/grrt/reqRouter.go:54.42,56.3 1 1
104+
github.com/GolangToolKits/grrt/reqRouter.go:56.8,59.3 2 1
105+
github.com/GolangToolKits/grrt/reqRouter.go:63.37,67.2 3 1
106+
github.com/GolangToolKits/grrt/reqRouter.go:70.68,73.16 3 1
107+
github.com/GolangToolKits/grrt/reqRouter.go:87.2,87.11 1 1
108+
github.com/GolangToolKits/grrt/reqRouter.go:73.16,75.3 1 1
109+
github.com/GolangToolKits/grrt/reqRouter.go:75.8,77.28 2 1
110+
github.com/GolangToolKits/grrt/reqRouter.go:83.3,83.12 1 1
111+
github.com/GolangToolKits/grrt/reqRouter.go:77.28,78.55 1 1
112+
github.com/GolangToolKits/grrt/reqRouter.go:78.55,81.5 2 1
113+
github.com/GolangToolKits/grrt/reqRouter.go:83.12,85.4 1 1
114+
github.com/GolangToolKits/grrt/reqRouter.go:91.94,94.16 3 1
115+
github.com/GolangToolKits/grrt/reqRouter.go:108.2,108.11 1 1
116+
github.com/GolangToolKits/grrt/reqRouter.go:94.16,96.3 1 1
117+
github.com/GolangToolKits/grrt/reqRouter.go:96.8,98.28 2 1
118+
github.com/GolangToolKits/grrt/reqRouter.go:104.3,104.12 1 1
119+
github.com/GolangToolKits/grrt/reqRouter.go:98.28,99.55 1 1
120+
github.com/GolangToolKits/grrt/reqRouter.go:99.55,102.5 2 1
121+
github.com/GolangToolKits/grrt/reqRouter.go:104.12,106.4 1 1
122+
github.com/GolangToolKits/grrt/reqRouter.go:112.48,115.16 3 1
123+
github.com/GolangToolKits/grrt/reqRouter.go:118.2,118.11 1 1
124+
github.com/GolangToolKits/grrt/reqRouter.go:115.16,117.3 1 1
125+
github.com/GolangToolKits/grrt/reqRouter.go:122.33,124.2 1 1
126+
github.com/GolangToolKits/grrt/reqRouter.go:127.56,128.28 1 1
127+
github.com/GolangToolKits/grrt/reqRouter.go:128.28,130.20 2 1
128+
github.com/GolangToolKits/grrt/reqRouter.go:133.3,133.55 1 1
129+
github.com/GolangToolKits/grrt/reqRouter.go:130.20,131.12 1 1
130+
github.com/GolangToolKits/grrt/reqRouter.go:138.53,140.2 1 1
131+
github.com/GolangToolKits/grrt/reqRouter.go:143.53,144.28 1 1
132+
github.com/GolangToolKits/grrt/reqRouter.go:144.28,146.20 2 1
133+
github.com/GolangToolKits/grrt/reqRouter.go:149.3,149.55 1 1
134+
github.com/GolangToolKits/grrt/reqRouter.go:146.20,147.12 1 1
135+
github.com/GolangToolKits/grrt/reqRouter.go:153.54,158.2 4 1
136+
github.com/GolangToolKits/grrt/reqRouter.go:160.48,164.2 3 1
137+
github.com/GolangToolKits/grrt/reqRouter.go:166.69,174.23 8 1
138+
github.com/GolangToolKits/grrt/reqRouter.go:195.2,195.19 1 1
139+
github.com/GolangToolKits/grrt/reqRouter.go:174.23,175.13 1 1
140+
github.com/GolangToolKits/grrt/reqRouter.go:180.3,182.17 3 1
141+
github.com/GolangToolKits/grrt/reqRouter.go:175.13,176.12 1 1
142+
github.com/GolangToolKits/grrt/reqRouter.go:177.9,177.19 1 1
143+
github.com/GolangToolKits/grrt/reqRouter.go:177.19,178.9 1 1
144+
github.com/GolangToolKits/grrt/reqRouter.go:182.17,183.28 1 1
145+
github.com/GolangToolKits/grrt/reqRouter.go:183.28,184.38 1 1
146+
github.com/GolangToolKits/grrt/reqRouter.go:184.38,188.11 4 1
147+
github.com/GolangToolKits/grrt/reqRouter.go:191.9,193.4 1 1
148+
github.com/GolangToolKits/grrt/reqRouter.go:198.95,200.36 2 1
149+
github.com/GolangToolKits/grrt/reqRouter.go:205.2,206.27 2 1
150+
github.com/GolangToolKits/grrt/reqRouter.go:200.36,201.32 1 1
151+
github.com/GolangToolKits/grrt/reqRouter.go:201.32,203.4 1 1

reqRouter.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ import (
1414
type contextKey int
1515

1616
const (
17-
varsKey contextKey = iota
17+
varsKey contextKey = iota
18+
corsAllowOriginHeader string = "Access-Control-Allow-Origin"
19+
corsAllowHeadersHeader string = "Access-Control-Allow-Headers"
20+
corsAllowMethodsHeader string = "Access-Control-Allow-Methods"
1821
)
1922

2023
// ReqRouter RequestRouter
@@ -32,6 +35,10 @@ func (t ReqRouter) ServeHTTP(w http.ResponseWriter, r *http.Request) {
3235
// When there is a match, the route variables can be retrieved calling
3336
// mux.Vars(request).
3437

38+
if t.corsEnabled && r.Method == http.MethodOptions {
39+
t.handleCors(w)
40+
}
41+
3542
path := r.URL.Path
3643
var rt = t.findPrefix(path)
3744
if rt == nil {
@@ -143,6 +150,13 @@ func (t ReqRouter) AllowedMethods(methods []string) {
143150
}
144151
}
145152

153+
func (t ReqRouter) handleCors(w http.ResponseWriter) {
154+
w.Header().Set(corsAllowOriginHeader, strings.Join(t.allowedOrigins, ","))
155+
w.Header().Set(corsAllowHeadersHeader, strings.Join(t.allowedHeaders, ","))
156+
w.Header().Set(corsAllowMethodsHeader, strings.Join(t.allowedMethods, ","))
157+
w.WriteHeader(http.StatusOK)
158+
}
159+
146160
func (t ReqRouter) findPrefix(px string) Route {
147161
var rtn Route
148162
rtn = t.prefixRoutes[px]

reqRouter_test.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,13 +242,15 @@ func TestReqRouter_ServeHTTP(t *testing.T) {
242242
tw4 := httptest.NewRecorder()
243243
tw5 := httptest.NewRecorder()
244244
tw6 := httptest.NewRecorder()
245+
tw7 := httptest.NewRecorder()
245246

246247
tr, _ := http.NewRequest("POST", "/test/test1", nil)
247248
tr22, _ := http.NewRequest("GET", "/test/test1/p1/p2", nil)
248249
tr2, _ := http.NewRequest("POST", "/test/te", nil)
249250
tr3, _ := http.NewRequest("PUT", "/test/test1", nil)
250251
tr4, _ := http.NewRequest("POST", "/test/test1/param1/param2", nil)
251252
tr6, _ := http.NewRequest("POST", "/testPrefix/", nil)
253+
tr7, _ := http.NewRequest("OPTIONS", "/testPrefix/", nil)
252254
// var prt []Route
253255
// prt = append(prt, &rt)
254256
// rts[rt.path] = &prt
@@ -327,12 +329,21 @@ func TestReqRouter_ServeHTTP(t *testing.T) {
327329
r: tr6,
328330
},
329331
},
332+
{
333+
name: "cors test",
334+
args: args{
335+
w: tw7,
336+
r: tr7,
337+
},
338+
339+
},
330340
}
331341
for _, tt := range tests {
332342
t.Run(tt.name, func(t *testing.T) {
333343
tr := ReqRouter{
334344
namedRoutes: tt.fields.namedRoutes,
335345
prefixRoutes: tt.fields.prefixRoutes,
346+
corsEnabled: true,
336347
}
337348
tr.ServeHTTP(tt.args.w, tt.args.r)
338349
if tt.name == "test 1" && tw.Code != http.StatusOK {
@@ -353,6 +364,9 @@ func TestReqRouter_ServeHTTP(t *testing.T) {
353364
if tt.name == "test 6 prefix" && tw6.Code != http.StatusOK {
354365
t.Fail()
355366
}
367+
if tt.name == "cors test" && tw7.Code != http.StatusOK {
368+
t.Fail()
369+
}
356370
})
357371
}
358372
}
@@ -905,3 +919,63 @@ func TestReqRouter_AllowedMethods(t *testing.T) {
905919
})
906920
}
907921
}
922+
923+
func TestReqRouter_handleCors(t *testing.T) {
924+
tw := httptest.NewRecorder()
925+
type fields struct {
926+
namedRoutes map[string]*[]Route
927+
prefixRoutes map[string]Route
928+
corsEnabled bool
929+
allowedHeaders []string
930+
allowedOrigins []string
931+
allowedMethods []string
932+
}
933+
type args struct {
934+
w http.ResponseWriter
935+
}
936+
tests := []struct {
937+
name string
938+
fields fields
939+
args args
940+
}{
941+
// TODO: Add test cases.
942+
{
943+
name: "test 1",
944+
fields: fields{
945+
allowedHeaders: []string{"Content-Type"},
946+
allowedOrigins: []string{"test"},
947+
allowedMethods: []string{"POST", "GET"},
948+
},
949+
args: args{
950+
w: tw,
951+
},
952+
},
953+
}
954+
for _, tt := range tests {
955+
t.Run(tt.name, func(t *testing.T) {
956+
tr := ReqRouter{
957+
namedRoutes: tt.fields.namedRoutes,
958+
prefixRoutes: tt.fields.prefixRoutes,
959+
corsEnabled: tt.fields.corsEnabled,
960+
allowedHeaders: tt.fields.allowedHeaders,
961+
allowedOrigins: tt.fields.allowedOrigins,
962+
allowedMethods: tt.fields.allowedMethods,
963+
}
964+
965+
tr.handleCors(tt.args.w)
966+
fmt.Println("headers: ", tw.Header().Get("Access-Control-Allow-Headers"))
967+
if tw.Result().StatusCode != http.StatusOK{
968+
t.Fail()
969+
}
970+
if tw.Header().Get("Access-Control-Allow-Headers") != "Content-Type"{
971+
t.Fail()
972+
}
973+
if tw.Header().Get("Access-Control-Allow-Origin") != "test"{
974+
t.Fail()
975+
}
976+
if tw.Header().Get("Access-Control-Allow-Methods") != "POST,GET"{
977+
t.Fail()
978+
}
979+
})
980+
}
981+
}

0 commit comments

Comments
 (0)