-
Notifications
You must be signed in to change notification settings - Fork 54
Expand file tree
/
Copy pathwebserver.py
More file actions
93 lines (77 loc) · 2.54 KB
/
webserver.py
File metadata and controls
93 lines (77 loc) · 2.54 KB
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
import Sofa
import Sofa.Gui
import http
from threading import Thread
import json
from functools import cached_property
from http.cookies import SimpleCookie
from http.server import BaseHTTPRequestHandler
from http.server import HTTPServer
from urllib.parse import parse_qsl, urlparse
def dump_factory():
d = {}
for component in Sofa.Core.ObjectFactory.components:
try:
node = Sofa.Core.Node("tmp")
#obj = node.addObject(component.className)
d[component.className] = {
"target" : [name for name in component.targets],
"description" : component.description
}
except:
pass
return d
def scene_to_dict(node : Sofa.Core.Node) -> dict :
d = {}
for child in node.children:
d += scene_to_dict(child)
for object in node.objects:
d[str(object.linkpath)] = {
"name": object.name.value,
"type": object.getClassName()
}
return d
class WebRequestHandler(BaseHTTPRequestHandler):
@cached_property
def url(self):
return urlparse(self.path)
@cached_property
def query_data(self):
return dict(parse_qsl(self.url.query))
@cached_property
def post_data(self):
content_length = int(self.headers.get("Content-Length", 0))
return self.rfile.read(content_length)
@cached_property
def form_data(self):
return dict(parse_qsl(self.post_data.decode("utf-8")))
@cached_property
def cookies(self):
return SimpleCookie(self.headers.get("Cookie"))
def do_GET(self):
d = ""
if self.url.path == "/load":
print("Can you reload the scene for ", self.url.params)
Sofa.Gui.GUIManager.SetScene(Sofa.Core.Node("YoLO"), filename="emptyController.py")
if self.url.path == "/factory":
print("Dump the factory in the browser ", self.url.params)
d = json.dumps(dump_factory())
else:
print("Everything else for ", self.url)
d = json.dumps(scene_to_dict(root_scene))
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.end_headers()
self.wfile.write(d.encode("utf-8"))
def serve_http():
server = HTTPServer(("0.0.0.0", 8000), WebRequestHandler)
server.serve_forever()
root_scene = None
def createScene(root):
global root_scene
root_scene = root
print("BEFORE RUN")
t = Thread(target=serve_http)
t.start()
print("COUCOU")
return root