Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

# (c) 2017, Peter Sprygada <psprygad@redhat.com> 

# (c) 2017 Ansible Project 

# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) 

from __future__ import (absolute_import, division, print_function) 

__metaclass__ = type 

 

import json 

import traceback 

 

from ansible.module_utils._text import to_text 

from ansible.module_utils.six import binary_type 

 

 

try: 

from __main__ import display 

except ImportError: 

from ansible.utils.display import Display 

display = Display() 

 

 

class JsonRpcServer(object): 

 

_objects = set() 

 

def handle_request(self, request): 

request = json.loads(to_text(request, errors='surrogate_then_replace')) 

 

method = request.get('method') 

 

30 ↛ 31line 30 didn't jump to line 31, because the condition on line 30 was never true if method.startswith('rpc.') or method.startswith('_'): 

error = self.invalid_request() 

return json.dumps(error) 

 

params = request.get('params') 

setattr(self, '_identifier', request.get('id')) 

 

args = [] 

kwargs = {} 

 

if all((params, isinstance(params, list))): 

args = params 

elif all((params, isinstance(params, dict))): 

kwargs = params 

 

rpc_method = None 

46 ↛ 51line 46 didn't jump to line 51, because the loop on line 46 didn't complete for obj in self._objects: 

rpc_method = getattr(obj, method, None) 

48 ↛ 46line 48 didn't jump to line 46, because the condition on line 48 was never false if rpc_method: 

break 

 

51 ↛ 52line 51 didn't jump to line 52, because the condition on line 51 was never true if not rpc_method: 

error = self.method_not_found() 

response = json.dumps(error) 

else: 

try: 

result = rpc_method(*args, **kwargs) 

except Exception as exc: 

display.vvv(traceback.format_exc()) 

error = self.internal_error(data=to_text(exc, errors='surrogate_then_replace')) 

response = json.dumps(error) 

else: 

62 ↛ 63line 62 didn't jump to line 63, because the condition on line 62 was never true if isinstance(result, dict) and 'jsonrpc' in result: 

response = result 

else: 

response = self.response(result) 

 

response = json.dumps(response) 

 

delattr(self, '_identifier') 

 

return response 

 

def register(self, obj): 

self._objects.add(obj) 

 

def header(self): 

return {'jsonrpc': '2.0', 'id': self._identifier} 

 

def response(self, result=None): 

response = self.header() 

if isinstance(result, binary_type): 

result = to_text(result) 

response['result'] = result 

return response 

 

def error(self, code, message, data=None): 

response = self.header() 

error = {'code': code, 'message': message} 

if data: 

error['data'] = data 

response['error'] = error 

return response 

 

# json-rpc standard errors (-32768 .. -32000) 

def parse_error(self, data=None): 

return self.error(-32700, 'Parse error', data) 

 

def method_not_found(self, data=None): 

return self.error(-32601, 'Method not found', data) 

 

def invalid_request(self, data=None): 

return self.error(-32600, 'Invalid request', data) 

 

def invalid_params(self, data=None): 

return self.error(-32602, 'Invalid params', data) 

 

def internal_error(self, data=None): 

return self.error(-32603, 'Internal error', data)