src/eric7/RemoteServer/EricServer.py

Fri, 09 Feb 2024 19:54:15 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Fri, 09 Feb 2024 19:54:15 +0100
branch
server
changeset 10555
08e853c0c77b
parent 10547
a357729cb749
child 10561
be23a662d709
permissions
-rw-r--r--

Implemented an eric-ide Server Shell.

10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
3 # Copyright (c) 2024 Detlev Offenbach <detlev@die-offenbachs.de>
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 """
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7 Module implementing the eric remote server.
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 """
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10 import io
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11 import json
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
12 import selectors
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13 import socket
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14 import struct
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15 import sys
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16 import traceback
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
17 import types
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18 import zlib
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20 from eric7.UI.Info import Version
10546
300487f5f517 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10539
diff changeset
21 # TODO: remove dependency on 'eric7.UI.Info'
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 from .EricRequestCategory import EricRequestCategory
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
24 from .EricServerDebuggerRequestHandler import EricServerDebuggerRequestHandler
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
25 from .EricServerFileSystemRequestHandler import EricServerFileSystemRequestHandler
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 class EricServer:
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29 """
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 Class implementing the eric remote server.
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 """
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 def __init__(self, port=42024, useIPv6=False):
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 """
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35 Constructor
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37 @param port port to listen on (defaults to 42024)
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 @type int (optional)
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 @param useIPv6 flag indicating to use IPv6 protocol (defaults to False)
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 @type bool (optional)
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41 """
10539
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
42 self.__requestCategoryHandlerRegistry = {}
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
43 # Dictionary containing the defined and registered request category
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
44 # handlers. The key is the request category and the value is the respective
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
45 # handler method. This method must have the signature:
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
46 # handler(request:str, params:dict, reqestUuid:str) -> None
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
47 self.__registerInternalHandlers()
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 self.__connection = None
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
51 self.__selector = selectors.DefaultSelector()
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
52
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
53 # create and register the 'Debugger' request handler
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
54 self.__debuggerRequestHandler = EricServerDebuggerRequestHandler(self)
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
55 self.registerRequestHandler(
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
56 EricRequestCategory.Debugger,
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
57 self.__debuggerRequestHandler.handleRequest,
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
58 )
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
59
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
60 # create and register the 'File System' request handler
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
61 self.__fileSystemRequestHandler = EricServerFileSystemRequestHandler(self)
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
62 self.registerRequestHandler(
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
63 EricRequestCategory.FileSystem,
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
64 self.__fileSystemRequestHandler.handleRequest,
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
65 )
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
66
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
67 # TODO: 'Project' handler not implemented yet
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
68 # TODO: implement an 'EditorConfig' handler (?)
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
69
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 address = ("", port)
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 if socket.has_dualstack_ipv6() and useIPv6:
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 self.__socket = socket.create_server(
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 address, family=socket.AF_INET6, dualstack_ipv6=True
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 )
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75 else:
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
76 self.__socket = socket.create_server(address, family=socket.AF_INET)
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
77
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
78 def getSelector(self):
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
79 """
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
80 Public method to get a reference to the selector object.
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
81 """
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
82 return self.__selector
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 #######################################################################
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 ## Methods for receiving requests and sending the results.
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 #######################################################################
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 def sendJson(self, category, reply, params, reqestUuid=""):
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 """
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 Public method to send a single refactoring command to the server.
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 @param category service category
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 @type EricRequestCategory
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 @param reply reply name to be sent
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 @type str
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 @param params dictionary of named parameters for the request
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 @type dict
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 @param reqestUuid UUID of the associated request as sent by the eric IDE
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 (defaults to "", i.e. no UUID received)
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 @type str
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 """
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
102 if self.__connection is not None:
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
103 commandDict = {
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
104 "jsonrpc": "2.0",
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
105 "category": category,
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
106 "reply": reply,
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
107 "params": params,
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
108 "uuid": reqestUuid,
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
109 }
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
110 self.sendJsonCommand(commandDict, self.__connection)
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
111
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
112 def sendJsonCommand(self, jsonCommand, sock):
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
113 """
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
114 Public method to send a JSON encoded command/response via a given socket.
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
115
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
116 @param jsonCommand dictionary containing the command data or a JSON encoded
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
117 command string
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
118 @type dict or str
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
119 @param sock reference to the socket to send the data to
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
120 @type socket.socket
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
121 """
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
122 if isinstance(jsonCommand, dict):
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
123 jsonCommand = json.dumps(jsonCommand)
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
124 data = jsonCommand.encode("utf8", "backslashreplace")
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125 header = struct.pack(b"!II", len(data), zlib.adler32(data) & 0xFFFFFFFF)
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
126 sock.sendall(header)
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
127 sock.sendall(data)
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
129 def __receiveBytes(self, length, sock):
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 """
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 Private method to receive the given length of bytes.
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133 @param length bytes to receive
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134 @type int
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
135 @param sock reference to the socket to receive the data from
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
136 @type socket.socket
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137 @return received bytes or None if connection closed
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138 @rtype bytes
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 """
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 data = bytearray()
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141 while len(data) < length:
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
142 try:
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
143 newData = sock.recv(length - len(data))
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
144 if not newData:
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
145 print(str(newData))
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
146 return None
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
147
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
148 data += newData
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
149 except OSError as err:
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
150 if err.errno != 11:
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
151 data = None # in case some data was received already
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
152 break
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
153 return data
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
154
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
155 def receiveJsonCommand(self, sock):
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
156 """
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
157 Public method to receive a JSON encoded command and data.
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
158
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
159 @param sock reference to the socket to receive the data from
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
160 @type socket.socket
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
161 @return dictionary containing the JSON command data or None to signal
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
162 an issue while receiving data
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
163 @rtype dict
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
164 """
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
165 if self.isSocketClosed(sock):
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
166 return None
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
167
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
168 header = self.__receiveBytes(struct.calcsize(b"!II"), sock)
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
169 if not header:
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
170 return {}
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
171
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
172 length, datahash = struct.unpack(b"!II", header)
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
173
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
174 length = int(length)
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
175 data = self.__receiveBytes(length, sock)
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
176 if data is None:
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
177 return None
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
178
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
179 if not data or zlib.adler32(data) & 0xFFFFFFFF != datahash:
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
180 self.sendJson(
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
181 category=EricRequestCategory.Error,
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
182 reply="EricServerChecksumException",
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
183 params={
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
184 "ExceptionType": "ProtocolChecksumError",
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
185 "ExceptionValue": "The checksum of the data does not match.",
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
186 "ProtocolData": data.decode("utf8", "backslashreplace"),
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
187 },
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
188 )
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
189 return {}
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
190
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
191 jsonStr = data.decode("utf8", "backslashreplace")
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
192 try:
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
193 return json.loads(jsonStr.strip())
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
194 except (TypeError, ValueError) as err:
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
195 self.sendJson(
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
196 category=EricRequestCategory.Error,
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
197 reply="EricServerException",
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
198 params={
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
199 "ExceptionType": "ProtocolError",
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
200 "ExceptionValue": str(err),
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
201 "ProtocolData": jsonStr.strip(),
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
202 },
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
203 )
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
204 return {}
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
205
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
206 def __receiveJson(self):
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
207 """
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
208 Private method to receive a JSON encoded command and data from the
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209 server.
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
210
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
211 @return tuple containing the received service category, the command,
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
212 a dictionary containing the associated data and the UUID of the
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
213 request
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214 @rtype tuple of (int, str, dict, str)
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
215 """
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
216 requestDict = self.receiveJsonCommand(self.__connection)
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
217
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
218 if not requestDict:
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
219 return EricRequestCategory.Error, None, None, None
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
220
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
221 category = requestDict["category"]
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
222 request = requestDict["request"]
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
223 params = requestDict["params"]
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
224 reqestUuid = requestDict["uuid"]
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
225
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
226 return category, request, params, reqestUuid
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
227
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
228 def isSocketClosed(self, sock):
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
229 """
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
230 Public method to check, if a given socket is closed.
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
231
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
232 @param sock reference to the socket to be checked
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
233 @type socket.socket
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
234 @return flag indicating a closed state
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
235 @rtype bool
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
236 """
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
237 try:
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
238 # this will try to read bytes without removing them from buffer (peek only)
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
239 data = sock.recv(16, socket.MSG_PEEK)
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
240 if len(data) == 0:
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
241 return True
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
242 except BlockingIOError:
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
243 return False # socket is open and reading from it would block
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
244 except ConnectionError:
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
245 return True # socket was closed for some other reason
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
246 except Exception:
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
247 return False
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
248 return False
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
249
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
250 #######################################################################
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
251 ## Methods for the server main loop.
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
252 #######################################################################
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
253
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
254 def __shutdown(self):
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
255 """
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
256 Private method to shut down the server.
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
257 """
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
258 self.__closeIdeConnection()
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
259
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
260 print("Stop listening for 'eric-ide' connections.")
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
261 self.__socket.shutdown(socket.SHUT_RDWR)
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
262 self.__socket.close()
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
263
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
264 self.__selector.close()
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
265
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
266 def __acceptIdeConnection(self, sock):
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
267 """
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
268 Private method to accept the connection on the listening IDE server socket.
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
269
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
270 @param sock reference to the listening socket
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
271 @type socket.socket
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
272 """
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
273 self.__connection, address = sock.accept() # Should be ready to read
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
274 print(f"'eric-ide' connection from {address[0]}, port {address[1]}")
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
275 self.__connection.setblocking(False)
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
276 data = types.SimpleNamespace(
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
277 name="eric-ide", address=address, handler=self.__serviceIdeConnection
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
278 )
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
279 events = selectors.EVENT_READ
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
280 self.__selector.register(self.__connection, events, data=data)
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
281
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
282 def __closeIdeConnection(self):
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
283 """
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
284 Private method to close the connection to an eric-ide.
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
285 """
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
286 if self.__connection is not None:
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
287 print(
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
288 f"Closing 'eric-ide' connection to {self.__connection.getpeername()}."
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
289 )
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
290 self.__selector.unregister(self.__connection)
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
291 self.__connection.shutdown(socket.SHUT_RDWR)
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
292 self.__connection.close()
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
293 self.__connection = None
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
294
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
295 self.__debuggerRequestHandler.shutdownClients()
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
296
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
297 def __serviceIdeConnection(self, key):
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
298 """
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
299 Private method to service the eric-ide connection.
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
300
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
301 @param key reference to the SelectorKey object associated with the connection
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
302 to be serviced
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
303 @type selectors.SelectorKey
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
304 """
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
305 if key.data.name == "eric-ide":
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
306 category, request, params, reqestUuid = self.__receiveJson()
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
307 if category == EricRequestCategory.Error or request is None:
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
308 self.__closeIdeConnection()
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
309 return
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
310
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
311 if category == EricRequestCategory.Server:
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
312 if request.lower() == "shutdown":
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
313 self.__shouldStop = True
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
314 return
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
315
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
316 self.__handleRequest(category, request, params, reqestUuid)
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
317
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
318 def run(self):
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
319 """
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
320 Public method implementing the remote server main loop.
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
321
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
322 Exiting the inner loop, that receives and dispatches the requests, will
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
323 cause the server to stop and exit. The main loop handles these requests.
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
324 <ul>
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
325 <li>exit - exit the handler loop and wait for the next connection</li>
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
326 <li>shutdown - exit the handler loop and perform a clean shutdown</li>
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
327 </ul>
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
328
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
329 @return flag indicating a clean shutdown
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
330 @rtype bool
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
331 """
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
332 cleanExit = True
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
333 self.__shouldStop = False
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
334
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
335 # listen on the server socket for new connections
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
336 self.__socket.listen(1)
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
337 self.__socket.setblocking(False)
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
338 print(f"Listening for 'eric-ide' connections on {self.__socket.getsockname()}")
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
339 data = types.SimpleNamespace(
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
340 name="server", acceptHandler=self.__acceptIdeConnection
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
341 )
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
342 self.__selector.register(self.__socket, selectors.EVENT_READ, data=data)
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
343
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
344 self.__debuggerRequestHandler.initServerSocket()
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
345
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
346 while True:
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
347 try:
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
348 events = self.__selector.select(timeout=None)
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
349 for key, mask in events:
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
350 if key.data.name == "server":
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
351 # it is an event for a server socket
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
352 key.data.acceptHandler(key.fileobj)
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
353 else:
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
354 key.data.handler(key)
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
355
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
356 except KeyboardInterrupt:
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
357 # intercept user pressing Ctrl+C
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
358 self.__shouldStop = True
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
359
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
360 except Exception:
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
361 exctype, excval, exctb = sys.exc_info()
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
362 tbinfofile = io.StringIO()
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
363 traceback.print_tb(exctb, None, tbinfofile)
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
364 tbinfofile.seek(0)
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
365 tbinfo = tbinfofile.read()
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
366
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
367 print(f"{str(exctype)} / {str(excval)} / {tbinfo}")
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
368
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
369 self.__shouldStop = True
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
370 cleanExit = False
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
371
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
372 if self.__shouldStop:
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
373 # exit the outer loop and shut down the server
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
374 self.__shutdown()
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
375 break
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
376
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
377 return cleanExit
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
378
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
379 #######################################################################
10539
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
380 ## Methods for registering and unregistering handlers.
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
381 #######################################################################
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
382
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
383 def registerRequestHandler(self, requestCategory, handler):
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
384 """
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
385 Public method to register a request handler method for the given request
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
386 category.
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
387
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
388 @param requestCategory request category to be registered
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
389 @type EricRequestCategory or int (>= EricRequestCategory.UserCategory)
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
390 @param handler reference to the handler method. This handler must accept
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
391 the parameters 'request', 'params', and 'requestUuid'
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
392 @type function(request:str, params:dict, requestUuid:str)
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
393 @exception ValueError raised to signal a request category collision
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
394 """
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
395 if requestCategory in self.__requestCategoryHandlerRegistry:
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
396 raise ValueError(f"Request category '{requestCategory} already registered.")
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
397
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
398 self.__requestCategoryHandlerRegistry[requestCategory] = handler
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
399
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
400 def unregisterRequestHandler(self, requestCategory, ignoreError=False):
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
401 """
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
402 Public method to unregister a handler for the given request category.
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
403
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
404 Note: This method will raise a KeyError exception in case the request
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
405 category has not been registered and ignoreError is False (the default).
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
406
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
407 @param requestCategory request category to be unregistered
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
408 @type EricRequestCategory or int (>= EricRequestCategory.UserCategory)
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
409 @param ignoreError flag indicating to ignore errors (defaults to False)
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
410 @type bool (optional)
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
411 """
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
412 try:
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
413 del self.__requestCategoryHandlerRegistry[requestCategory]
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
414 except KeyError:
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
415 if not ignoreError:
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
416 raise
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
417
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
418 def __registerInternalHandlers(self):
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
419 """
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
420 Private method to register request handler categories of this class.
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
421 """
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
422 self.registerRequestHandler(EricRequestCategory.Echo, self.__handleEchoRequest)
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
423 self.registerRequestHandler(
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
424 EricRequestCategory.Server, self.__handleServerRequest
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
425 )
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
426 self.registerRequestHandler(EricRequestCategory.Error, None)
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
427 # Register a None handler to indicate we are not expecting a request of the
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
428 # 'Error' category.
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
429
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
430 #######################################################################
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
431 ## Request handler methods.
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
432 #######################################################################
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
433
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
434 def __handleRequest(self, category, request, params, reqestUuid):
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
435 """
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
436 Private method handling or dispatching the received requests.
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
437
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
438 @param category category of the request
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
439 @type EricRequestCategory
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
440 @param request request name
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
441 @type str
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
442 @param params request parameters
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
443 @type dict
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
444 @param reqestUuid UUID of the associated request as sent by the eric IDE
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
445 @type str
10539
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
446 @exception ValueError raised to indicate an invalid or unsupported request
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
447 handler catehory
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
448 """
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
449 try:
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
450 handler = self.__requestCategoryHandlerRegistry[category]
10555
08e853c0c77b Implemented an eric-ide Server Shell.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10547
diff changeset
451 handler(request=request, params=params, reqestUuid=reqestUuid)
10539
4274f189ff78 eric-ide Server
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10531
diff changeset
452 except KeyError:
10531
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
453 self.sendJson(
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
454 category=EricRequestCategory.Error,
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
455 reply="UnsupportedServiceCategory",
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
456 params={"Category": category},
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
457 )
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
458
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
459 def __handleEchoRequest(self, request, params, reqestUuid):
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
460 """
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
461 Private method to handle an 'Echo' request.
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
462
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
463 @param request request name
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
464 @type str
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
465 @param params request parameters
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
466 @type dict
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
467 @param reqestUuid UUID of the associated request as sent by the eric IDE
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
468 (defaults to "", i.e. no UUID received)
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
469 @type str
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
470 """
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
471 self.sendJson(
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
472 category=EricRequestCategory.Echo,
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
473 reply="Echo",
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
474 params=params,
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
475 reqestUuid=reqestUuid,
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
476 )
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
477
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
478 def __handleServerRequest(self, request, params, reqestUuid):
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
479 """
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
480 Private method to handle a 'Server' request.
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
481
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
482 @param request request name
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
483 @type str
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
484 @param params request parameters
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
485 @type dict
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
486 @param reqestUuid UUID of the associated request as sent by the eric IDE
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
487 (defaults to "", i.e. no UUID received)
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
488 @type str
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
489 """
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
490 # 'Exit' and 'Shutdown' are handled in the 'run()' method.
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
491
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
492 if request.lower() == "versions":
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
493 self.sendJson(
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
494 category=EricRequestCategory.Server,
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
495 reply="Versions",
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
496 params={
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
497 "python": sys.version.split()[0],
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
498 "py_bitsize": "64-Bit" if sys.maxsize > 2**32 else "32-Bit",
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
499 "version": Version,
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
500 },
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
501 reqestUuid=reqestUuid,
3308e8349e4c Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
502 )

eric ide

mercurial