src/eric7/RemoteServer/EricServer.py

Mon, 29 Jan 2024 19:50:44 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Mon, 29 Jan 2024 19:50:44 +0100
branch
server
changeset 10531
3308e8349e4c
child 10539
4274f189ff78
permissions
-rw-r--r--

Started implementing an eric-ide server for remote development (e.g. on a different host or in a Docker container).

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
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
12 import select
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
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
17 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
18
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 from eric7.UI.Info import 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
20
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
21 from .EricRequestCategory import 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
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
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
24 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
25 """
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 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
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
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 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
30 """
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 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
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 @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
34 @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
35 @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
36 @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
37 """
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 self.__requestCategoryHandlerRegistry = {
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 # Dictionary containing the defined and registered request 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
40 # handlers. The key is the request category and the value is the respective
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 # handler method. This method must have the signature:
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
42 # handler(request:str, params:dict, reqestUuid:str) -> 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
43 EricRequestCategory.Debugger: None, # TODO: not implemented yet
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
44 EricRequestCategory.Echo: self.__handleEchoRequest,
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
45 EricRequestCategory.FileSystem: None, # TODO: not implemented yet
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
46 EricRequestCategory.Project: None, # TODO: not implemented yet
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
47 EricRequestCategory.Server: self.__handleServerRequest
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
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 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
51
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
52 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
53 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
54 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
55 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
56 )
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
57 else:
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
58 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
59 address, family=socket.AF_INET
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
60 )
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
61
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
62 #######################################################################
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
63 ## 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
64 #######################################################################
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
65
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
66 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
67 """
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
68 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
69
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 @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
71 @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
72 @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
73 @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
74 @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
75 @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
76 @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
77 (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
78 @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
79 """
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
80 commandDict = {
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
81 "jsonrpc": "2.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
82 "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
83 "reply": reply,
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 "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
85 "uuid": 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
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 data = json.dumps(commandDict).encode("utf8", "backslashreplace")
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 header = struct.pack(b"!II", len(data), zlib.adler32(data) & 0xFFFFFFFF)
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 self.__connection.sendall(header)
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 self.__connection.sendall(data)
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 def __receiveBytes(self, length):
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 """
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 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
95
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 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
97 @type int
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 @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
99 @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
100 """
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 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
102 while len(data) < length:
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
103 newData = self.__connection.recv(length - len(data))
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
104 if not newData:
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
105 return 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
106
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
107 data += newData
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
108 return data
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
109
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
110 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
111 """
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
112 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
113 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
114
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
115 @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
116 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
117 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
118 @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
119 """
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
120 # step 1: receive the data
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
121 header = self.__receiveBytes(struct.calcsize(b"!II"))
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
122 if not header:
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
123 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
124
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 length, datahash = struct.unpack(b"!II", header)
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
126
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
127 length = int(length)
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 data = self.__receiveBytes(length)
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
129 if not data or zlib.adler32(data) & 0xFFFFFFFF != datahash:
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 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
131 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
132 reply="ClientChecksumException",
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 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
134 "ExceptionType": "ProtocolChecksumError",
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
135 "ExceptionValue": "The checksum of the data does not match.",
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
136 "ProtocolData": data.decode("utf8", "backslashreplace"),
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 },
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 )
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 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
140
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 # step 2: decode and convert the data
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
142 jsonString = data.decode("utf8", "backslashreplace")
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
143 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
144 requestDict = json.loads(jsonString.strip())
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
145 except (TypeError, ValueError) as err:
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
146 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
147 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
148 reply="ClientException",
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
149 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
150 "ExceptionType": "ProtocolError",
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
151 "ExceptionValue": str(err),
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
152 "ProtocolData": jsonString.strip(),
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
153 },
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
154 )
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
155 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
156
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
157 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
158 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
159 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
160 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
161
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
162 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
163
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
164 #######################################################################
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
165 ## 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
166 #######################################################################
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
167
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
168 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
169 """
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
170 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
171 """
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
172 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
173 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
174
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
175 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
176 """
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
177 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
178
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
179 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
180 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
181 <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
182 <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
183 <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
184 </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
185
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
186 @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
187 @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
188 """
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
189 shutdown = 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
190 cleanExit = 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
191
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
192 # 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
193 self.__socket.listen(1)
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
194
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
195 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
196 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
197 # accept the next pending connection
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
198 print("Waiting for connection...")
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
199 self.__connection, address = self.__socket.accept()
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
200 print(f"Connection from {address[0]}, port {address[1]}")
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
201
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
202 selectErrors = 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
203 while selectErrors <= 10: # selected arbitrarily
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
204 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
205 rrdy, wrdy, xrdy = select.select([self.__connection], [], [])
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
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 # Just waiting for self.__connection. Therefore no check
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 # needed.
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 category, request, params, reqestUuid = self.__receiveJson()
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 if category == EricRequestCategory.Error or request is 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
211 selectErrors += 1
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 elif 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
213 if request.lower() == "exit":
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 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
215 elif request.lower() == "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
216 shutdown = 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
217 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
218 else:
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 self.__handleRequest(
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 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
221 )
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 else:
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 self.__handleRequest(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
224
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 # reset select errors
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 selectErrors = 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
227
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
228 except (select.error, socket.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
229 selectErrors += 1
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
230
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
231 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
232 # intercept user pressing Ctrl+C
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
233 shutdown = 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
234
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
235 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
236 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
237 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
238 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
239 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
240 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
241
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
242 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
243
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
244 shutdown = 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
245 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
246
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
247 if self.__connection is not 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
248 self.__connection.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
249 self.__connection.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
250 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
251
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 if 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
253 # 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
254 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
255 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
256
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 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
258
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
259 #######################################################################
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
260 ## 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
261 #######################################################################
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
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 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
264 """
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
265 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
266
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
267 @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
268 @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
269 @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
270 @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
271 @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
272 @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
273 @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
274 (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
275 @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
276 """
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
277 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
278 handler = self.__requestCategoryHandlerRegistry[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
279 if handler is 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
280 raise ValueError("invalid handler function")
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
281 handler(request=request, params=params, 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
282 except (KeyError, ValueError):
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
283 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
284 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
285 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
286 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
287 )
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
288
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
289 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
290 """
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
291 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
292
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
293 @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
294 @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
295 @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
296 @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
297 @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
298 (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
299 @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
300 """
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
301 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
302 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
303 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
304 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
305 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
306 )
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
307
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
308 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
309 """
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
310 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
311
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
312 @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
313 @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
314 @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
315 @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
316 @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
317 (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
318 @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
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 # '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
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 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
323 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
324 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
325 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
326 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
327 "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
328 "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
329 "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
330 },
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 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
332 )

eric ide

mercurial