http request mit php

Juli 2nd, 2006 by admin

für alle die webseiten über bzw. mit php aufrufen möchten, habe ich mal ne "http request" klasse geschieben.

folgende features werden unterstützt:

-get daten an eine webseite schicken

-post daten an eine webseite schicken ('PUT','DELETE','TRACE','CONNECT' werden wie post behandelt)

-es ist möglich den ganzen request über ein proxy server laufen zu lassen

-cookies können übergeben werden

-in post requests können dateien hochgeladen werden ('echte' und 'fake' dateien)

-beliebige header informationen können den request hinzugefügt werden

-alle relevanten daten können nach dem senden abgefragt werden

-ein beispiel aufruf der klasse ist in der datei einthalten

CODE:
  1. //Usage example:
  2. //$request = new http_request('POST','macosbrain','/nvtracker/test.php');///method, host, file, port(optional), http_v(optional)
  3. //$request->proxy('192.168.0.1',8080); //use a proxy server for request -> optional
  4. //$request->add_header('Accept','text/plain');///add some header informations
  5. //$request->add_header('User-Agent','Firefox/1.5.0.4');///add some header informations
  6. //$request->add_header('Referer','http://localhost');///add some header informations
  7.  
  8. //$cookies = array(
  9. // 'uid' => 3,
  10. // 'pass' => 'testpass',
  11. // 'PHPSESSID' => '123456789');
  12. //$request->add_cookies($cookies); /// add the cookies to the request
  13. //$request->add_data('disk','on'); // add "disk" with value "on"
  14. //$request->add_data('test','123');// add "test" with value "123"
  15. //$request->add_file('file_1',"test.jpg",$request->get_bin_file_content('C:\\small.JPG'));//add a real file, with fake name(like an upload)
  16. //$request->add_file('file_2',"nice_dummy.txt",'content in the file');//add a custom "file" (like an upload)
  17.  
  18. //$request->send();///send the request
  19. //echo('---------packet send--------');
  20. //print_r($request->packet);
  21. //echo('---------send_header---------');
  22. //print_r($request->send_header);
  23. //echo('---------send_data---------');
  24. //print_r($request->send_data);
  25. //echo('---------response from host---------');
  26. //print_r($request->response);
  27.  
  28. class http_request
  29. {
  30. function __construct($type,$host,$file,$port = 80,$http_v = 'HTTP/1.1')
  31. {
  32. $this->host = $host;
  33. $this->port = $port;
  34. if(!$this->set_type($type))
  35. die('sorry: please set a request type');
  36. $this->file = $file;
  37. $this->http_v = $http_v;
  38. $this->add_header('Host',$host);
  39. $this->add_header('Connection','Close');
  40. }
  41.  
  42. function proxy($host,$port)
  43. {
  44. $this->con = @$this->connect($host,$port);
  45. if(!$this->con)
  46. die('sorry: the proxy on host "'.$host.'" did not response on port '.$port);
  47. $this->proxy_con = true;
  48. }
  49.  
  50. function connect($host,$port)
  51. {
  52. if(!is_numeric($port))
  53. die('sorry: but this is not a port');
  54. preg_match('@^(?:(?:25[0-5]|2[0-4]\d|[01]\d\d|\d?\d)(?(?=\.?\d)\.)){4}$@i', $host, $ip);
  55. if($ip[0]!='')
  56. return fsockopen($host,$port);
  57. else
  58. return fsockopen(gethostbyname($host),$port);
  59. }
  60.  
  61. function get_ascii_file_content($file)
  62. {
  63. $content = @file_get_contents($file);
  64. if($content=='')
  65. die('sorry: can not access file or file is empty');
  66. return $content;
  67. }
  68.  
  69. function get_bin_file_content($file)
  70. {
  71. $handle = @fopen($file, "rb");
  72. if(!$handle)
  73. die('sorry: can not access file');
  74. $content = fread ($handle, filesize($file));
  75. fclose ($handle);
  76. return $content;
  77. }
  78.  
  79. function send($set_ct = true)
  80. {
  81. if($set_ct==true)
  82. $this->set_content_type();
  83. if($this->proxy_con != true)
  84. {
  85. $this->con = @$this->connect($this->host,$this->port);
  86. if(!$this->con)
  87. die('sorry: "'.$this->host.'" did not response on port '.$this->port);
  88. }
  89.  
  90. $this->send_data = '';
  91. $contentlength = 0;
  92.  
  93. if($this->type=='GET')
  94. {
  95. $get_str='';
  96. foreach($this->data as $name => $value)
  97. {
  98. $get_str .= $name.'='.$value.'&';
  99. }
  100. $this->file.='?'.substr($get_str,0,-1);
  101.  
  102. }
  103. else //// all other request types (POST, CONNECT ...)
  104. {
  105. if($this->boundary)
  106. {
  107. foreach($this->data as $name => $value)
  108. {
  109. $contentlength += strlen("--".$this->boundary."\nContent-Disposition: form-data; name=\"".$name."\"\n\n".$value."\n");
  110. $this->send_data.=("--".$this->boundary."\nContent-Disposition: form-data; name=\"".$name."\"\n\n".$value."\n");
  111. }
  112. $contentlength += strlen($this->boundary)+3;
  113. $this->add_header('Content-length',$contentlength);
  114. $this->send_data.= "--".$this->boundary."--\n";
  115. }
  116. else
  117. {
  118. foreach($this->data as $name => $value)
  119. {
  120. $this->send_data.= $name.'='.$value.'&';
  121. }
  122. $this->send_data = substr($this->send_data,0,-1);
  123. $contentlength = strlen($this->send_data);
  124. $this->add_header('Content-length',$contentlength);
  125. }
  126. }
  127. if($this->proxy_con==true)
  128. $this->send_header = $this->type.' '.'http://'.$this->host.$this->file.' '.$this->http_v."\r\n";
  129. else
  130. $this->send_header = $this->type.' '.$this->file.' '.$this->http_v."\r\n";
  131. foreach($this->header as $head_name => $head_value)
  132. $this->send_header .= $head_name.': '.$head_value."\r\n";
  133. $this->send_header .= "\n";
  134. $this->packet = $this->send_header.$this->send_data;
  135. $this->send_to_host($this->packet);
  136. }
  137.  
  138. function send_to_host($packet)
  139. {
  140. if(get_resource_type($this->con)!='stream')
  141. die('sorry: no connection');
  142. fputs($this->con,$packet);
  143. if($this->proxy_con==true)
  144. {
  145. $this->response='';
  146. while (!feof($this->con)) {
  147. $this->response.=fgets($this->con);
  148. }
  149. }
  150. else
  151. {
  152. $this->response='';
  153. while ((!feof($this->con)) or (!eregi(chr(0x0d).chr(0x0a).chr(0x0d).chr(0x0a),$this->response))) {
  154. $this->response.=fread($this->con,1);
  155. }
  156. }
  157. fclose($this->con);
  158. }
  159.  
  160. function set_content_type()
  161. {
  162. if($this->files> 0)
  163. {
  164. $this->boundary = '---------------------------'.rand(1,9999999999);
  165. $this->add_header('Content-Type','multipart/form-data; boundary='.$this->boundary);
  166. }
  167. elseif($this->type!='GET')
  168. $this->add_header('Content-Type','application/x-www-form-urlencoded');
  169. }
  170.  
  171. function add_cookies($cookies)
  172. {
  173. if(!is_array($cookies))
  174. die('sorry: we need an array for the cookies');
  175. foreach($cookies as $cookie_name => $cookie_value)
  176. $cookie_str .= $cookie_name.'='.$cookie_value.'; ';
  177. $cookie_str = substr($cookie_str,0,-2);
  178. $this->add_header('Cookie',$cookie_str);
  179. }
  180.  
  181. function set_type($name)
  182. {
  183. $name = strtoupper($name);
  184. $types = array('GET','HEAD','POST','PUT','DELETE','TRACE','CONNECT');
  185. if( in_array($name,$types) )
  186. {
  187. $this->type = $name;
  188. return true;
  189. }
  190. else
  191. {
  192. return false;
  193. }
  194. }
  195.  
  196. function add_data($name,$value)
  197. {
  198. $this->data[$name] = $value;
  199. }
  200.  
  201. function add_file($name,$filename,$content)
  202. {
  203. if($this->type=='GET')
  204. die('sorry: please do not use file uploads in get requests');
  205. $this->files ++;
  206. $this->add_data($name.'"; filename="'.$filename,$content);
  207. }
  208.  
  209. function add_header($name,$value)
  210. {
  211. $this->header[$name]=$value;
  212. }
  213. }
  214. ?>

http_request.zip

Posted in misc | 2 Comments »