1
+ <?php
2
+
3
+ namespace PhpPlatform \Tests \RESTFul \ClientSide ;
4
+
5
+ use PhpPlatform \Tests \RESTFul \TestBase ;
6
+ use Guzzle \Http \Client ;
7
+ use PhpPlatform \Mock \Config \MockSettings ;
8
+ use PhpPlatform \RESTFul \Package ;
9
+ use Guzzle \Http \Exception \BadResponseException ;
10
+
11
+ class TestCORS extends TestBase {
12
+
13
+ function testForNoCORSHeadersForSameOrigin (){
14
+ MockSettings::setSettings (Package::Name, 'CORS ' , array (
15
+ "AllowedOrigins " =>array ('http://example.com ' ),
16
+ "AllowedMethods " =>array ('GET ' ),
17
+ "AllowedHeaders " =>array (),
18
+ "AllowCredentials " =>false ,
19
+ "MaxAge " =>1000
20
+ ));
21
+
22
+ $ client = new Client ();
23
+
24
+ // without Origin header in the request
25
+ $ request = $ client ->get (APP_DOMAIN .'/ ' .APP_PATH .'/test/route/simple ' );
26
+ $ response = $ client ->send ($ request );
27
+
28
+ $ this ->assertNull ($ response ->getHeader ('Access-Control-Allow-Origin ' ));
29
+ $ this ->assertNull ($ response ->getHeader ('Access-Control-Allow-Methods ' ));
30
+ $ this ->assertNull ($ response ->getHeader ('Access-Control-Allow-Headers ' ));
31
+ $ this ->assertNull ($ response ->getHeader ('Access-Control-Allow-Credentials ' ));
32
+ $ this ->assertNull ($ response ->getHeader ('Access-Control-Max-Age ' ));
33
+
34
+ // with Origin header in the request
35
+ $ request = $ client ->get (APP_DOMAIN .'/ ' .APP_PATH .'/test/route/simple ' );
36
+ $ request ->setHeader ('Origin ' , APP_DOMAIN );
37
+ $ response = $ client ->send ($ request );
38
+
39
+ $ this ->assertNull ($ response ->getHeader ('Access-Control-Allow-Origin ' ));
40
+ $ this ->assertNull ($ response ->getHeader ('Access-Control-Allow-Methods ' ));
41
+ $ this ->assertNull ($ response ->getHeader ('Access-Control-Allow-Headers ' ));
42
+ $ this ->assertNull ($ response ->getHeader ('Access-Control-Allow-Credentials ' ));
43
+ $ this ->assertNull ($ response ->getHeader ('Access-Control-Max-Age ' ));
44
+ }
45
+
46
+ function testNotAllowedOrigin (){
47
+ MockSettings::setSettings (Package::Name, 'CORS ' , array (
48
+ "AllowedOrigins " =>array ('http://example.com ' ),
49
+ "AllowedMethods " =>array ('GET ' ),
50
+ "AllowedHeaders " =>array (),
51
+ "AllowCredentials " =>false ,
52
+ "MaxAge " =>1000
53
+ ));
54
+
55
+ $ client = new Client ();
56
+ $ request = $ client ->get (APP_DOMAIN .'/ ' .APP_PATH .'/test/route/simple ' );
57
+ $ request ->setHeader ('Origin ' , "http://mydomain.com " );
58
+ try {
59
+ $ response = $ client ->send ($ request );
60
+ }catch (BadResponseException $ e ){
61
+ $ response = $ e ->getResponse ();
62
+ $ this ->clearErrorLog ();
63
+ }
64
+ $ this ->assertEquals (401 , $ response ->getStatusCode ());
65
+ $ this ->assertEquals ("CORS ERROR : http://mydomain.com is not a allowed origin " , $ response ->getReasonPhrase ());
66
+
67
+ $ this ->assertNull ($ response ->getHeader ('Access-Control-Allow-Origin ' ));
68
+ $ this ->assertNull ($ response ->getHeader ('Access-Control-Allow-Methods ' ));
69
+ $ this ->assertNull ($ response ->getHeader ('Access-Control-Allow-Headers ' ));
70
+ $ this ->assertNull ($ response ->getHeader ('Access-Control-Allow-Credentials ' ));
71
+ $ this ->assertNull ($ response ->getHeader ('Access-Control-Max-Age ' ));
72
+ }
73
+
74
+ function testAllowedOrigin (){
75
+ MockSettings::setSettings (Package::Name, 'CORS ' , array (
76
+ "AllowedOrigins " =>array ('http://example.com ' ),
77
+ "AllowedMethods " =>array ('GET ' ),
78
+ "AllowedHeaders " =>array (),
79
+ "AllowCredentials " =>false ,
80
+ "MaxAge " =>1000
81
+ ));
82
+
83
+ $ client = new Client ();
84
+
85
+ // allowed method
86
+ $ request = $ client ->get (APP_DOMAIN .'/ ' .APP_PATH .'/test/route/simple ' );
87
+ $ request ->setHeader ('Origin ' , "http://example.com " );
88
+ $ response = $ client ->send ($ request );
89
+
90
+ $ this ->assertEquals ('http://example.com ' ,$ response ->getHeader ('Access-Control-Allow-Origin ' ));
91
+ $ this ->assertEquals ('GET ' ,$ response ->getHeader ('Access-Control-Allow-Methods ' ));
92
+ $ this ->assertEquals ('' ,$ response ->getHeader ('Access-Control-Allow-Headers ' ));
93
+ $ this ->assertEquals ('false ' ,$ response ->getHeader ('Access-Control-Allow-Credentials ' ));
94
+ $ this ->assertEquals ('1000 ' ,$ response ->getHeader ('Access-Control-Max-Age ' ));
95
+
96
+ // not allowed method
97
+ $ jsonContent = '{"name":"raaghu","children":[{"name":"shri"},{"name":"di"}]} ' ;
98
+ $ request = $ client ->post (APP_DOMAIN .'/ ' .APP_PATH .'/test/http-request/json ' ,array ("Content-Type " =>"application/json " ,"Content-Length " =>strlen ($ jsonContent )),$ jsonContent );
99
+ $ request ->setHeader ('Origin ' , "http://example.com " );
100
+ $ response = $ client ->send ($ request );
101
+
102
+ $ this ->assertEquals ('http://example.com ' ,$ response ->getHeader ('Access-Control-Allow-Origin ' ));
103
+ $ this ->assertEquals ('GET ' ,$ response ->getHeader ('Access-Control-Allow-Methods ' ));
104
+ $ this ->assertEquals ('' ,$ response ->getHeader ('Access-Control-Allow-Headers ' ));
105
+ $ this ->assertEquals ('false ' ,$ response ->getHeader ('Access-Control-Allow-Credentials ' ));
106
+ $ this ->assertEquals ('1000 ' ,$ response ->getHeader ('Access-Control-Max-Age ' ));
107
+
108
+ // for OPTIONS method (preflight request)
109
+ $ request = $ client ->options (APP_DOMAIN .'/ ' .APP_PATH .'/test/http-request/json ' );
110
+ $ request ->setHeader ('Origin ' , "http://example.com " );
111
+ $ request ->setHeader ('Access-Control-Request-Method ' , "POST " );
112
+ $ response = $ client ->send ($ request );
113
+
114
+ $ this ->assertContainsAndClearLog ('[/test/http-request/json] OK : PhpPlatform\Errors\Exceptions\Http\_2XX\OK ' );
115
+
116
+ $ this ->assertEquals ('http://example.com ' ,$ response ->getHeader ('Access-Control-Allow-Origin ' ));
117
+ $ this ->assertEquals ('GET ' ,$ response ->getHeader ('Access-Control-Allow-Methods ' ));
118
+ $ this ->assertEquals ('' ,$ response ->getHeader ('Access-Control-Allow-Headers ' ));
119
+ $ this ->assertEquals ('false ' ,$ response ->getHeader ('Access-Control-Allow-Credentials ' ));
120
+ $ this ->assertEquals ('1000 ' ,$ response ->getHeader ('Access-Control-Max-Age ' ));
121
+
122
+
123
+ // with allowed headers , credentials and differrent max-age
124
+ MockSettings::setSettings (Package::Name, 'CORS ' , array (
125
+ "AllowedOrigins " =>array ('http://example.com ' ),
126
+ "AllowedMethods " =>array ('GET ' ,'POST ' ),
127
+ "AllowedHeaders " =>array ('Content-Type ' ,'Php-Platform-Session-Cookie ' ,'Accept ' ),
128
+ "AllowCredentials " =>'true ' ,
129
+ "MaxAge " =>500
130
+ ));
131
+ $ request = $ client ->post (APP_DOMAIN .'/ ' .APP_PATH .'/test/http-request/json ' ,array ("Content-Type " =>"application/json " ,"Content-Length " =>strlen ($ jsonContent )),$ jsonContent );
132
+ $ request ->setHeader ('Origin ' , "http://example.com " );
133
+ $ response = $ client ->send ($ request );
134
+
135
+ $ this ->assertEquals ('http://example.com ' ,$ response ->getHeader ('Access-Control-Allow-Origin ' ));
136
+ $ this ->assertEquals ('GET, POST ' ,$ response ->getHeader ('Access-Control-Allow-Methods ' ));
137
+ $ this ->assertEquals ('Content-Type, Php-Platform-Session-Cookie, Accept ' ,$ response ->getHeader ('Access-Control-Allow-Headers ' ));
138
+ $ this ->assertEquals ('true ' ,$ response ->getHeader ('Access-Control-Allow-Credentials ' ));
139
+ $ this ->assertEquals ('500 ' ,$ response ->getHeader ('Access-Control-Max-Age ' ));
140
+
141
+
142
+ }
143
+
144
+
145
+ }
0 commit comments