1*a1a3b679SAndreas Boehler<?php 2*a1a3b679SAndreas Boehler 3*a1a3b679SAndreas Boehlernamespace Sabre\HTTP; 4*a1a3b679SAndreas Boehler 5*a1a3b679SAndreas Boehlerclass SapiTest extends \PHPUnit_Framework_TestCase { 6*a1a3b679SAndreas Boehler 7*a1a3b679SAndreas Boehler function testConstructFromServerArray() { 8*a1a3b679SAndreas Boehler 9*a1a3b679SAndreas Boehler $request = Sapi::createFromServerArray([ 10*a1a3b679SAndreas Boehler 'REQUEST_URI' => '/foo', 11*a1a3b679SAndreas Boehler 'REQUEST_METHOD' => 'GET', 12*a1a3b679SAndreas Boehler 'HTTP_USER_AGENT' => 'Evert', 13*a1a3b679SAndreas Boehler 'CONTENT_TYPE' => 'text/xml', 14*a1a3b679SAndreas Boehler 'CONTENT_LENGTH' => '400', 15*a1a3b679SAndreas Boehler 'SERVER_PROTOCOL' => 'HTTP/1.0', 16*a1a3b679SAndreas Boehler ]); 17*a1a3b679SAndreas Boehler 18*a1a3b679SAndreas Boehler $this->assertEquals('GET', $request->getMethod()); 19*a1a3b679SAndreas Boehler $this->assertEquals('/foo', $request->getUrl()); 20*a1a3b679SAndreas Boehler $this->assertEquals([ 21*a1a3b679SAndreas Boehler 'User-Agent' => ['Evert'], 22*a1a3b679SAndreas Boehler 'Content-Type' => ['text/xml'], 23*a1a3b679SAndreas Boehler 'Content-Length' => ['400'], 24*a1a3b679SAndreas Boehler ], $request->getHeaders()); 25*a1a3b679SAndreas Boehler 26*a1a3b679SAndreas Boehler $this->assertEquals('1.0', $request->getHttpVersion()); 27*a1a3b679SAndreas Boehler 28*a1a3b679SAndreas Boehler $this->assertEquals('400', $request->getRawServerValue('CONTENT_LENGTH')); 29*a1a3b679SAndreas Boehler $this->assertNull($request->getRawServerValue('FOO')); 30*a1a3b679SAndreas Boehler 31*a1a3b679SAndreas Boehler } 32*a1a3b679SAndreas Boehler 33*a1a3b679SAndreas Boehler function testConstructPHPAuth() { 34*a1a3b679SAndreas Boehler 35*a1a3b679SAndreas Boehler $request = Sapi::createFromServerArray([ 36*a1a3b679SAndreas Boehler 'REQUEST_URI' => '/foo', 37*a1a3b679SAndreas Boehler 'REQUEST_METHOD' => 'GET', 38*a1a3b679SAndreas Boehler 'PHP_AUTH_USER' => 'user', 39*a1a3b679SAndreas Boehler 'PHP_AUTH_PW' => 'pass', 40*a1a3b679SAndreas Boehler ]); 41*a1a3b679SAndreas Boehler 42*a1a3b679SAndreas Boehler $this->assertEquals('GET', $request->getMethod()); 43*a1a3b679SAndreas Boehler $this->assertEquals('/foo', $request->getUrl()); 44*a1a3b679SAndreas Boehler $this->assertEquals([ 45*a1a3b679SAndreas Boehler 'Authorization' => ['Basic ' . base64_encode('user:pass')], 46*a1a3b679SAndreas Boehler ], $request->getHeaders()); 47*a1a3b679SAndreas Boehler 48*a1a3b679SAndreas Boehler } 49*a1a3b679SAndreas Boehler 50*a1a3b679SAndreas Boehler function testConstructPHPAuthDigest() { 51*a1a3b679SAndreas Boehler 52*a1a3b679SAndreas Boehler $request = Sapi::createFromServerArray([ 53*a1a3b679SAndreas Boehler 'REQUEST_URI' => '/foo', 54*a1a3b679SAndreas Boehler 'REQUEST_METHOD' => 'GET', 55*a1a3b679SAndreas Boehler 'PHP_AUTH_DIGEST' => 'blabla', 56*a1a3b679SAndreas Boehler ]); 57*a1a3b679SAndreas Boehler 58*a1a3b679SAndreas Boehler $this->assertEquals('GET', $request->getMethod()); 59*a1a3b679SAndreas Boehler $this->assertEquals('/foo', $request->getUrl()); 60*a1a3b679SAndreas Boehler $this->assertEquals([ 61*a1a3b679SAndreas Boehler 'Authorization' => ['Digest blabla'], 62*a1a3b679SAndreas Boehler ], $request->getHeaders()); 63*a1a3b679SAndreas Boehler 64*a1a3b679SAndreas Boehler } 65*a1a3b679SAndreas Boehler 66*a1a3b679SAndreas Boehler function testConstructRedirectAuth() { 67*a1a3b679SAndreas Boehler 68*a1a3b679SAndreas Boehler $request = Sapi::createFromServerArray([ 69*a1a3b679SAndreas Boehler 'REQUEST_URI' => '/foo', 70*a1a3b679SAndreas Boehler 'REQUEST_METHOD' => 'GET', 71*a1a3b679SAndreas Boehler 'REDIRECT_HTTP_AUTHORIZATION' => 'Basic bla', 72*a1a3b679SAndreas Boehler ]); 73*a1a3b679SAndreas Boehler 74*a1a3b679SAndreas Boehler $this->assertEquals('GET', $request->getMethod()); 75*a1a3b679SAndreas Boehler $this->assertEquals('/foo', $request->getUrl()); 76*a1a3b679SAndreas Boehler $this->assertEquals([ 77*a1a3b679SAndreas Boehler 'Authorization' => ['Basic bla'], 78*a1a3b679SAndreas Boehler ], $request->getHeaders()); 79*a1a3b679SAndreas Boehler 80*a1a3b679SAndreas Boehler } 81*a1a3b679SAndreas Boehler 82*a1a3b679SAndreas Boehler /** 83*a1a3b679SAndreas Boehler * @runInSeparateProcess 84*a1a3b679SAndreas Boehler * 85*a1a3b679SAndreas Boehler * Unfortunately we have no way of testing if the HTTP response code got 86*a1a3b679SAndreas Boehler * changed. 87*a1a3b679SAndreas Boehler */ 88*a1a3b679SAndreas Boehler function testSend() { 89*a1a3b679SAndreas Boehler 90*a1a3b679SAndreas Boehler if (!function_exists('xdebug_get_headers')) { 91*a1a3b679SAndreas Boehler $this->markTestSkipped('XDebug needs to be installed for this test to run'); 92*a1a3b679SAndreas Boehler } 93*a1a3b679SAndreas Boehler 94*a1a3b679SAndreas Boehler $response = new Response(204, ['Content-Type' => 'text/xml;charset=UTF-8']); 95*a1a3b679SAndreas Boehler 96*a1a3b679SAndreas Boehler // Second Content-Type header. Normally this doesn't make sense. 97*a1a3b679SAndreas Boehler $response->addHeader('Content-Type', 'application/xml'); 98*a1a3b679SAndreas Boehler $response->setBody('foo'); 99*a1a3b679SAndreas Boehler 100*a1a3b679SAndreas Boehler ob_start(); 101*a1a3b679SAndreas Boehler 102*a1a3b679SAndreas Boehler Sapi::sendResponse($response); 103*a1a3b679SAndreas Boehler $headers = xdebug_get_headers(); 104*a1a3b679SAndreas Boehler 105*a1a3b679SAndreas Boehler $result = ob_get_clean(); 106*a1a3b679SAndreas Boehler header_remove(); 107*a1a3b679SAndreas Boehler 108*a1a3b679SAndreas Boehler $this->assertEquals( 109*a1a3b679SAndreas Boehler [ 110*a1a3b679SAndreas Boehler "Content-Type: text/xml;charset=UTF-8", 111*a1a3b679SAndreas Boehler "Content-Type: application/xml", 112*a1a3b679SAndreas Boehler ], 113*a1a3b679SAndreas Boehler $headers 114*a1a3b679SAndreas Boehler ); 115*a1a3b679SAndreas Boehler 116*a1a3b679SAndreas Boehler $this->assertEquals('foo', $result); 117*a1a3b679SAndreas Boehler 118*a1a3b679SAndreas Boehler } 119*a1a3b679SAndreas Boehler 120*a1a3b679SAndreas Boehler /** 121*a1a3b679SAndreas Boehler * @runInSeparateProcess 122*a1a3b679SAndreas Boehler * @depends testSend 123*a1a3b679SAndreas Boehler */ 124*a1a3b679SAndreas Boehler function testSendLimitedByContentLengthString() { 125*a1a3b679SAndreas Boehler 126*a1a3b679SAndreas Boehler $response = new Response(200); 127*a1a3b679SAndreas Boehler 128*a1a3b679SAndreas Boehler $response->addHeader('Content-Length', 19); 129*a1a3b679SAndreas Boehler $response->setBody('Send this sentence. Ignore this one.'); 130*a1a3b679SAndreas Boehler 131*a1a3b679SAndreas Boehler ob_start(); 132*a1a3b679SAndreas Boehler 133*a1a3b679SAndreas Boehler Sapi::sendResponse($response); 134*a1a3b679SAndreas Boehler 135*a1a3b679SAndreas Boehler $result = ob_get_clean(); 136*a1a3b679SAndreas Boehler header_remove(); 137*a1a3b679SAndreas Boehler 138*a1a3b679SAndreas Boehler $this->assertEquals('Send this sentence.', $result); 139*a1a3b679SAndreas Boehler 140*a1a3b679SAndreas Boehler } 141*a1a3b679SAndreas Boehler 142*a1a3b679SAndreas Boehler /** 143*a1a3b679SAndreas Boehler * @runInSeparateProcess 144*a1a3b679SAndreas Boehler * @depends testSend 145*a1a3b679SAndreas Boehler */ 146*a1a3b679SAndreas Boehler function testSendLimitedByContentLengthStream() { 147*a1a3b679SAndreas Boehler 148*a1a3b679SAndreas Boehler $response = new Response(200, ['Content-Length' => 19]); 149*a1a3b679SAndreas Boehler 150*a1a3b679SAndreas Boehler $body = fopen('php://memory', 'w'); 151*a1a3b679SAndreas Boehler fwrite($body, 'Ignore this. Send this sentence. Ignore this too.'); 152*a1a3b679SAndreas Boehler rewind($body); 153*a1a3b679SAndreas Boehler fread($body, 13); 154*a1a3b679SAndreas Boehler $response->setBody($body); 155*a1a3b679SAndreas Boehler 156*a1a3b679SAndreas Boehler ob_start(); 157*a1a3b679SAndreas Boehler 158*a1a3b679SAndreas Boehler Sapi::sendResponse($response); 159*a1a3b679SAndreas Boehler 160*a1a3b679SAndreas Boehler $result = ob_get_clean(); 161*a1a3b679SAndreas Boehler header_remove(); 162*a1a3b679SAndreas Boehler 163*a1a3b679SAndreas Boehler $this->assertEquals('Send this sentence.', $result); 164*a1a3b679SAndreas Boehler 165*a1a3b679SAndreas Boehler } 166*a1a3b679SAndreas Boehler 167*a1a3b679SAndreas Boehler} 168