blob: 8c965facaf59aac681b7a5e29d18e8c18cee67c0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
import errno
import select
import socket
import time
import httplib
from mimetools import Message
from StringIO import StringIO
CONNECTING = 0
RECEIVING = 1
class ogClient:
def __init__(self, ip, port):
self.ip = ip
self.port = port
def get_socket(self):
return self.sock
def get_state(self):
return self.state
def connect(self):
print "connecting"
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.setblocking(0)
self.state = CONNECTING
self.data = ""
self.trailer = False
self.content_len = 0
try:
self.sock.connect((self.ip, self.port))
except socket.error, err:
if err.errno == errno.EINPROGRESS:
return
elif err.errno == errno.ECONNREFUSED:
return
print "Error connect " + str(err)
def connect2(self):
try:
self.sock.connect((self.ip, self.port))
except socket.error, err:
if err.errno == errno.EISCONN:
print "connected"
self.state = RECEIVING
else:
print "connection refused, retrying..."
self.state = CONNECTING
self.sock.close()
self.connect()
def receive(self):
print "receiving"
try:
data = self.sock.recv(1024)
except socket.err, err:
print "Error3 " + str(err)
if len(data) == 0:
self.state = CONNECTING
self.sock.close()
self.connect()
print "received " + data
self.data = self.data + data
if not self.trailer:
if self.data.find("\r\n") > 0:
# https://stackoverflow.com/questions/4685217/parse-raw-http-headers
request_line, headers_alone = self.data.split('\n', 1)
headers = Message(StringIO(headers_alone))
print "DEBUG: \r\n trailer received"
print "DEBUG: HTTP keys are " + str(headers.keys())
if 'content-length' in headers.keys():
self.content_len = int(headers['content-length'])
self.trailer = True
if self.trailer and len(self.data) >= self.content_len:
#
# TODO: handle request here
#
self.sock.send("HTTP/1.0 200 OK\r\n\r\n")
# Cleanup state information from request
self.data = ""
self.content_len = 0
self.trailer = False
print "DEBUG: request has been processed!"
|