urllib2 httplib.BadStatusLine exception while opening a page on an Oracle HTTP Server

O Peng oliverpeng at gmail.com
Thu Feb 19 07:57:46 EST 2009


I'm running into a similar problem with the BadStatusLine.
The source code for httplib.py in the problem is as follows:

class HTTPResponse:
    ...
    def _read_status(self):
        line = self.fp.readline()
        ...
        if not line:
            # Presumably, the server closed the connection before
            # sending a valid response.
            raise BadStatusLine(line)

However, I found that right before the 'raise BadStatusLine(line)'
when I ran the following:

restOfResponse = self.fp.read()
print restOfResponse

restOfResponse is NOT empty.  In fact, when I run self.fp.read() at
the beginning of the begin() function, it is not empty at all.
This leads me to believe there is a bug with the self.fp.readline()
(socket._fileobject.readline()) function.  For me it only fails
sometimes.

This behavior is only observed on Windows, Python 2.5.  Running it on
Mac OS X, Python 2.5 yielded no problems.

On Jan 19, 3:48 pm, ak <akte... at gmail.com> wrote:
> On Jan 19, 10:00 pm, ak <akte... at gmail.com> wrote:
>
>
>
> > Hi everyone,
>
> > I have a problem with urllib2 on this particular url, hosted on an
> > Oracle HTTP Server
>
> >http://www.orange.sk/eshop/sk/portal/catalog.html?type=post&subtype=p...
>
> > which gets 302 redirected tohttps://www.orange.sk/eshop/sk/catalog/post/phones.html,
> > after setting a cookie through the Set-Cookie header field in the 302
> > reply. This works fin with firefox.
>
> > However, with urllib2 and the following code snippet, it doesn't work
>
> > --------
> > import cookiejar
> > import urllib2
>
> > cookiejar = cookielib.LWPCookieJar()
> > opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))
> > url = 'http://www.orange.sk/eshop/sk/portal/catalog.html?
> > type=post&subtype=phone&null'
> > req = urllib2.Request(url, None)
> > s=opener.open(req)
> > --------
>
> > Traceback (most recent call last):
> >   File "<stdin>", line 1, in <module>
> >   File "/usr/lib/python2.5/urllib2.py", line 387, in open
> >     response = meth(req, response)
> >   File "/usr/lib/python2.5/urllib2.py", line 498, in http_response
> >     'http', request, response, code, msg, hdrs)
> >   File "/usr/lib/python2.5/urllib2.py", line 419, in error
> >     result = self._call_chain(*args)
> >   File "/usr/lib/python2.5/urllib2.py", line 360, in _call_chain
> >     result = func(*args)
> >   File "/usr/lib/python2.5/urllib2.py", line 582, in http_error_302
> >     return self.parent.open(new)
> >   File "/usr/lib/python2.5/urllib2.py", line 381, in open
> >     response = self._open(req, data)
> >   File "/usr/lib/python2.5/urllib2.py", line 399, in _open
> >     '_open', req)
> >   File "/usr/lib/python2.5/urllib2.py", line 360, in _call_chain
> >     result = func(*args)
> >   File "/usr/lib/python2.5/urllib2.py", line 1115, in https_open
> >     return self.do_open(httplib.HTTPSConnection, req)
> >   File "/usr/lib/python2.5/urllib2.py", line 1080, in do_open
> >     r = h.getresponse()
> >   File "/usr/lib/python2.5/httplib.py", line 928, in getresponse
> >     response.begin()
> >   File "/usr/lib/python2.5/httplib.py", line 385, in begin
> >     version, status, reason = self._read_status()
> >   File "/usr/lib/python2.5/httplib.py", line 349, in _read_status
> >     raise BadStatusLine(line)
> > httplib.BadStatusLine
>
> > Trying the redirected url directly doesn't work either (trying with
> > Firefox will give an HTML error page, as the cookie is not set yet,
> > but trying with urllib2 gives the same exception as previously,
> > whereas it should return the HTML error page)
> > This works correctly on other urls on this website (http(s)://www.orange.sk).
>
> > Am I doing anything wrong or is this a bug in urllib2 ?
>
> > -- ak
>
> Actually, I was wrong on the last point, this does *not* work onhttps://www.orange.sk(but does onhttp://www.orange.sk). IMHO, this
> means either urllib2 or the server misimplemented HTTPS.
>
> Here's some output with debuglevel=1 :
>
> >>> opener.open(urllib2.Request('http://www.orange.sk/', None, headers))
>
> reply: 'HTTP/1.1 200 OK\r\n'
> header: Date: Mon, 19 Jan 2009 21:44:03 GMT
> header: Server: Oracle-Application-Server-10g/10.1.3.1.0 Oracle-HTTP-
> Server
> header: Set-Cookie:
> JSESSIONID=0a19055a30d630c427bda71d4e26a37ca604b9f590dc.e3eNaNiRah4Pe3aSch8 Sc3yOc40;
> path=/web
> header: Expires: Mon, 19 Jan 2009 21:44:13 GMT
> header: Surrogate-Control: max-age="10"
> header: Content-Type: text/html; charset=ISO-8859-2
> header: X-Cache: MISS fromwww.orange.sk
> header: Connection: close
> header: Transfer-Encoding: chunked
> <addinfourl at 137417292 whose fp = <socket._fileobject object at
> 0x831348c>>
>
> >>> opener.open(urllib2.Request('https://www.orange.sk/', None, headers))
>
> reply: ''
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
>   File "/usr/lib/python2.5/urllib2.py", line 381, in open
>     response = self._open(req, data)
>   File "/usr/lib/python2.5/urllib2.py", line 399, in _open
>     '_open', req)
>   File "/usr/lib/python2.5/urllib2.py", line 360, in _call_chain
>     result = func(*args)
>   File "/usr/lib/python2.5/urllib2.py", line 1115, in https_open
>     return self.do_open(httplib.HTTPSConnection, req)
>   File "/usr/lib/python2.5/urllib2.py", line 1080, in do_open
>     r = h.getresponse()
>   File "/usr/lib/python2.5/httplib.py", line 928, in getresponse
>     response.begin()
>   File "/usr/lib/python2.5/httplib.py", line 385, in begin
>     version, status, reason = self._read_status()
>   File "/usr/lib/python2.5/httplib.py", line 349, in _read_status
>     raise BadStatusLine(line)
> httplib.BadStatusLine
>
> As you can see the reply from the server seems empty (which results in
> the BadStatusLine exception)
>
> Any help greatly appreciated.
>
> -- ak




More information about the Python-list mailing list