Maxsteel
Maxsteel

Reputation: 2040

Properly encode url in urllib2 Python

I have to make a series of requests to my localserver and check response. Basically I am trying to hit the right url by brute forcing. This is my code:

for i in range(48,126):
   test = chr(i)
   urln = '012a4' + test 
   url = {"tk" : urln}
   data = urllib.urlencode(url)
   print data
   request = urllib2.Request("http://127.0.0.1/brute.php", data)
   response = urllib2.urlopen(request)
   status_code = response.getcode()

I've to make request like: http://127.0.0.1/brute.php?tk=some_val I am getting an error because the url is not properly encoding. I am internal server error 500 even when one of the url in series should give 200. manually giving that url confirms it. Also, what is the right way to skip 500/400 errors until I get a 200?

Upvotes: 0

Views: 6930

Answers (2)

Martin Evans
Martin Evans

Reputation: 46759

When using urllib2 you should always handle any exceptions that are raised as follows:

import urllib, urllib2

for i in range(0x012a40, 0x12a8e):
    url = {"tk" : '{:x}'.format(i)}
    data = urllib.urlencode(url)
    print data

    try:
        request = urllib2.Request("http://127.0.0.1/brute.php", data)
        response = urllib2.urlopen(request)
        status_code = response.getcode()
    except urllib2.URLError, e:
        print e.reason

This will display the following when the connection fails, and then continue to try the next connection:

[Errno 10061] No connection could be made because the target machine actively refused it

e.reason will give you the textual reason, and e.errno will give you the error code. So you could still stop if the error was something other than 10061 for example.

Lastly, you seem to be cycling through a range of numbers in hex format? You might find it easier to work directly with 0x formatting to build your strings.

Upvotes: 1

rofls
rofls

Reputation: 5115

It sounds like you will benefit from a try/except block:

 for i in range(48,126):
    test = 'chr(i)'
    new urln = '012a4' + test 
    url = {"tk" : urln}
    data = urllib.urlencode(url)
    print data
    request = urllib2.Request("http://127.0.0.1/brute.php", data)
    try:
        response = urllib2.urlopen(request)
    except:
        status_code = response.getcode()**strong text**
    print status_code

You typically would also want to catch the error as well:

except Exception, e:
    print e

Or catch specific errors only, for example:

except ValueError:
    #do stuff

Though you wouldn't get a ValueError in your code.

Upvotes: 0

Related Questions