View Single Post
ישן 05-11-11, 22:42   # 5
iSraelServ
חבר בקהילה
 
מיני פרופיל
תאריך הצטרפות: Mar 2011
הודעות: 52

iSraelServ לא מחובר  

הקובץ httpsocket.php (לא אני כתבתי)
PHP קוד:
    <?php
     
    
/**
     * Socket communication class.
     *
     * Originally designed for use with DirectAdmin's API, this class will fill any HTTP socket need.
     *
     * Very, very basic usage:
     * $Socket = new HTTPSocket;
     * echo $Socket->get('http://user:pass@somesite.com/somedir/some.file?query=string&this=that');
     *
     * @author Phi1 'l0rdphi1' Stier <l0rdphi1@liquenox.net>
     * @package HTTPSocket
     * @version 2.6
     */
    
class HTTPSocket {
     
    var 
$version '2.6';
     
    
/* all vars are private except $error, $query_cache, and $doFollowLocationHeader */
     
    
var $method 'GET';
     
    var 
$remote_host;
    var 
$remote_port;
    var 
$remote_uname;
    var 
$remote_passwd;
     
    var 
$result;
    var 
$result_header;
    var 
$result_body;
    var 
$result_status_code;
     
    var 
$lastTransferSpeed;
     
    var 
$bind_host;
     
    var 
$error = array();
    var 
$warn = array();
    var 
$query_cache = array();
     
    var 
$doFollowLocationHeader TRUE;
    var 
$redirectURL;
     
    var 
$extra_headers = array();
     
    
/**
      * Create server "connection".
      *
      */
    
function connect($host$port '' )
    {
    if (!
is_numeric($port))
    {
    
$port 80;
    }
     
    
$this->remote_host $host;
    
$this->remote_port $port;
    }
     
    function 
bind$ip '' )
    {
    if ( 
$ip == '' )
    {
    
$ip $_SERVER['SERVER_ADDR'];
    }
     
    
$this->bind_host $ip;
    }
     
    
/**
      * Change the method being used to communicate.
      *
      * @param string|null request method. supports GET, POST, and HEAD. default is GET
      */
    
function set_method$method 'GET' )
    {
    
$this->method strtoupper($method);
    }
     
    
/**
      * Specify a username and password.
      *
      * @param string|null username. defualt is null
      * @param string|null password. defualt is null
      */
    
function set_login$uname ''$passwd '' )
    {
    if ( 
strlen($uname) > )
    {
    
$this->remote_uname $uname;
    }
     
    if ( 
strlen($passwd) > )
    {
    
$this->remote_passwd $passwd;
    }
     
    }
     
    
/**
      * Query the server
      *
      * @param string containing properly formatted server API. See DA API docs and examples. Http:// URLs O.K. too.
      * @param string|array query to pass to url
      * @param int if connection KB/s drops below value here, will drop connection
      */
    
function query$request$content ''$doSpeedCheck )
    {
    
$this->error $this->warn = array();
    
$this->result_status_code NULL;
     
    
// is our request a http:// ... ?
    
if (preg_match('!^http://!i',$request))
    {
    
$location parse_url($request);
    
$this->connect($location['host'],$location['port']);
    
$this->set_login($location['user'],$location['pass']);
     
    
$request $location['path'];
    
$content $location['query'];
     
    if ( 
strlen($request) < )
    {
    
$request '/';
    }
     
    }
     
    
$array_headers = array(
    
'User-Agent' => "HTTPSocket/$this->version",
    
'Host' => ( $this->remote_port == 80 $this->remote_host "$this->remote_host:$this->remote_port" ),
    
'Accept' => '*/*',
    
'Connection' => 'Close' );
     
    foreach ( 
$this->extra_headers as $key => $value )
    {
    
$array_headers[$key] = $value;
    }
     
    
$this->result $this->result_header $this->result_body '';
     
    
// was content sent as an array? if so, turn it into a string
    
if (is_array($content))
    {
    
$pairs = array();
     
    foreach ( 
$content as $key => $value )
    {
    
$pairs[] = "$key=".urlencode($value);
    }
     
    
$content join('&',$pairs);
    unset(
$pairs);
    }
     
    
$OK TRUE;
     
    
// instance connection
    
if ($this->bind_host)
    {
    
$socket socket_create(AF_INETSOCK_STREAMSOL_TCP);
    
socket_bind($socket,$this->bind_host);
     
    if (!@
socket_connect($socket,$this->remote_host,$this->remote_port))
    {
    
$OK FALSE;
    }
     
    }
    else
    {
    
$socket = @fsockopen$this->remote_host$this->remote_port$sock_errno$sock_errstr10 );
    }
     
    if ( !
$socket || !$OK )
    {
    
$this->error[] = "Can't create socket connection to $this->remote_host:$this->remote_port.";
    return 
0;
    }
     
    
// if we have a username and password, add the header
    
if ( isset($this->remote_uname) && isset($this->remote_passwd) )
    {
    
$array_headers['Authorization'] = 'Basic '.base64_encode("$this->remote_uname:$this->remote_passwd");
    }
     
    
// for DA skins: if $this->remote_passwd is NULL, try to use the login key system
    
if ( isset($this->remote_uname) && $this->remote_passwd == NULL )
    {
    
$array_headers['Cookie'] = "session={$_SERVER['SESSION_ID']}; key={$_SERVER['SESSION_KEY']}";
    }
     
    
// if method is POST, add content length & type headers
    
if ( $this->method == 'POST' )
    {
    
$array_headers['Content-type'] = 'application/x-www-form-urlencoded';
    
$array_headers['Content-length'] = strlen($content);
    }
    
// else method is GET or HEAD. we don't support anything else right now.
    
else
    {
    if (
$content)
    {
    
$request .= "?$content";
    }
    }
     
    
// prepare query
    
$query "$this->method $request HTTP/1.0
    "
;
    foreach ( 
$array_headers as $key => $value )
    {
    
$query .= "$key: $value
    "
;
    }
    
$query .= "
    "
;
     
    
// if POST we need to append our content
    
if ( $this->method == 'POST' && $content )
    {
    
$query .= "$content
     
    "
;
    }
     
    
// query connection
    
if ($this->bind_host)
    {
    
socket_write($socket,$query);
     
    
// now load results
    
while ( $out socket_read($socket,2048) )
    {
    
$this->result .= $out;
    }
    }
    else
    {
    
fwrite$socket$querystrlen($query) );
     
    
// now load results
    
$this->lastTransferSpeed 0;
    
$status socket_get_status($socket);
    
$startTime time();
    
$length 0;
    
$prevSecond 0;
    while ( !
feof($socket) && !$status['timed_out'] )
    {
    
$chunk fgets($socket,1024);
    
$length += strlen($chunk);
    
$this->result .= $chunk;
     
    
$elapsedTime time() - $startTime;
     
    if ( 
$elapsedTime )
    {
    
$this->lastTransferSpeed = ($length/1024)/$elapsedTime;
    }
     
    if ( 
$doSpeedCheck && $elapsedTime && $this->lastTransferSpeed $doSpeedCheck )
    {
    
$this->warn[] = "kB/s for last 5 seconds is below 50 kB/s (~".( ($length/1024)/$elapsedTime )."), dropping connection...";
    
$this->result_status_code 503;
    break;
    }
     
    }
     
    if ( 
$this->lastTransferSpeed == )
    {
    
$this->lastTransferSpeed $length/1024;
    }
     
    }
     
    list(
$this->result_header,$this->result_body) = split("
     
    "
,$this->result,2);
     
    if (
$this->bind_host)
    {
    
socket_close($socket);
    }
    else
    {
    
fclose($socket);
    }
     
    
$this->query_cache[] = $query;
     
     
    
$headers $this->fetch_header();
     
    
// what return status did we get?
    
if (!$this->result_status_code)
    {
    
preg_match("#HTTP/1\.. (\d+)#",$headers[0],$matches);
    
$this->result_status_code $matches[1];
    }
     
    
// did we get the full file?
    
if ( !empty($headers['content-length']) && $headers['content-length'] != strlen($this->result_body) )
    {
    
$this->result_status_code 206;
    }
     
    
// now, if we're being passed a location header, should we follow it?
    
if ($this->doFollowLocationHeader)
    {
    if (
$headers['location'])
    {
    
$this->redirectURL $headers['location'];
    
$this->query($headers['location']);
    }
    }
     
    }
     
    function 
getTransferSpeed()
    {
    return 
$this->lastTransferSpeed;
    }
     
    
/**
      * The quick way to get a URL's content :)
      *
      * @param string URL
      * @param boolean return as array? (like PHP's file() command)
      * @return string result body
      */
    
function get($location$asArray FALSE )
    {
    
$this->query($location);
     
    if ( 
$this->get_status_code() == 200 )
    {
    if (
$asArray)
    {
    return 
split("\n",$this->fetch_body());
    }
     
    return 
$this->fetch_body();
    }
     
    return 
FALSE;
    }
     
    
/**
      * Returns the last status code.
      * 200 = OK;
      * 403 = FORBIDDEN;
      * etc.
      *
      * @return int status code
      */
    
function get_status_code()
    {
    return 
$this->result_status_code;
    }
     
    
/**
      * Adds a header, sent with the next query.
      *
      * @param string header name
      * @param string header value
      */
    
function add_header($key,$value)
    {
    
$this->extra_headers[$key] = $value;
    }
     
    
/**
      * Clears any extra headers.
      *
      */
    
function clear_headers()
    {
    
$this->extra_headers = array();
    }
     
    
/**
      * Return the result of a query.
      *
      * @return string result
      */
    
function fetch_result()
    {
    return 
$this->result;
    }
     
    
/**
      * Return the header of result (stuff before body).
      *
      * @param string (optional) header to return
      * @return array result header
      */
    
function fetch_header$header '' )
    {
    
$array_headers split("
    "
,$this->result_header);
     
    
$array_return = array( => $array_headers[0] );
    unset(
$array_headers[0]);
     
    foreach ( 
$array_headers as $pair )
    {
    list(
$key,$value) = split(": ",$pair,2);
    
$array_return[strtolower($key)] = $value;
    }
     
    if ( 
$header != '' )
    {
    return 
$array_return[strtolower($header)];
    }
     
    return 
$array_return;
    }
     
    
/**
      * Return the body of result (stuff after header).
      *
      * @return string result body
      */
    
function fetch_body()
    {
    return 
$this->result_body;
    }
     
    
/**
      * Return parsed body in array format.
      *
      * @return array result parsed
      */
    
function fetch_parsed_body()
    {
    
parse_str($this->result_body,$x);
    return 
$x;
    }
     
    }
     
    
?>
מה שהראיתי מקודם
PHP קוד:
 <?
     
include ('httpdsocket.php');
    
$server_ip="11.22.33.44";
    
$server_login="admin";
    
$server_pass="mypass";
    
$server_ssl="N";
     
     
    
$username=$_POST['username'];
    
$domain=$_POST['domain'];
    
$email=$_POST['email'];
    
$pass=$_POST['pass'];
    
$package=$_POST['package'];
     
     
    if (isset(
$_POST['action']) && $_POST['action'] == "add")
    {
    
$sock = new HTTPSocket;
    echo 
"Creating user $username on server $ip.... <br>\n";
         if (
$server_ssl == 'Y')
    {
    
$sock->connect("ssl://".$server_ip2222);
    }
    else
    {
    
$sock->connect($server_ip2222);
    }
    

     
    
$sock->set_login($server_login,$server_pass);
     
    
$sock->query('/CMD_API_ACCOUNT_USER',
    array(
    
'action' => 'create',
    
'add' => 'Submit',
    
'username' => $username,
    
'email' => $email,
    
'passwd' => $pass,
    
'passwd2' => $pass,
    
'domain' => $domain,
    
'package' => $package,
    
'ip' => $server_ip,
    
'notify' => 'yes'
    
));
     
    
$result $sock->fetch_parsed_body();
     
    if (
$result['error'] != "0")
    {
    echo 
"<b>Error Creating user $username on server $server_ip:<br>\n";
    echo 
$result['text']."<br>\n";
    echo 
$result['details']."<br></b>\n";
    }
    else
    {
    echo 
"User $username created on server $server_ip<br>\n";
    }
     
    exit;
    }
     
    
?>
     
     
    <form method="POST">
    <input type="hidden" name="action" value="add" />
    שם משתמש: <input type="text" name="username" /><br />
    דומיין:<input type="text" name="domain" /><br />
    אימייל: <input type="text" name="email" /><br />
    סיסמא: <input type="password" name="pass" /><br />
    חבילה: <input type="text" name="package" /><br />
   <input type="submit" value="הרשמה!" /><br />
    </form>
עכשיו הוא עובד על הדף הרבה זמן.. ואחרי זה זה כותב
שגיאה המשתמש לא יכול להפתח בסרבר (אייפי של הסרבר) בגלל הסיבות האלה:
(כלום)


קיצור הכל תקין ועדיין לא עובד.. למה?
  Reply With Quote