PX : code

http_post by Alan van den Bosch
Download this code


<?php
#
# http_post - PHP3 class for posting a 'form' from within a php3 script
# Version 0.5b
#
# Copyright 2000 
# Alan van den Bosch (alan@sanguis.com.au)
# Sanguis Pty Ltd (acn 061 444 031) 
#
# Licence:
# You are granted the right to use and/or redistribute this
# code only if this licence and the copyright notice are included
# and you accept that no warranty of any kind is made or implied 
# by the author or Sanguis Pty Ltd.

#
# Methods:
#
# http_post() 
#    Constructor used when creating a new instance of the http_post class.
#    Returns true on success.
#    ie.
#        $a=new http_post;
#
#
# set_server(string SERVER) 
#    Set the server of the URI you wish to post to. see also set_action()
#    Returns true on success.
#    ie.
#        $a->set_server("127.0.0.1");
#    or
#        $a->set_server("www.somehost.org");
#
#
# set_port(string PORT) 
#    Set the tcp port of the URI you wish to    post to. see also set_action()
#    Returns true on success.
#    ie.
#        $a->set_port("8080");
#
#
# set_file(string FILENAME) 
#    Set the filename of the URI you wish to    post to. see also set_action()
#    Returns true on success.
#    ie.
#        $a->set_file("/incoming.php3");
#
#
# set_action(string ACTION) 
#    Set the URI you wish to post to.
#    Returns true on success.
#    ie.
#        $a->set_action("http://www.somehost.org:8080/incoming.php3");
#
# set_enctype(string ENCTYPE)
#    Set the encoding type used for the post. Can have the values
#    "application/x-www-form-urlencoded" or "multipart/form-data"
#    Returns true on success.
#    ie.
#        $a->set_enctype("multipart/form-data");
#
#
# set_element(string NAME, string VALUE)
#    Set or update a single name/value pair to be posted
#    Returns true on success.
#    ie.
#        $a->set_element("username","John Doe");
#
#
# set_element(array ELEMENTS)
#    Set or update a number of name/value pairs to be posted
#    Returns true on success.
#    ie.
#        $a->set_element(array("username" => "John Doe",
#                      "password" => "dead-ringer",
#                      "age" => "99"));
#
#
# set_timeout(integer TIMEOUT)
#    Set the number of seconds to wait for the server to connect
#    when posting. minimum value of 1 second.
#    Returns true on success.
#    ie.
#        $a->set_timeout(10); 
#
# show_post()
#    Show the current internal state of an instance, for debugging.
#    Returns true on success.
#    ie.
#        $a->show_post();
#
#
# send(boolean DISPLAY)
#    Send the name/value pairs using the post method. The response
#    can be echoed by setting DISPLAY to a true value. 
#    Returns a string containing the raw response on success, false
#    on failure.
#    ie.
#        $a->send(1);
#


class http_post
{
    function 
http_post(){
        
$this->_method="post";
        
$this->_server=$GLOBALS["HTTP_HOST"];
        
$this->_file="\\";
        
$this->_port="80";
        
$this->_enctype="application/x-www-form-urlencoded";
        
$this->_element=array();
        
$this->_timeout=20;
    }

    function 
set_server($newServer=""){
        if(
strlen($newServer)<1)$newServer=$HTTP_HOST;
        
$this->_server=$newServer;
        return 
1;
    }    

    function 
set_port($newPort="80"){
        
$newPort=intval($newPort);
        if(
$newPort || $newPort 65535)$newPort=80;
        
$this->_port=$newPort;
        return 
1;
    }    

    function 
set_file($newFile="\\"){
        
$this->_file=$newFile;
        return 
1;
    }    

    function 
set_action($newAction=""){
        
$pat="^((http://){1}([^:/]{0,}){1}(:([0-9]{1,})){0,1}){0,1}(.*)";

        if(
eregi($pat,$newAction,$sub)){
            if(
strlen($sub[3])>0)$this->_server=$sub[3];
            if(
strlen($sub[5])>0)$this->_port=$sub[5];
            
$this->_file=$sub[6];
            return 
1;
        }
        return 
0;
    }

    function 
set_enctype($newEnctype="application/x-www-form-urlencoded"){
        if(
$newEnctype != "application/x-www-form-urlencoded" &&
            
$newEnctype != "multipart/form-data"){
            
$newEnctype="application/x-www-form-urlencoded";
        }
        
$this->_enctype=$newEnctype;
        return 
1;
    }    

    function 
set_element($key="",$val=""){
        if(
is_array($key)){
            
$len=sizeof($key);
            
reset($key);
            for(
$i=0;$i<$len;$i++){
                
$cur=each($key);
                
$k=$cur["key"];
                
$v=$cur["value"];
                
$this->_element[$k]=$v;
            }
        }
        else{
            if(
strlen($key)>0)$this->_element[$key]=$val;
        }
        return 
1;
    }

    function 
set_timeout($newTimeout=20){
        
$newTimeout=intval($newTimeout);
        if(
$newTimeout<1)$newTimeout=1;
        
$this->_timeout=$newTimeout;
        return 
1;
    }    
    
    function 
show_post(){
        
$str="";
        
$str.="Action:".$this->_action."<br>";
        
$str.="Server:".$this->_server."<br>";
        
$str.="Port:".$this->_port."<br>";
        
$str.="File:".$this->_file."<br>";
        
$str.="Enctype:".$this->_enctype."<br>";
    
        echo 
$str;

        
$len=sizeof($this->_element);
        
reset($this->_element);
        for(
$i=0;$i<$len;$i++){
            
$cur=each($this->_element);
            
$key=$cur["key"];
            
$val=$cur["value"];
            echo
"Field:$key = $val<br>\n";
        }
        return 
1;
    }

    function 
send($display=0){
        
// open socket to server
        
$errno=$errstr=$retstr="";
        
$sk fsockopen($this->_server,
                
$this->_port,
                &
$errno,
                &
$errstr,
                
$this->_timeout
                
);
        if(!
$sk){
            return 
0;
        }
        else{
            
$boundary="----".md5(uniqid(rand()))."----";
            
$message=$this->_get_message($boundary);
            
$str="";
            
$str.=strtoupper($this->_method)." ";
            
$str.=$this->_file." HTTP/1.0 \r\n";
            
$str.="Referer: \r\n";
            
$str.="User-Agent: php-HTTP_POST/1.0 \r\n";
            
$str.="Host: ".$this->_server."\r\n";

            
$str.="Content-type: ".$this->_enctype;
            if(
$this->_enctype=="multipart/form-data"){
                
$str.="; boundary=".$boundary;
            }
            
$str.=" \r\n";
    
            
$str.="Content-length: ".strlen($message)."\r\n\r\n";
            
$str.=$message;

            
fputs($sk,$str);

            while(!
feof($sk)){
                
$resp=fgets($sk,80);
                
$retstr.=$resp;
                if(
$display)echo $resp;
            }

            
fclose($sk);
            return 
$retstr;
        }
    }        

    function 
_get_message($boundary=""){
        
$retstr="";

        
$len=sizeof($this->_element);
        
reset($this->_element);

        
$switch=($this->_enctype=="multipart/form-data")?0:1;

        for(
$i=0;$i<$len;$i++){
            
$cur=each($this->_element);
            
$key=$cur["key"];
            
$val=$cur["value"];
            
            if(
$switch){
                if(
strlen($retstr)!=0)$retstr.="&";
                
$retstr.=rawurlencode($key)."=";
                
$retstr.=rawurlencode($val);    
            }
            else{
                
$retstr.=$boundary."\r\n";
                
$retstr.="Content-Disposition: form-data; ";
                
$retstr.="name=\"$key\"\r\n\r\n$val\r\n\r\n";
            }
        }
        if(!
$switch)$retstr.=$boundary."\r\n";
        return 
$retstr;
    }
}

?>

Comments or questions?
PX is running PHP 5.2.17
Thanks to Miranda Productions for hosting and bandwidth.
Use of any code from PX is at your own risk.