root/dev/common/includes/class.http.php @ 191

Revision 191, 5.4 KB (checked in by exi, 16 years ago)

Fixed a bug which prevented some options from beeing saved properly.
Added code to the http request class to support cookies.
Added a small summary option for the killsummarytables.
System location will now get classified in the battleparser too.

Line 
1<?php
2/*
3 * http_request class
4 *
5 * useful to avoid allow_url_fopen_wrapper issues
6 * and to get or post data from anywhere we want
7 *
8 */
9
10class http_request
11{
12    function http_request($url = '', $method = 'GET')
13    {
14        if ($url)
15        {
16            $this->url = parse_url($url);
17        }
18        $this->useragent = 'Mozilla/4.0 (compatible)';
19        $this->method = $method;
20        $this->postform = array();
21        $this->postdata = array();
22        $this->headers = array();
23        $this->cookiedata = array();
24        $this->socket_timeout = 5;
25    }
26
27    // socket timeout is the amount of time in second which is waited
28    // for incoming data, set higher if you request stuff from heavy-loaded
29    // scripts or compressed data streams
30    function setSockettimeout($int)
31    {
32        $this->socket_timeout = $int;
33    }
34
35    function set_timeout($int)
36    {
37        $this->socket_timeout = $int;
38    }
39
40    function get_content()
41    {
42        $this->request();
43        return $this->content;
44    }
45
46    function get_header()
47    {
48        $this->request();
49        return $this->header;
50    }
51
52    function get_sent()
53    {
54        return $this->sent;
55    }
56
57    function get_recv()
58    {
59        return $this->recv;
60    }
61
62    function connect()
63    {
64        if ($this->fp)
65        {
66            return true;
67        }
68
69        $this->fp = @fsockopen($this->url["host"], 80, $errno, $errstr, 5);
70        if (!$this->fp)
71        {
72            $this->_errno = $errno;
73            $this->_errstr = $errstr;
74            return false;
75        }
76        return true;
77    }
78
79    function getError()
80    {
81        return 'Error occured with fsockopen: '.$this->_errstr.' ('.$this->_errno.')<br/>'."\n";
82    }
83
84    function request()
85    {
86        if ($this->requested)
87        {
88            return;
89        }
90        $this->connect();
91        $fp = &$this->fp;
92
93        if (!is_resource($fp))
94        {
95            return false;
96        }
97
98        // define a linefeed (carriage return + newline)
99        $lf = "\r\n";
100
101        $request_string = $this->method.' '.$this->url['path'].'?'.$this->url['query'].' HTTP/1.0'.$lf
102                          .'Accept-Language: en'.$lf
103                          .'User-Agent: '.$this->useragent.$lf
104                          .'Host: '.$this->url['host'].$lf
105                          .'Connection: close'.$lf;
106        if (count($this->headers))
107        {
108            $request_string .= join($lf, $this->headers).$lf;
109        }
110        if (count($this->cookiedata))
111        {
112            $request_string .= 'Cookie: ';
113            foreach ($this->cookiedata as $key => $value)
114            {
115                $request_string .= $key.'='.$value.'; ';
116            }
117            $request_string .= $lf;
118        }
119        if ($this->method == 'POST')
120        {
121            $boundary = substr(md5(rand(0,32000)),0,10);
122            $data = '--'.$boundary.$lf;
123
124            foreach ($this->postform as $name => $content_file)
125            {
126                $data .= 'Content-Disposition: form-data; name="'.$name.'"'.$lf.$lf;
127                $data .= $content_file.$lf;
128                $data .= '--'.$boundary.$lf;
129            }
130
131            foreach ($this->postdata as $name => $content_file)
132            {
133                $data .= 'Content-Disposition: form-data; name="'.$name.'"; filename="'.$name.'"'.$lf;
134                $data .= 'Content-Type: text/plain'.$lf.$lf;
135                $data .= $content_file.$lf;
136                $data .= '--'.$boundary.$lf;
137            }
138
139            $request_string .= 'Content-Length: '.strlen($data).$lf;
140            $request_string .= 'Content-Type: multipart/form-data, boundary='.$boundary.$lf;
141        }
142        else
143        {
144            $data = '';
145        }
146        $request_string .= $lf;
147
148        fputs($fp, $request_string.$data);
149        $this->sent = strlen($header)+strlen($data);
150
151        $header = 1;
152        socket_set_timeout($fp, $this->socket_timeout);
153        while ($line = fgets($fp, 4096))
154        {
155            if ($header)
156            {
157                $http_header .= $line;
158            }
159            else
160            {
161                $file .= $line;
162            }
163            if ($header && $line == $lf)
164            {
165                $header = 0;
166            }
167        }
168        $this->status = socket_get_status($fp);
169        fclose($fp);
170        $this->header = $http_header;
171        $this->content = $file;
172        $this->recv = strlen($http_header)+strlen($file);
173        $this->requested = true;
174    }
175
176    function url($url)
177    {
178        $this->url = parse_url($url);
179    }
180
181    // this is to send file-data to be accessed with $_FILES[$name]
182    function set_postdata($name, $data)
183    {
184        $this->method = 'POST';
185        $this->postdata[$name] = $data;
186    }
187
188    // this function sends form data objects like $_POST[$name] = $data
189    function set_postform($name, $data)
190    {
191        $this->method = 'POST';
192        $this->postform[$name] = $data;
193    }
194
195    function set_cookie($name, $data)
196    {
197        $this->cookiedata[$name] = $data;
198    }
199
200    function set_useragent($string)
201    {
202        $this->useragent = $string;
203    }
204
205    function set_header($headerstring)
206    {
207        if (!strpos($headerstring, ':'))
208        {
209            return;
210        }
211        $this->headers[$headerstring] = $headerstring;
212    }
213}
214?>
Note: See TracBrowser for help on using the browser.