rest.py

Wed, 31 Dec 2014 11:40:46 -0500

author
Teemu Piippo <crimsondusk64@gmail.com>
date
Wed, 31 Dec 2014 11:40:46 -0500
changeset 113
08e9b1c1b324
parent 112
cdafc1a0544e
child 120
9880bb697149
permissions
-rw-r--r--

- added page system to prevent commands from printing too much output

92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1 import ssl
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
2 import socket
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
3 import errno
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
4 import select
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
5 import asyncore
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
6 import base64
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
7 import re
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
8 import json
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
9 import urllib
94
2c93636202a5 - argrrgh
Teemu Piippo <crimsondusk64@gmail.com>
parents: 93
diff changeset
10 import irc as Irc
92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
11 from datetime import datetime, timedelta
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
12 from configfile import Config
97
55d7d9aea160 - link rest to hg
Teemu Piippo <crimsondusk64@gmail.com>
parents: 96
diff changeset
13 import hgpoll as HgPoll
92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
14
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
15 g_credentials = None
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
16 g_portnumber = None
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
17 g_throttle = []
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
18
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
19 valid_repos = ['Torr_Samaho/zandronum', 'Torr_Samaho/zandronum-stable',
112
cdafc1a0544e - stuff!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 100
diff changeset
20 'crimsondusk/zandronum-sandbox', 'crimsondusk/zandronum-sandbox-stable', 'crimsondusk/zfc9000']
92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
21
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
22 def is_throttled (address):
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
23 i = 0
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
24
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
25 while i < len (g_throttle):
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
26 if g_throttle[i][1] <= datetime.utcnow():
94
2c93636202a5 - argrrgh
Teemu Piippo <crimsondusk64@gmail.com>
parents: 93
diff changeset
27 print 'Throttle of %s expired' % g_throttle[i][0]
92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
28 item = g_throttle.pop (i) # expired
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
29
94
2c93636202a5 - argrrgh
Teemu Piippo <crimsondusk64@gmail.com>
parents: 93
diff changeset
30 if item[0] == address:
92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
31 return False # this address expired
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
32
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
33 continue
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
34
94
2c93636202a5 - argrrgh
Teemu Piippo <crimsondusk64@gmail.com>
parents: 93
diff changeset
35 if g_throttle[i][0] == address:
92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
36 return True # is throttled
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
37
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
38 i += 1
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
39
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
40 return False # not throttled
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
41
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
42 def throttle (address):
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
43 tt = datetime.utcnow() + timedelta (0, 30)
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
44
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
45 try:
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
46 # attempt to just update the item
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
47 g_throttle[g_throttle.index (address)][1] = tt
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
48 except ValueError:
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
49 # not in list
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
50 g_throttle.append ([address, tt])
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
51
96
24f0b13e87d3 - fixed REST
Teemu Piippo <crimsondusk64@gmail.com>
parents: 95
diff changeset
52 Irc.broadcast ('Throttling %s for 30 seconds' % address)
92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
53
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
54 def handle_rest_http (data, address):
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
55 global g_credentials
94
2c93636202a5 - argrrgh
Teemu Piippo <crimsondusk64@gmail.com>
parents: 93
diff changeset
56 displayaddress = address
92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
57 authrex = re.compile (r'^authorization: Basic (.+)$')
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
58 payloadrex = re.compile (r'^payload=(.+)$')
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
59 authenticated = False
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
60 payload = ''
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
61
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
62 if not g_credentials:
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
63 g_credentials = base64.b64encode (Config.get_node ('rest').get_value ('credentials'))
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
64
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
65 # Authenticate and find the payload
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
66 for line in data:
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
67 match = authrex.match (line)
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
68
94
2c93636202a5 - argrrgh
Teemu Piippo <crimsondusk64@gmail.com>
parents: 93
diff changeset
69 if match and match.group (1) == g_credentials:
92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
70 authenticated = True
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
71 continue
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
72
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
73 match = payloadrex.match (line)
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
74 if match:
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
75 payload = match.group (1)
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
76
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
77 if not authenticated:
96
24f0b13e87d3 - fixed REST
Teemu Piippo <crimsondusk64@gmail.com>
parents: 95
diff changeset
78 Irc.broadcast ('%s failed to authenticate' % address)
92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
79 throttle (address)
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
80 return
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
81
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
82 jsonstring = urllib.unquote_plus (payload).decode ('utf-8')
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
83
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
84 try:
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
85 jsondata = json.loads (jsonstring)
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
86 repodata = jsondata['repository']
99
147d78eea80b - more fixing
Teemu Piippo <crimsondusk64@gmail.com>
parents: 97
diff changeset
87 repo_fullname = '%s/%s' % (repodata['owner'], repodata['name'])
92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
88
99
147d78eea80b - more fixing
Teemu Piippo <crimsondusk64@gmail.com>
parents: 97
diff changeset
89 if repo_fullname not in valid_repos:
147d78eea80b - more fixing
Teemu Piippo <crimsondusk64@gmail.com>
parents: 97
diff changeset
90 raise ValueError ('unknown repository %s' % repo_fullname)
97
55d7d9aea160 - link rest to hg
Teemu Piippo <crimsondusk64@gmail.com>
parents: 96
diff changeset
91
55d7d9aea160 - link rest to hg
Teemu Piippo <crimsondusk64@gmail.com>
parents: 96
diff changeset
92 commit_data = []
92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
93
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
94 if 'commits' in jsondata:
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
95 for commit in jsondata['commits']:
97
55d7d9aea160 - link rest to hg
Teemu Piippo <crimsondusk64@gmail.com>
parents: 96
diff changeset
96 commit_data.append ([commit['node'], commit['message']])
55d7d9aea160 - link rest to hg
Teemu Piippo <crimsondusk64@gmail.com>
parents: 96
diff changeset
97
55d7d9aea160 - link rest to hg
Teemu Piippo <crimsondusk64@gmail.com>
parents: 96
diff changeset
98 if len (commit_data) > 0:
99
147d78eea80b - more fixing
Teemu Piippo <crimsondusk64@gmail.com>
parents: 97
diff changeset
99 HgPoll.process_new_commits (repodata['name'], commit_data)
92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
100 except Exception as e:
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
101 Irc.broadcast ('%s provided bad JSON: %s' % (address, e))
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
102
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
103 try:
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
104 with open ('rejected_json.txt', 'w') as fp:
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
105 fp.write (jsonstring)
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
106 Irc.broadcast ('bad json written to rejected_json.txt')
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
107 except:
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
108 Irc.broadcast ('failed to log json')
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
109 pass
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
110
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
111 throttle (address)
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
112 return
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
113
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
114 class RESTConnection (asyncore.dispatcher):
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
115 httpdata = ''
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
116 writebuffer = ''
94
2c93636202a5 - argrrgh
Teemu Piippo <crimsondusk64@gmail.com>
parents: 93
diff changeset
117 address = None
92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
118
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
119 def __init__ (self, conn, address):
96
24f0b13e87d3 - fixed REST
Teemu Piippo <crimsondusk64@gmail.com>
parents: 95
diff changeset
120 asyncore.dispatcher.__init__ (self, conn)
92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
121 self.socket = ssl.wrap_socket (conn, server_side=True, keyfile='key.pem',
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
122 certfile='cert.pem', do_handshake_on_connect=False)
96
24f0b13e87d3 - fixed REST
Teemu Piippo <crimsondusk64@gmail.com>
parents: 95
diff changeset
123 self.socket.settimeout (3)
92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
124 self.address = address
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
125
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
126 while True:
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
127 try:
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
128 self.socket.do_handshake()
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
129 break
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
130 except ssl.SSLError, err:
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
131 if err.args[0] == ssl.SSL_ERROR_WANT_READ:
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
132 select.select([self.socket], [], [])
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
133 elif err.args[0] == ssl.SSL_ERROR_WANT_WRITE:
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
134 select.select([], [self.socket], [])
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
135 else:
94
2c93636202a5 - argrrgh
Teemu Piippo <crimsondusk64@gmail.com>
parents: 93
diff changeset
136 Irc.broadcast ('%s:%s: SSL error: %s' % (self.address[0], err))
2c93636202a5 - argrrgh
Teemu Piippo <crimsondusk64@gmail.com>
parents: 93
diff changeset
137 throttle (self.address[0])
92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
138 self.close()
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
139 return
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
140
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
141 def write (self, msg):
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
142 self.writebuffer += msg
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
143
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
144 def readable (self):
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
145 return True
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
146
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
147 def writable (self):
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
148 return self.writebuffer
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
149
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
150 def handle_close (self):
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
151 self.finish()
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
152
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
153 def handle_read (self):
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
154 while 1:
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
155 try:
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
156 data = self.recv (4096)
94
2c93636202a5 - argrrgh
Teemu Piippo <crimsondusk64@gmail.com>
parents: 93
diff changeset
157 except:
92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
158 # EOF
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
159 self.finish()
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
160 return
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
161
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
162 self.httpdata += data.replace ('\r', '')
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
163
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
164 def finish (self):
94
2c93636202a5 - argrrgh
Teemu Piippo <crimsondusk64@gmail.com>
parents: 93
diff changeset
165 handle_rest_http (self.httpdata.split ('\n'), self.address[0])
92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
166 self.close()
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
167
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
168 def handle_write (self):
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
169 self.send (self.writebuffer)
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
170 self.writebuffer=''
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
171
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
172 def handle_error (self):
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
173 raise
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
174
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
175 class RESTServer (asyncore.dispatcher):
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
176 def __init__ (self):
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
177 global g_portnumber
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
178
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
179 if g_portnumber == None:
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
180 g_portnumber = Config.get_node ('rest').get_value ('port')
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
181
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
182 asyncore.dispatcher.__init__ (self)
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
183 self.create_socket (socket.AF_INET, socket.SOCK_STREAM)
94
2c93636202a5 - argrrgh
Teemu Piippo <crimsondusk64@gmail.com>
parents: 93
diff changeset
184 self.setsockopt (socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
185 self.bind (('', g_portnumber))
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
186 self.listen (5)
93
Teemu Piippo <crimsondusk64@gmail.com>
parents: 92
diff changeset
187 print 'REST server initialized'
92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
188
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
189 def handle_accept (self):
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
190 sock, address = self.accept()
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
191
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
192 if is_throttled (address):
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
193 # throttled
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
194 sock.close()
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
195 return
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
196
94
2c93636202a5 - argrrgh
Teemu Piippo <crimsondusk64@gmail.com>
parents: 93
diff changeset
197 conn = RESTConnection (sock, address)
2c93636202a5 - argrrgh
Teemu Piippo <crimsondusk64@gmail.com>
parents: 93
diff changeset
198
92
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
199 def handle_error (self):
da291d9426ea - first implementation of REST
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
200 return

mercurial