| 
<?php/**
 * Test for example4.php
 * @author Rubens Takiguti Ribeiro <[email protected]>
 */
 
 // Configure this variable with base url for example4.php
 $url = 'http://localhost/expires/';
 
 do_test($url);
 
 
 /**
 * Execute test
 * @return void
 */
 function do_test($url) {
 // Request #1
 fwrite(STDOUT, "Request #1 with value 'a'\n");
 $context = stream_context_create(
 array(
 'http' => array(
 'method' => 'GET',
 'header' => ''
 )
 )
 );
 $http_response_content = file_get_contents($url . 'example4.php?value=a', null, $context);
 if (!$http_response_content) {
 fwrite(STDERR, "Error on response #1: unknown error\n");
 exit(1);
 }
 
 // Check header
 list($response_code, $header) = parse_header($http_response_header);
 fwrite(STDOUT, "Response code: {$response_code} / Expected: 200\n");
 if ($response_code !== 200) {
 fwrite(STDERR, "Error on response #1: invalid response code ({$response_code})\n");
 exit(1);
 }
 
 // Get cookie, date, cache-control, expires, last-modified
 $cookies = array();
 if (isset($header['set-cookie'])) {
 $cookies = parse_cookies($header['set-cookie']);
 }
 if (!isset($header['date'])) {
 fwrite(STDERR, "Error on response #1: date not received\n");
 exit(1);
 }
 if (!isset($header['cache-control'])) {
 fwrite(STDERR, "Error on response #1: cache-control not received\n");
 exit(1);
 }
 if (!isset($header['expires'])) {
 fwrite(STDERR, "Error on response #1: expires not received\n");
 exit(1);
 }
 if (!isset($header['last-modified'])) {
 fwrite(STDERR, "Error on response #1: last-modified not received\n");
 exit(1);
 }
 
 $if_modified_since = current($header['last-modified']);
 
 $cookie_str = '';
 $separator = '';
 foreach ($cookies as $cookie => $value) {
 $cookie_str .= sprintf('%s%s=%s', $separator, $cookie, urlencode($value));
 $separator = '; ';
 }
 
 $header_str = '';
 $header_str .= "If-Modified-Since: {$if_modified_since}\r\n";
 $header_str .= "Cookie: {$cookie_str}\r\n";
 
 // Request #2
 fwrite(STDOUT, "Request #2 with value 'b'\n");
 $context = stream_context_create(
 array(
 'http' => array(
 'method' => 'GET',
 'header' => $header_str
 )
 )
 );
 $http_response_content = file_get_contents($url . 'example4.php?value=b', null, $context);
 
 // Check header
 list($response_code, $header) = parse_header($http_response_header);
 fwrite(STDOUT, "Response code: {$response_code} / Expected: 304\n");
 if ($response_code !== 304) {
 fwrite(STDERR, "Error on response #2: invalid response code ({$response_code})\n");
 exit(1);
 }
 
 fwrite(STDOUT, "Sleep for 11 seconds to test\n");
 sleep(11);
 
 // Request #3
 fwrite(STDOUT, "Request #3 with value 'c'\n");
 $context = stream_context_create(
 array(
 'http' => array(
 'method' => 'GET',
 'header' => $header_str
 )
 )
 );
 $http_response_content = file_get_contents($url . 'example4.php?value=c', null, $context);
 
 // Check header
 list($response_code, $header) = parse_header($http_response_header);
 fwrite(STDOUT, "Response code: {$response_code} / Expected: 304\n");
 if ($response_code !== 304) {
 fwrite(STDERR, "Error on response #3: invalid response code ({$response_code})\n");
 exit(1);
 }
 
 fwrite(STDOUT, "Test passed\n");
 exit(0);
 }
 
 /**
 * Parse header
 * @return array[int, array[string => string]]
 */
 function parse_header($header) {
 $response_code = null;
 $parsed_header = array();
 foreach ($header as $line) {
 if (preg_match('/^HTTP\/\d+\.\d+\s([1-5]\d\d)\s/i', $line, $matches)) {
 $response_code = (int)$matches[1];
 } elseif (preg_match('/^\s*([^:]+)\s*:\s*(.*?)\s*$/', $line, $matches)) {
 $key = strtolower($matches[1]);
 if (!isset($parsed_header[$key])) {
 $parsed_header[$key] = array();
 }
 $parsed_header[$key][] = $matches[2];
 }
 }
 return array($response_code, $parsed_header);
 }
 
 /**
 * Parse cookies
 * @param array[string] $cookies
 * @return array[string => string]
 */
 function parse_cookies($cookies) {
 $parsed_cookies = array();
 foreach ($cookies as $value) {
 if (preg_match('/^([^=]+)=([^;]+)(;.*)?/', $value, $matches)) {
 $parsed_cookies[$matches[1]] = urldecode($matches[2]);
 }
 }
 return $parsed_cookies;
 }
 |