CorsBuilderTest.php 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. <?php
  2. namespace Cake\Test\TestCase\Http;
  3. use Cake\Http\CorsBuilder;
  4. use Cake\Http\Response;
  5. use Cake\TestSuite\TestCase;
  6. class CorsBuilderTest extends TestCase
  7. {
  8. /**
  9. * test allowOrigin() setting allow-origin
  10. *
  11. * @return void
  12. */
  13. public function testAllowOriginNoOrigin()
  14. {
  15. $response = new Response();
  16. $builder = new CorsBuilder($response, '');
  17. $this->assertSame($builder, $builder->allowOrigin(['*.example.com', '*.foo.com']));
  18. $this->assertNoHeader($builder->build(), 'Access-Control-Origin');
  19. }
  20. /**
  21. * test allowOrigin() setting allow-origin
  22. *
  23. * @return void
  24. */
  25. public function testAllowOrigin()
  26. {
  27. $response = new Response();
  28. $builder = new CorsBuilder($response, 'http://www.example.com');
  29. $this->assertSame($builder, $builder->allowOrigin('*'));
  30. $this->assertHeader('*', $builder->build(), 'Access-Control-Allow-Origin');
  31. $response = new Response();
  32. $builder = new CorsBuilder($response, 'http://www.example.com');
  33. $this->assertSame($builder, $builder->allowOrigin(['*.example.com', '*.foo.com']));
  34. $builder->build();
  35. $this->assertHeader('http://www.example.com', $builder->build(), 'Access-Control-Allow-Origin');
  36. $response = new Response();
  37. $builder = new CorsBuilder($response, 'http://www.example.com');
  38. $this->assertSame($builder, $builder->allowOrigin('*.example.com'));
  39. $this->assertHeader('http://www.example.com', $builder->build(), 'Access-Control-Allow-Origin');
  40. }
  41. /**
  42. * test allowOrigin() with SSL
  43. *
  44. * @return void
  45. */
  46. public function testAllowOriginSsl()
  47. {
  48. $response = new Response();
  49. $builder = new CorsBuilder($response, 'https://www.example.com', true);
  50. $this->assertSame($builder, $builder->allowOrigin('http://example.com'));
  51. $this->assertNoHeader($response, 'Access-Control-Allow-Origin');
  52. $response = new Response();
  53. $builder = new CorsBuilder($response, 'http://www.example.com', true);
  54. $this->assertSame($builder, $builder->allowOrigin('https://example.com'));
  55. $this->assertNoHeader($builder->build(), 'Access-Control-Allow-Origin');
  56. $response = new Response();
  57. $builder = new CorsBuilder($response, 'http://www.example.com');
  58. $this->assertSame($builder, $builder->allowOrigin('https://example.com'));
  59. $this->assertNoHeader($builder->build(), 'Access-Control-Allow-Origin');
  60. }
  61. public function testAllowMethods()
  62. {
  63. $response = new Response();
  64. $builder = new CorsBuilder($response, 'http://example.com');
  65. $builder->allowOrigin('*');
  66. $this->assertSame($builder, $builder->allowMethods(['GET', 'POST']));
  67. $this->assertHeader('GET, POST', $builder->build(), 'Access-Control-Allow-Methods');
  68. }
  69. public function testAllowCredentials()
  70. {
  71. $response = new Response();
  72. $builder = new CorsBuilder($response, 'http://example.com');
  73. $builder->allowOrigin('*');
  74. $this->assertSame($builder, $builder->allowCredentials());
  75. $this->assertHeader('true', $builder->build(), 'Access-Control-Allow-Credentials');
  76. }
  77. public function testAllowHeaders()
  78. {
  79. $response = new Response();
  80. $builder = new CorsBuilder($response, 'http://example.com');
  81. $builder->allowOrigin('*');
  82. $this->assertSame($builder, $builder->allowHeaders(['Content-Type', 'Accept']));
  83. $this->assertHeader('Content-Type, Accept', $builder->build(), 'Access-Control-Allow-Headers');
  84. }
  85. public function testExposeHeaders()
  86. {
  87. $response = new Response();
  88. $builder = new CorsBuilder($response, 'http://example.com');
  89. $builder->allowOrigin('*');
  90. $this->assertSame($builder, $builder->exposeHeaders(['Content-Type', 'Accept']));
  91. $this->assertHeader('Content-Type, Accept', $builder->build(), 'Access-Control-Expose-Headers');
  92. }
  93. public function testMaxAge()
  94. {
  95. $response = new Response();
  96. $builder = new CorsBuilder($response, 'http://example.com');
  97. $builder->allowOrigin('*');
  98. $this->assertSame($builder, $builder->maxAge(300));
  99. $this->assertHeader('300', $builder->build(), 'Access-Control-Max-Age');
  100. }
  101. /**
  102. * When no origin is allowed, none of the other headers should be applied.
  103. *
  104. * @return void
  105. */
  106. public function testNoAllowedOriginNoHeadersSet()
  107. {
  108. $response = new Response();
  109. $builder = new CorsBuilder($response, 'http://example.com');
  110. $response = $builder->allowCredentials()
  111. ->allowMethods(['GET', 'POST'])
  112. ->allowHeaders(['Content-Type'])
  113. ->exposeHeaders(['X-CSRF-Token'])
  114. ->maxAge(300)
  115. ->build();
  116. $this->assertNoHeader($response, 'Access-Control-Allow-Origin');
  117. $this->assertNoHeader($response, 'Access-Control-Allow-Headers');
  118. $this->assertNoHeader($response, 'Access-Control-Expose-Headers');
  119. $this->assertNoHeader($response, 'Access-Control-Allow-Methods');
  120. $this->assertNoHeader($response, 'Access-Control-Allow-Authentication');
  121. $this->assertNoHeader($response, 'Access-Control-Max-Age');
  122. }
  123. /**
  124. * When an invalid origin is used, none of the other headers should be applied.
  125. *
  126. * @return void
  127. */
  128. public function testInvalidAllowedOriginNoHeadersSet()
  129. {
  130. $response = new Response();
  131. $builder = new CorsBuilder($response, 'http://example.com');
  132. $response = $builder->allowOrigin(['http://google.com'])
  133. ->allowCredentials()
  134. ->allowMethods(['GET', 'POST'])
  135. ->allowHeaders(['Content-Type'])
  136. ->exposeHeaders(['X-CSRF-Token'])
  137. ->maxAge(300)
  138. ->build();
  139. $this->assertNoHeader($response, 'Access-Control-Allow-Origin');
  140. $this->assertNoHeader($response, 'Access-Control-Allow-Headers');
  141. $this->assertNoHeader($response, 'Access-Control-Expose-Headers');
  142. $this->assertNoHeader($response, 'Access-Control-Allow-Methods');
  143. $this->assertNoHeader($response, 'Access-Control-Allow-Authentication');
  144. $this->assertNoHeader($response, 'Access-Control-Max-Age');
  145. }
  146. /**
  147. * Helper for checking header values.
  148. *
  149. * @param string $expected The expected value
  150. * @param \Cake\Http\Response $response The Response object.
  151. * @params string $header The header key to check
  152. */
  153. protected function assertHeader($expected, Response $response, $header)
  154. {
  155. $this->assertTrue($response->hasHeader($header), 'Header key not found.');
  156. $this->assertEquals($expected, $response->getHeaderLine($header), 'Header value not found.');
  157. }
  158. /**
  159. * Helper for checking header values.
  160. *
  161. * @param \Cake\Http\Response $response The Response object.
  162. * @params string $header The header key to check
  163. */
  164. protected function assertNoHeader(Response $response, $header)
  165. {
  166. $this->assertFalse($response->hasHeader($header), 'Header key was found.');
  167. }
  168. }