shadyabhi
shadyabhi

Reputation: 17234

Writing Python equivalent of Perl code

I don't know a single thing of perl but from a big perl script, I managed to get the relevant parts and make a HTTP request. So, this perl code works perfectly.

#!/usr/bin/perl -w

use strict;
use LWP::UserAgent;
use HTTP::Request::Common;

my $ua = new LWP::UserAgent;

my $request = "X-CTCH-PVer: 0000001\r\n";

my $method_url =  "http://localhost:8088/ctasd/GetStatus";
my $response = $ua->request (POST $method_url,Content => $request);

my $data = $response->status_line . "\n";
print $data;
print $response->content;

The above code outputs:

200 OK
X-CTCH-PVer: 0000001

From my understanding, it's doing a POST to a URL with the specified data. With that base, my python code looks like:

#!/usr/bin/python

import urllib

url = "http://localhost:8088/ctasd/GetStatus"
data = urllib.urlencode([("X-CTCH-PVer", "0000001")])

print urllib.urlopen(url, data).read()

But, this returns response as:

X-CTCH-Error: Missing protocol header "X-CTCH-PVer"

Please help me in making a Python equivalent of perl code.

Upvotes: 2

Views: 1175

Answers (2)

shadyabhi
shadyabhi

Reputation: 17234

So, the actual thing was, the $request in Perl was literally been sent as POST data without any change. Now I get why is the name content in Perl.

#!/usr/bin/python

import urllib

url = "http://localhost:8088/ctasd/GetStatus"
print urllib.urlopen(url, "X-CTCH-PVer: 0000001").read()

Worked. I actually found out about this after capturing the traffic in both cases and analysing it in wireshark.

Upvotes: 2

PenguinCoder
PenguinCoder

Reputation: 4367

The error is because you are not sending the header, you are making/sending a urlencoded string, hence the function urllib.urlencode

Try setting the request with actual headers:

#!/usr/bin/python

import urllib2


request = urllib2.Request("http://localhost:8088/ctasd/GetStatus", headers={"X-CTCH-PVer" : "0000001"})
contents = urllib2.urlopen(request).read()

Upvotes: 0

Related Questions