Python: Urllib.urlopen nonnumeric port
Asked Answered
V

4

6

for the following code

theurl = "https://%s:%[email protected]/nic/update?hostname=%s&myip=%s&wildcard=NOCHG&mx=NOCHG&backmx=NOCHG" % (username, password, hostname, theip)

conn = urlopen(theurl) # send the request to the url
print(conn.read())  # read the response
conn.close()   # close the connection

i get the following error

File "c:\Python31\lib\http\client.py", line 667, in _set_hostport
    raise InvalidURL("nonnumeric port: '%s'" % host[i+1:])

Any Ideas???

Vierra answered 28/7, 2010 at 8:54 Comment(0)
E
6

You probably need to url-encode the password. You'll see an error like that if the password happens to contain a '/'.

Here's a local example (actual values redacted):

>>> opener
<urllib.FancyURLopener instance at 0xb6f0e2ac>
>>> opener.open('http://admin:[email protected]')
<addinfourl at 3068618924L whose fp = <socket._fileobject object at 0xb6e7596c>>
>>> opener.open('http://admin:somepass/[email protected]')
*** InvalidURL: nonnumeric port: 'somepass'

Encode the password:

>>> opener.open('http://admin:somepass%[email protected]')

You can use urllib.quote('somepass/a', safe='') to do the encoding.

Equine answered 21/10, 2011 at 12:3 Comment(1)
This is the right answer - I foolishly didn't escape my / character, so adding safe='' worked for me, TY :)Visional
E
1

I agree with muckabout, this is the problem. You're probably used to using this in a browser, which would cause the browser to authenticate with the host. You should probably drop everything before the first @ sign.

have a look at urllib docs, specifically FancyURLOpener which might resolve your issue with authentication.

Entirely answered 28/7, 2010 at 9:8 Comment(0)
O
0

The error message shows that there is some issue with the url that you are preparing. Print and check if this is a valid url.

Organo answered 28/7, 2010 at 9:1 Comment(1)
Why print it? He's posted it in the question. The issue is the : in the URL which muckabout has mentioned.Corker
N
0

The ':' in the HTTP URL is assumed to precede a port number. You are placing an account name which is not numeric. It must be an integer port value.

Nobody answered 28/7, 2010 at 9:3 Comment(2)
In addition, you should see if they have a web based API which you can use programmatically.Corker
This is incorrect. There are three places in which ':' are significant. After the protocol, after the username, and after the domain. In the third place it precedes the port number. In the second place (as used here) it precedes the password.Equine

© 2022 - 2024 — McMap. All rights reserved.