• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

djthyrax

[Python] Uma simples class para fazer pedidos HTTP onde se tem controlo completo

1 mensagem neste tópico

#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Coded by David Ferreira

import socket

class Connection: # Ligação
def __init__(self, host, port, connect = True):
	self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	self.host = host
	self.port = port
	if connect:
		self.connect()

def connect(self):
	try:
		self.socket.connect((self.host, self.port)) # Connect it bitch!
		return True
	except:
		return False

def communicate(self, content):
	self.socket.send(content)
	self.buffer = []

	while True:
		tmp = self.socket.recv(4096)
		if not tmp:
			break
		self.buffer.append(tmp)

	self.socket.close()
	self.reply = ''.join(self.buffer)
	return self.reply


class HttpRequest: # Request
def __init__(self, host, uri, port = 80, headers = {}, callback = None, comunicate = False, method = 'GET'):
	self.method = method
	self.host = host
	self.uri = uri
	self.port = port
	self.headers = headers
	self.callback = callback
	self.conn = Connection(self.host, self.port, False) # abrir uma ligação
	if comunicate: self.communicate()

def communicate(self):
	self.textToSend = "%s %s HTTP/1.0\r\nHost: %s\r\n" % (self.method, self.uri, self.host)
	for header in self.headers:
		self.textToSend += "%s: %s\r\n" % (header, self.headers[header])
	self.textToSend += "\r\n"
	self.conn.connect()
	self.reply = self.conn.communicate(self.textToSend)
	if self.callback != None: self.callback(self.reply)
	return self.reply
Exemplo de uso:
#!/usr/bin/python
# -*- coding: utf-8 -*-

import socket, sys

class Connection: # Ligação
def __init__(self, host, port, connect = True):
	self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	self.host = host
	self.port = port
	if connect:
		self.connect()

def connect(self):
	try:
		self.socket.connect((self.host, self.port)) # Connect it bitch!
		return True
	except:
		return False

def communicate(self, content):
	self.socket.send(content)
	self.buffer = []

	while True:
		tmp = self.socket.recv(4096)
		if not tmp:
			break
		self.buffer.append(tmp)

	self.socket.close()
	self.reply = ''.join(self.buffer)
	return self.reply


class HttpRequest: # Request
def __init__(self, host, uri, port = 80, headers = {}, callback = None, comunicate = False, method = 'GET'):
	self.method = method
	self.host = host
	self.uri = uri
	self.port = port
	self.headers = headers
	self.callback = callback
	self.conn = Connection(self.host, self.port, False) # abrir uma ligação
	if comunicate: self.communicate()

def communicate(self):
	self.textToSend = "%s %s HTTP/1.0\r\nHost: %s\r\n" % (self.method, self.uri, self.host)
	for header in self.headers:
		self.textToSend += "%s: %s\r\n" % (header, self.headers[header])
	self.textToSend += "\r\n"
	self.conn.connect()
	self.reply = self.conn.communicate(self.textToSend)
	if self.callback != None: self.callback(self.reply)
	return self.reply


class GeexBoxController:
def __init__(self, host):
	self.host = host
	self.port = 80
	self.state = {'uri': "/cgi-bin/state.cgi" }

def getState(self, callback = None):
	self.state['conn'] = HttpRequest(self.host, self.state['uri'])
	self.state['state'] = '\n'.join(self.state['conn'].communicate().split("\n")[7:-3])
	if callback != None: callback(self.state['state'])
	return self.state['state']

#def handle(x):
#	print '\n'.join(x.split("\n")[7:-3])
#HttpRequest("10.0.0.6", "/cgi-bin/state.cgi", callback=handle, comunicate=True)
root = GeexBoxController("10.0.0.6")
print root.getState()
 
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora