note 64230 deleted from function.filesize by aharvey

From: Date: Tue, 22 Jan 2013 00:16:15 +0000
Subject: note 64230 deleted from function.filesize by aharvey
References: 1  Groups: php.notes 
Request: Send a blank email to php-notes+get-193309@lists.php.net to get a copy of this message
Note Submitter: core58 at mail dot ru ---- this is "raw" version of remote_filesize() function. according to RFC, HTTP servers MUST implement at least GET, POST and HEAD requests, so the function just opens TCP socket connection, sends HEAD request and receives response, parsing length of the resource. [$ipAddress] is the ip address of remote server. [$url] is the name of file which size you want to determine. the code was tested under Apache 2.0.43 and IIS 6.0 and it works correctly in both cases. i wish the code can save someone's time :) example: $ipa = gethostbyname( "www.someserver.com" ); $url = "/docs/somedocument.pdf"; $fsize = remote_filesize2( $ipa, $url ); ========================== <?php function ReadHeader( $socket ) { $i=0; $header = ""; while( true && $i<20 ) { // counter [$i] is used here to avoid deadlock while reading header string // it's limited by [20] here cause i really haven't ever met headers with string counter greater than 20 // * $s = fgets( $socket, 4096 ); $header .= $s; if( strcmp( $s, "\r\n" ) == 0 || strcmp( $s, "\n" ) == 0 ) break; $i++; } if( $i >= 20 ) { // suspicious header strings count was read // * return false; } return $header; } function remote_filesize2( $ipAddress, $url ) { $socket = fsockopen( $ipAddress, 80 ); if( !$socket ) { // failed to open TCP socket connection // do something sensible here besides exit(); // ... exit(); } // just send HEAD request to server // * fwrite( $socket, "HEAD $url HTTP/1.0\r\nConnection: Close\r\n\r\n" ); // read the response header // * $header = ReadHeader( $socket ); if( !$header ) { Header( "HTTP/1.1 404 Not Found" ); exit(); } // try to acquire Content-Length within the response // * $regex = '/Content-Length:\s([0-9].+?)\s/'; $count = preg_match($regex, $header, $matches); // if there was a Content-Length field, its value // will now be in $matches[1] if( isset( $matches[1] ) ) { $size = $matches[1]; } else { $size = 0; } fclose( $socket ); return $size; } ?>

« previous php.notes (#193309) next »