Simulating a POST with PHP & cURL -


i'm trying simulate post website based on see coming live http headers in firefox.

here's copy/paste of log firefox plugin:

post /context?tab=login http/1.1
host: website
user-agent: mozilla/5.0 (x11; u; linux i686; en-us; rv:1.9.2.13) gecko/20101206 ubuntu/10.10 (maverick) firefox/3.6.13
accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
accept-language: en-us,en;q=0.5
accept-encoding: gzip,deflate
accept-charset: iso-8859-1,utf-8;q=0.7,*;q=0.7
keep-alive: 115
connection: keep-alive
referer: referer
cookie: fontsize=2; jsessionid=0000pxe_bk7tjzfzeynhqokzxz2:-1
content-type: application/x-www-form-urlencoded
content-length: 46
loginid=password&password=password&login=login

and response follows after post:

http/1.1 302 found
location: website/context?tab=p00689
content-language: en-us
set-cookie: jsessionid=0000oaklieedrwkx5yciju5v1lm:-1; path=/
transfer-encoding: chunked
date: mon, 07 feb 2011 14:15:21 gmt
server: websphere application server/6.1
expires: thu, 01 dec 1994 16:00:00 gmt
cache-control: no-cache="set-cookie, set-cookie2"

based on testing, response redirects

website/context?tab=p00689

means user authenticated , worked properly.

however, when trying accomplish via php & curl, i'm being redirected page informs user session has timed out.

here's code:

// provider likes firefox $agent = "user-agent: mozilla/5.0 (x11; u; linux i686; en-us; rv:1.9.2.13) gecko/20101206 ubuntu/10.10 (maverick) firefox/3.6.13";  ini_set("user_agent", $agent);  // cookie $cookie = tempnam("/tmp", "curlcookie");  // post posted me. $fields = $_post;  foreach($fields $key=>$value) {         $fields_string .= "$key=$value&"; }  $fields_string = substr($fields_string, 0, strlen($fields_string) - 1);  // custom headers $headers = array(         "accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",         "accept-language: en-us,en;q=0.5",         "accept-encoding: gzip,deflate",         "accept-charset: iso-8859-1,utf-8;q=0.7,*;q=0.7",         "keep-alive: 115",         "connection: keep-alive");  // curl options $ch = curl_init("website");  curl_setopt($ch, curlopt_referer, "referer"); curl_setopt($ch, curlopt_header, 1); curl_setopt($ch, curlopt_post, true); curl_setopt($ch, curlopt_postfields, $fields_string); curl_setopt($ch, curlopt_cookiejar, $cookie); curl_setopt($ch, curlopt_cookiefile, $cookie); curl_setopt($ch, curlopt_returntransfer, true); curl_setopt($ch, curlopt_ssl_verifypeer, false); curl_setopt($ch, curlopt_ssl_verifyhost, false); curl_setopt($ch, curlopt_followlocation, false); curl_setopt($ch, curlopt_maxredirs, 1); curl_setopt($ch, curlinfo_header_out, true); curl_setopt($ch, curlopt_useragent, $agent); curl_setopt($ch, curlopt_httpheader, $headers);  $output = curl_exec($ch); $header  = curl_getinfo($ch);  curl_close($ch);  // debugging junk echo nl2br($header["request_header"]); echo "<br/><br/>output:<br/><br/>$output"; 

the output script follows:

post /context?tab=login http/1.1
user-agent: user-agent: mozilla/5.0 (x11; u; linux i686; en-us; rv:1.9.2.13) gecko/20101206 ubuntu/10.10 (maverick) firefox/3.6.13
host: website
pragma: no-cache
referer: referer
accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
accept-language: en-us,en;q=0.5
accept-encoding: gzip,deflate
accept-charset: iso-8859-1,utf-8;q=0.7,*;q=0.7
keep-alive: 115
connection: keep-alive
content-length: 46
content-type: application/x-www-form-urlencoded

loginid=username&password=password&login=login


output:

http/1.1 302
found
location:website/context?tab=p00697
content-language: en-us set-cookie:
jsessionid=0000tl8nl1hg2dbnv_penq-bbvr:-1;
path=/ set-cookie:
jsessionid=0000zue58y1txg3tt4xjb8exxw6:-1;
path=/ transfer-encoding: chunked
date: mon, 07 feb 2011 19:18:20 gmt
server: websphere application
server/6.1 expires: thu, 01 dec 1994
16:00:00 gmt cache-control:
no-cache="set-cookie,
set-cookie2"

based on i've posted, there obvious i'm missing? should try next? requests semantically same; i'm not sure doing incorrectly.

the 1 thing stands out following line of code:

$cookie = tempnam("/tmp", "curlcookie"); 

now if fails create file tempnam return false, meaning following lines of code:

curl_setopt($ch, curlopt_cookiejar, $cookie); curl_setopt($ch, curlopt_cookiefile, $cookie); 

are not being set @ all, should keep cookie file within same directory executing script.

the next thing is:

$fields = $_post; foreach($fields $key=>$value) {    $fields_string .= "$key=$value&"; } $fields_string = substr($fields_string, 0, strlen($fields_string) - 1); 

you not need curlopt_postfields accepts array should able do:

curl_setopt($ch, curlopt_postfields, $_post); 

this make sure entities correctly parsed.

i think can remove ini_set that's native functions such file_get_contents , fopen streams etc, double check line:

ini_set("user_agent", $agent); 

also check see if there cookie set main page, such index.php site may block requests sources have come directly login page data.


Comments

Popular posts from this blog

javascript - Enclosure Memory Copies -

php - Replacing tags in braces, even nested tags, with regex -