forked from myroot/mp3
/
rest.py
114 lines (98 loc) · 3.57 KB
/
rest.py
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys, json
from twisted.internet import reactor
from twisted.web import server, resource
from twisted.web.static import File
from twisted.python import log
from twisted.web.server import Session
import time
import mydownload
import threading
def downloadThread(fd,lock,queue):
print 'start thread'
while 1 :
lock.acquire()
while len(queue) == 0 :
lock.wait()
key = queue.pop()
lock.release()
fd.download_by_id(key[0], key[1])
class DownloadSession(Session):
def __init__(self,site,uid):
Session.__init__(self,site,uid)
print 'create session'
self.fd = mydownload.myDownload()
self.notifyOnExpire(lambda: self.userExpired())
self.lock = threading.Condition()
self.queue = []
reactor.callInThread(downloadThread,self.fd,self.lock,self.queue)
def userExpired(self):
self.fd.clear_all()
pass
class Root(resource.Resource):
def render_GET(self, request):
return 'Hello world user session'
def getChild(self, name, request):
if name == '':
return self
return resource.Resource.getChild(self, name, request)
class Down(resource.Resource):
def render_GET(self, request):
print 'request download'
request.setHeader('content-type','application/x-javascript')
lock = request.getSession().lock
fd = request.getSession().fd
queue = request.getSession().queue
print request.args
callback = request.args['callback'][0]
key = request.args['key'][0]
upload = request.args['upload'][0]
if upload == '1' :
upload = True
else:
upload = False
lock.acquire()
queue.insert(0,(key,upload))
lock.notifyAll()
lock.release()
return callback+'('+json.dumps({'key':key,'status':'ok'})+')'
def render_POST(self, request):
return self.render_GET(request)
class Update(resource.Resource):
def render_GET(self, request):
request.setHeader('content-type','application/x-javascript')
fd = request.getSession().fd
callback = request.args['callback'][0]
try:
key = request.args['key'][0]
progress = fd.logstack[key]['process']
status = fd.logstack[key]['state']
path = fd.logstack[key]['path']
return callback+'('+json.dumps({'key':key,'status':status,'progress':progress, 'path':path,'time':time.time()})+')'
except:
return callback+'('+json.dumps({'key':key,'status':'waiting','progress':'-', 'path':'None'})+')'
def render_POST(self, request):
return self.render_GET(request)
class Request(resource.Resource):
def render_GET(self, request):
request.setHeader('content-type','application/x-javascript')
return 'test'
def render_POST(self, request):
return self.render_GET(request)
class Test(resource.Resource):
def render_GET(self, request):
request.setHeader('content-type','application/x-javascript')
callback = request.args['callback'][0]
return callback+'('+json.dumps({'time':'casdfafd'})+')'
def render_POST(self, request):
return self.render_GET(request)
if __name__ == '__main__':
root = Root()
root.putChild('test', Test())
root.putChild('down', Down())
root.putChild('update', Update())
server = server.Site(root)
server.sessionFactory = DownloadSession
reactor.listenTCP(2323, server)
reactor.run()