note 73581 added to function.fsockopen

From: Date: Fri, 02 Mar 2007 04:17:48 +0000
Subject: note 73581 added to function.fsockopen
Groups: php.notes 
Request: Send a blank email to php-notes+get-124006@lists.php.net to get a copy of this message
Handling chunked data needs careful handling, because the data can also be compressed inside the chunked data, and chunked data can have many parts, so you need to watch for that. Here a simple example that uses one function decode_header(); to build the header into a key => value array, so it makes it easy to test for the content and transfer types inside the decode_body(); function! <?php function decode_header ( $str ) { $part = preg_split ( "/\r?\n/", $str, -1, PREG_SPLIT_NO_EMPTY ); $out = array (); for ( $h = 0; $h < sizeof ( $part ); $h++ ) { if ( $h != 0 ) { $pos = strpos ( $part[$h], ':' ); $k = strtolower ( str_replace ( ' ', '', substr ( $part[$h], 0, $pos ) ) ); $v = trim ( substr ( $part[$h], ( $pos + 1 ) ) ); } else { $k = 'status'; $v = explode ( ' ', $part[$h] ); $v = $v[1]; } if ( $k == 'set-cookie' ) { $out['cookies'][] = $v; } else if ( $k == 'content-type' ) { if ( ( $cs = strpos ( $v, ';' ) ) !== false ) { $out[$k] = substr ( $v, 0, $cs ); } else { $out[$k] = $v; } } else { $out[$k] = $v; } } return $out; } function decode_body ( $info, $str, $eol = "\r\n" ) { $tmp = $str; $add = strlen ( $eol ); $str = ''; if ( isset ( $info['transfer-encoding'] ) && $info['transfer-encoding'] == 'chunked' ) { do { $tmp = ltrim ( $tmp ); $pos = strpos ( $tmp, $eol ); $len = hexdec ( substr ( $tmp, 0, $pos ) ); if ( isset ( $info['content-encoding'] ) ) { $str .= gzinflate ( substr ( $tmp, ( $pos + $add + 10 ), $len ) ); } else { $str .= substr ( $tmp, ( $pos + $add ), $len ); } $tmp = substr ( $tmp, ( $len + $pos + $add ) ); $check = trim ( $tmp ); } while ( ! empty ( $check ) ); } else if ( isset ( $info['content-encoding'] ) ) { $str = gzinflate ( substr ( $tmp, 10 ) ); } return $str; } if ( ( $io = fsockopen( "www.yahoo.com", 80, $errno, $errstr, 5 ) ) !== false ) { $send = "GET / HTTP/1.1\r\n"; $send .= "Host: www.yahoo.com\r\n"; $send .= "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20021204\r\n"; $send .= "Referer: http://www.yahoo.com/\r\n"; $send .= "Accept: text/xml,application/xml,application/xhtml+xml,"; $send .= "text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,"; $send .= "image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1\r\n"; $send .= "Accept-Language: en-us, en;q=0.50\r\n"; $send .= "Accept-Encoding: gzip, deflate, compress;q=0.9\r\n"; $send .= "Connection: Close\r\n\r\n"; fputs ( $io, $send ); $send = ''; do { $send .= fgets ( $io, 4096 ); } while ( strpos ( $send, "\r\n\r\n" ) === false ); $info = decode_header ( $send ); $send = ''; while ( ! feof ( $io ) ) { $send .= fread ( $io, 8192 ); } fclose ( $io ); $send = decode_body ( $info, $send ); echo '<h3>Header Array</h3>'; echo '<pre>'; print_r ( $info ); echo '</pre>'; echo '<h3>Document Body</h3>'; echo $send; } ?> ---- Server IP: 216.194.113.175 Probable Submitter: 66.31.240.158 ---- Manual Page -- http://www.php.net/manual/en/function.fsockopen.php Edit -- https://master.php.net/note/edit/73581 Del: integrated -- https://master.php.net/note/delete/73581/integrated Del: useless -- https://master.php.net/note/delete/73581/useless Del: bad code -- https://master.php.net/note/delete/73581/bad+code Del: spam -- https://master.php.net/note/delete/73581/spam Del: non-english -- https://master.php.net/note/delete/73581/non-english Del: in docs -- https://master.php.net/note/delete/73581/in+docs Del: other reasons-- https://master.php.net/note/delete/73581 Reject -- https://master.php.net/note/reject/73581 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#124006) next »