1
- const test = require ( 'ava ' ) ;
1
+ const Cabin = require ( 'cabin ' ) ;
2
2
const express = require ( 'express' ) ;
3
3
const fetch = require ( 'fetch-cookie/node-fetch' ) ( require ( 'node-fetch' ) ) ;
4
4
const session = require ( 'express-session' ) ;
5
+ const test = require ( 'ava' ) ;
5
6
6
7
const redirectLoop = require ( '..' ) ;
7
8
9
+ const cabin = new Cabin ( ) ;
10
+
8
11
test . beforeEach ( t => {
9
12
const app = express ( ) ;
10
13
app . use (
@@ -14,6 +17,7 @@ test.beforeEach(t => {
14
17
saveUninitialized : true
15
18
} )
16
19
) ;
20
+ app . use ( cabin . middleware ) ;
17
21
app . use ( redirectLoop ( ) ) ;
18
22
app . get ( '/' , ( req , res ) => res . sendStatus ( 200 ) ) ;
19
23
app . get ( '/bar' , ( req , res ) => res . redirect ( '/foo' ) ) ;
@@ -24,47 +28,97 @@ test.beforeEach(t => {
24
28
app . get ( '/1' , ( req , res ) => res . redirect ( '/2' ) ) ;
25
29
app . get ( '/2' , ( req , res ) => res . redirect ( '/3' ) ) ;
26
30
app . get ( '/3' , ( req , res ) => res . redirect ( '/4' ) ) ;
27
- app . get ( '/4' , ( req , res ) => res . redirect ( '/4' ) ) ;
31
+ app . get ( '/4' , ( req , res ) => res . redirect ( '/4' ) ) ; // <-- should be 5
28
32
app . get ( '/5' , ( req , res ) => res . redirect ( '/6' ) ) ;
29
33
app . get ( '/6' , ( req , res ) => res . redirect ( '/7' ) ) ;
34
+ app . get ( '/form' , ( req , res ) => res . sendStatus ( 200 ) ) ;
35
+ app . post ( '/form' , ( req , res ) => res . redirect ( '/form' ) ) ;
36
+ app . use ( ( err , req , res , next ) => {
37
+ console . log ( 'err' , err ) ;
38
+ next ( err , req , res , next ) ;
39
+ } ) ;
30
40
const server = app . listen ( ) ;
31
41
t . context . url = `http://localhost:${ server . address ( ) . port } /` ;
32
42
} ) ;
33
43
34
44
test ( 'caps at max of 5 redirects' , async t => {
35
- const res = await fetch ( `${ t . context . url } 1` , { credentials : 'include' } ) ;
36
- t . is ( res . url , t . context . url ) ;
45
+ const res = await fetch ( `${ t . context . url } 1` , {
46
+ credentials : 'include'
47
+ } ) ;
48
+ console . log ( 'res' , res , 'res.body' , res . body ) ;
37
49
t . is ( res . status , 200 ) ;
50
+ t . is ( res . url , t . context . url ) ;
38
51
t . pass ( ) ;
39
52
} ) ;
40
53
41
54
test ( '/beep => 200 => /boop => /beep' , async t => {
42
55
let res = await fetch ( `${ t . context . url } beep` , { credentials : 'include' } ) ;
43
- t . is ( res . url , `${ t . context . url } beep` ) ;
44
56
t . is ( res . status , 200 ) ;
45
- res = await fetch ( `${ t . context . url } boop` , { credentials : 'include' } ) ;
46
57
t . is ( res . url , `${ t . context . url } beep` ) ;
58
+ res = await fetch ( `${ t . context . url } boop` , { credentials : 'include' } ) ;
47
59
t . is ( res . status , 200 ) ;
60
+ t . is ( res . url , `${ t . context . url } beep` ) ;
48
61
t . pass ( ) ;
49
62
} ) ;
50
63
51
64
test ( '/bar => /foo => /' , async t => {
52
65
const res = await fetch ( `${ t . context . url } bar` , { credentials : 'include' } ) ;
53
- t . is ( res . url , t . context . url ) ;
54
66
t . is ( res . status , 200 ) ;
67
+ t . is ( res . url , t . context . url ) ;
55
68
t . pass ( ) ;
56
69
} ) ;
57
70
58
71
test ( '/foo => /' , async t => {
59
72
const res = await fetch ( `${ t . context . url } foo` , { credentials : 'include' } ) ;
60
- t . is ( res . url , t . context . url ) ;
61
73
t . is ( res . status , 200 ) ;
74
+ t . is ( res . url , t . context . url ) ;
62
75
t . pass ( ) ;
63
76
} ) ;
64
77
65
78
test ( '/baz => /bar => /foo => /' , async t => {
66
79
const res = await fetch ( `${ t . context . url } baz` , { credentials : 'include' } ) ;
80
+ t . is ( res . status , 200 ) ;
67
81
t . is ( res . url , t . context . url ) ;
82
+ t . pass ( ) ;
83
+ } ) ;
84
+
85
+ test ( 'prevents incorrect redirect to earlier path' , async t => {
86
+ // GET / -> GET /form -> POST /form -> GET /form
87
+ let res = await fetch ( t . context . url , { credentials : 'include' } ) ;
68
88
t . is ( res . status , 200 ) ;
89
+ t . is ( res . url , t . context . url ) ;
90
+ res = await fetch ( `${ t . context . url } form` , { credentials : 'include' } ) ;
91
+ t . is ( res . status , 200 ) ;
92
+ t . is ( res . url , `${ t . context . url } form` ) ;
93
+ res = await fetch ( `${ t . context . url } form` , {
94
+ method : 'POST' ,
95
+ credentials : 'include' ,
96
+ redirect : 'manual'
97
+ } ) ;
98
+ t . is ( res . status , 302 ) ;
99
+ t . is ( res . headers . get ( 'location' ) , `${ t . context . url } form` ) ;
100
+
101
+ // GET /form -> POST /form -> GET /form -> POST /form
102
+ res = await fetch ( `${ t . context . url } form` , { credentials : 'include' } ) ;
103
+ t . is ( res . status , 200 ) ;
104
+ t . is ( res . url , `${ t . context . url } form` ) ;
105
+ res = await fetch ( `${ t . context . url } form` , {
106
+ method : 'POST' ,
107
+ credentials : 'include' ,
108
+ redirect : 'manual'
109
+ } ) ;
110
+ t . is ( res . status , 302 ) ;
111
+ t . is ( res . headers . get ( 'location' ) , `${ t . context . url } form` ) ;
112
+ res = await fetch ( `${ t . context . url } form` , { credentials : 'include' } ) ;
113
+ t . is ( res . status , 200 ) ;
114
+ t . is ( res . url , `${ t . context . url } form` ) ;
115
+ res = await fetch ( `${ t . context . url } form` , {
116
+ method : 'POST' ,
117
+ credentials : 'include' ,
118
+ redirect : 'manual'
119
+ } ) ;
120
+ t . is ( res . status , 302 ) ;
121
+ t . is ( res . headers . get ( 'location' ) , `${ t . context . url } form` ) ;
122
+
69
123
t . pass ( ) ;
70
124
} ) ;
0 commit comments