class 'http.client.BadStatusLine'>

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
fstrauss
User
Beiträge: 10
Registriert: Montag 12. September 2011, 11:29

Hallo,

ich habe mir gedacht zu diesem Fehler einen neuen Thread abzumachen.

Bekomme folgenden Fehler:

class 'http.client.BadStatusLine'>


Leider weiß ich nicht, welche Zahl der Statuscode hat. Kann mir jemand helfen bzw. das Problem beheben?
Der Fehler tritt Clientseitig auf.
Genutzt wurde Python 3.2


XML-RPC-Server

Code: Alles auswählen

# coding: utf-8

from xmlrpc.server import SimpleXMLRPCServer
import sys
import os
import logging
import time

LINEBREAK = "-----------------------------------"
HOST = "10.1.0.43"
PORT = 9001 

class xmlServer_init():

	def __init__(self):									# Konstruktor 
		print (LINEBREAK)
		print ("XML-RPC-Server wird erstellt")
		server = SimpleXMLRPCServer((HOST, PORT), allow_none=1)
		server.register_function(self.get_params)
		server.serve_forever()
		
	def __del__(self): 									# Destruktor
		print (LINEBREAK) 
		print ("XML-RPC-Server wird beendet")
		

	def get_params(self, paramsHash):
		print ("Folgende Daten erhalten...")
		print (LINEBREAK)
		print (paramsHash.items() )
		#print LINEBREAK
		
		
		xmlServer_exec(paramsHash)



class xmlServer_exec():

	def __init__(self, paramsHash):									# Konstruktor 
		print (LINEBREAK) 
		self.__create_wave_file(paramsHash)
		self.__create_call_file(paramsHash)
		
	def __del__(self): 										# Destruktor
		print (LINEBREAK) 
		


	# Audiodatei wird erstellt
	def __create_wave_file(self, paramsHash):
	
		length = len(paramsHash)
	
		#......Hier kommt belangloser Code..... --- Hat nichts mit dem Fehler zu tun
                #......Belangloser code zu Ende......

		print ("create call-file")		

def main():
	try:
		
		xmlServer_init()


	except:
		# Es sind Fehler bei der Argumentuebergabe aufgetreten
		print ("Serverfehler aufgetreten")
		#logging.error("Folgender Fehler ist aufgetreten:")		
		#etype, evalue, tb = sys.exc_info()
		#logging.error("%s" %(print_exception(etype, evalue, tb)))
		#print_exception(etype, evalue, tb)

if __name__ == "__main__":
	# Start der Main-Funktion	
	main()


XML-RPC-Client

Code: Alles auswählen

# coding: utf-8

import xmlrpc.client
import sys
import os
import socket

XMLRPC_SERVER = 'http://10.1.0.43:9001'
HOST = "10.1.0.43"
PORT = 9001
LINEBREAK = "--------------------------------------"

# Klasse XmlClient wird definiert
class xmlClient: 
	def __init__(self):									# Konstruktor 
		print (LINEBREAK) 
		print ("Objekt wird erstellt...")
		
		self.paramsHash = {}		
			

	def __del__(self): 									# Destruktor
		print (LINEBREAK) 
		print ("Objekt wird zerstoert...")


	def getArguments(self, argv):								# Funktion
		if len(sys.argv) == 6:
			# Parameter werden zugeordnet
			self.paramsHash["HOSTNAME"]     = argv[0]
			self.paramsHash["HOSTADDR"]     = argv[1]
			self.paramsHash["HOSTSTATE"]    = argv[2]
			self.paramsHash["HOSTOUTPUT"]   = argv[3]
			self.paramsHash["CONTACTPAGER"] = argv[4]

			
			return self.paramsHash
			
		else:	
			print ("#################################")		
			raise Exception("Anzahl der Argumente fehlerhaft.")	
		

		

	def is_alive(self):									# Funktion
		print (LINEBREAK)
		s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		s.connect((HOST, PORT))
		s.shutdown(2)
		print ("XMLRPC-Schnittstelle ist auf %s:%s erreichbar..." %(HOST, PORT))

		

	def sendParams(self, server, paramsHash):						# Funktion
		# Ruft die Funktion auf dem XMLRPC-Server auf
		print (LINEBREAK)
		print ("Argumente werden uebertragen....")
		server.get_params(paramsHash)
		print (LINEBREAK)
		print ("...fertig...")


# Begin der Hauptfunktion
def main(argv):

	try:
		xml_client= xmlClient()							# Objekt wird erstellt
		
		paramsHash = xml_client.getArguments(argv)		# Parameter werden uebergeben
		xml_client.is_alive()							# Ist die Schnittstelle erreichbar?
		s = xmlrpc.client.ServerProxy('http://10.1.0.43:9001')	# Erstellung des Server-Objekts
		#xml_client.sendParams(xml_server, paramsHash)	# Parameter werden gesendet
		s.get_params(paramsHash)
		
		
	except xmlrpc.client.Fault as fErr:
		print ("XML-RPC Fehler:" )
		print ("Fehlercode: %d" %fErr.faultCode )
		print ("Fehlermeldung: %s" %fErr.faultString )

	except xmlrpc.client.ProtocolError as pErr:
		print ("XML-RPC Protokollfehler:" )
		print ("Fehlercode: %d" %pErr.errcode )
		print ("URL: %s" %(pErr.url) )
		print ("HTTP-Header: %s" %pErr.headers )
		print ("Fehlermeldung: %s" %pErr.errmsg )

	except http.client.HTTPException as err:
		print ("%s") %err

	except:
		# Es sind Fehler bei der Argumentuebergabe aufgetreten
		print ("Es ist folgender Fehler aufgetreten: %s" %sys.exc_info()[0] )

if __name__ == "__main__":
	# Start der Main-Funktion	
	main(sys.argv[1:])
BlackJack

@fstrauss: Das ist kein Fehler das ist eine Klasse. Wenn eine Ausnahme ausgelöst wird, dann behandelt man aber Exemplare einer Klasse und nicht die Klasse selbst.

Schön wäre ein Traceback um zu sehen wo da überhaupt das Problem besteht. Bei dem gezeigten Quelltext glaube ich das nicht, denn da sollte ein ``TypeError: unsupported operand type(s) for %: 'NoneType' and 'BadStatusLine'`` heraus kommen, denn `BadStatusLine` ist eine Unterklasse von `HTTPException` und deshalb sollte die entsprechende Behandlung ausgeführt werden und die ist fehlerhaft. `print` ist in Python 3.x eine Funktion. Vielleicht solltest Du mal das Leerzeichen zwischen dem Funktionsnamen und der öffnenden Klammer für die Argumente weglassen, damit der Aufruf sich optisch nicht von allen anderen unterscheidet. Semantisch tut er das schliesslich auch nicht. Und hinter dem ``%`` solltest Du dafür ein Leerzeichen setzen. Bei anderen binären Operatoren schreibst Du das doch sicher auch nicht so komisch asymmetrisch.

Nackte ``except``\s sollte man nicht verwenden. Dort sollte immer eine konkrete Ausnahme behandelt werden. Und wenn es die allgemeinste ist, die es gibt. Die kann man dann dort auch an einen Namen binden und braucht nicht dem Umweg über `sys.exc_info()` gehen.

Das ``except`` am Ende der `main()` würde ich aber sowieso weglassen. Denn bei unerwarteten Ausnahmen möchte man ja nicht nur wissen welche aufgetreten ist, sondern auch wo die aufgetreten ist. Das sind genau die Informationen die man bekommt, wenn man die ganzen ”Rest”-Ausnahmen dort *nicht* behandelt.

Die `__del__()`-Methode sollte man übrigens nicht implementieren. Das ist kein Destruktor, sie wird nicht zuverlässig aufgerufen, und ihr blosses Vorhandensein kann Probleme bei der Speicherverwaltung verursachen.
fstrauss
User
Beiträge: 10
Registriert: Montag 12. September 2011, 11:29

Hallo und vielen Dank für deine Antwort.
Werde es mir merken und in zukünftigen Projekten anwenden.

Hier ist der Traceback:

Code: Alles auswählen

Traceback (most recent call last):
  File "./client.py", line 98, in main
    xml_client.sendParams(s, paramsHash)        # Parameter werden gesendet
  File "./client.py", line 84, in sendParams
    server.get_params(paramsHash)
  File "/usr/lib/python3.1/xmlrpc/client.py", line 1029, in __call__
    return self.__send(self.__name, args)
  File "/usr/lib/python3.1/xmlrpc/client.py", line 1271, in __request
    verbose=self.__verbose
  File "/usr/lib/python3.1/xmlrpc/client.py", line 1059, in request
    resp = http_conn.getresponse()
  File "/usr/lib/python3.1/http/client.py", line 1033, in getresponse
    response.begin()
  File "/usr/lib/python3.1/http/client.py", line 347, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python3.1/http/client.py", line 309, in _read_status
    raise BadStatusLine(line)
http.client.BadStatusLine
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

fstrauss hat geschrieben:Genutzt wurde Python 3.2
Der Traceback deutet allerdings auf Python 3.1 hin. ;)
BlackJack

@fstrauss: Ändert sich etwas wenn Du den `is_alive()`-Aufruf nicht machst?

Und abseits vom Problem solltest Du das ganze mal etwas vereinfachen. Zum Beispiel ist keine einzige der Klassen irgendwie sinnvoll. Du hast im Grunde nicht eine einzige echte Methode in den beiden Modulen, sondern nur Funktionen die unnötigerweise auf Klassen definiert wurden.
fstrauss
User
Beiträge: 10
Registriert: Montag 12. September 2011, 11:29

OK, ja das war ein Tippfehler.

Python 3.1 ---> Hast recht :)


-------------------------------------------------------

@BlackJack,

Wie definiert sich denn eine Methode in einer Klasse? Bzw. könntest du ein Beispiel geben was du damit meinst?

Ich bin nicht der Top-Programmierer und dachte Funktionen/Methoden sind das selbe.


BTW:
Das Problem hat sich gelöst!!!!!!


Und zwar ist es ganz Simple: Die Schnittstelle (Also der Server) läuft nicht!!!!
Aber anstatt einer einfachen Meldung, kommt eine "kryptische"

Bin auf die Lösung gekommen als ich die XML-RPC in Perl realisiert habe.
Perl brachte schlicht und einfach die Meldung: "Schnittstelle nicht verfügbar."
BlackJack

@fstrauss: Eine echte Methode verwendet den Umstand das sie eine Methode auf einem Objekt ist. Wenn sie das Objekt gar nicht benötigt, könnte sie auch in jeder beliebigen anderen Klasse definiert werden, oder eben auf gar keiner.

Wenn Funktionen und Methoden das selbe wären, würde es doch keinen Unterschied machen wie man sie nennt, und könnte einen der beiden Begriffe komplett weg lassen.

Praktisch gesehen bedeutet das für Dich, Du solltest einfach keine Klassen definieren.
Antworten