Seite 1 von 1

Server-Error bei einem Request an Zope-Server

Verfasst: Donnerstag 25. Januar 2007, 11:06
von cybermat
Hi,

ich muss eine ganze Reihe von URLs auf ihre Erreichbarkeit prüfen. Dazu setze ich über die urllib2 einen Request an jede URL ab.
Anschließend veruche ich ein urlopen und fange ggf. die Fehler, die mir die urllib2 entgegenwirft und bekomme somit den entsprechenden HTTP-Status-Code. Wird kein Fehler geworfen, ist der Status 200 und somit allen in Ordnung.
Im Fehlerfall gebe ich mir den Code aus und noch ein paar Infos, was denn schief gelaufen ist.


Code: Alles auswählen

import urllib2, httplib

def checkURL(url):

    print 'URL: %s' % url

    rHeader = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1",
               "Accept": "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",
               "Accept-Language": "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3",
               "Accept-Encoding": "gzip,deflate",
               "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7"}

    req = urllib2.Request(url.lower(), None, rHeader)
    try:
        urllib2.urlopen(req)
    except urllib2.URLError, e:
        try:
            print e.code
            print e.__class__
            print e            
            print e.info()
        except AttributeError, e:
            print 'kein Status'
    except httplib.socket.error, e:
        print '%s: %s' % (e[0], e[1])
    else:
        print '200'

    print '-----------'

urls = ['http://www.westpfalz-klinikum.de']

for url in urls:
    checkURL(url)
In diesem Beispielscript gebe ich das Ergebnis zu Testzwecken nur aus, sonst zähle ich für jeden Status einen Zähler hoch. Dieses Script tut eigentlich auch genau das, was es soll. Ich habe sehr viele URLs geprüft und das Ergebnis nochmal gegen gecheckt. Dabei ist eine URL rausgefallen, die auch schon in dem Beispiel ersichtlich ist.

Diese Seite läuft auf einem Zope-Server und ich bekomme hier einen Status 500 zurück:

Code: Alles auswählen

URL: http://www.westpfalz-klinikum.de
500
urllib2.HTTPError
HTTP Error 500: Internal Server Error
Server: Zope/(Zope 2.7.6-final, python 2.3.4, linux2) ZServer/1.1
Date: Thu, 25 Jan 2007 09:31:24 GMT
Bobo-Exception-Line: 200
Content-Length: 824
Bobo-Exception-Value: See the server error log for details
Content-Type: text/html
Bobo-Exception-Type: IndexError
Connection: close
Bobo-Exception-File: BaseRequest.py
Rufe ich die URL in einem Browser (Firefox 2) auf, sieht das Ergebnis ganz anders aus:

Code: Alles auswählen

HTTP/1.x 302 Moved Temporarily
Server: Zope/(Zope 2.7.6-final, python 2.3.4, linux2) ZServer/1.1
Date: Thu, 25 Jan 2007 09:58:52 GMT
Content-Length: 0
Content-Type: text/x-unknown-content-type
Location: ../westpfalz-klinikum/content/e15882/index_ger.html
Der Browser folgt dann auch der neuen URL und erhält dort einen Status 200. Rufe ich hingegen diese Ziel-URL wiederum mit der urllib2 auf, klappt das auch, ich bekomme dann ebenfalls den Status 200.
Irgendwas läuft hier noch schief, dass mir Zope bei einer Umleitung (HTTP-Status 302) einen Internal Server Error entgegen wirft, wenn ich die urllib2 verwende.

Hat jemand eine Idee? Muss ich den Header noch erweitern? Ich bin mit meinem Latein am ende.

Danke,

Mat

Verfasst: Donnerstag 29. März 2007, 20:03
von Fabian Kochem
Probiere mal das gzip rauszunehmen.
Könnte mir vorstellen, dass der Server damit Probleme hat.

Könntest du sonst vielleicht mal den Server und die URI, die du versuchst aufzurufen posten?