source: ogClient-Git/src/ogClient.py @ d5dca0f

Last change on this file since d5dca0f was 3c450b0, checked in by Alvaro Neira Ayuso <alvaroneay@…>, 5 years ago

Fix ogClient socket.error typo

  • Property mode set to 100644
File size: 2.8 KB
Line 
1import errno
2import select
3import socket
4import time
5import email
6from io import StringIO
7
8from src.HTTPParser import *
9from src.ogRest import *
10from enum import Enum
11
12class State(Enum):
13        CONNECTING = 0
14        RECEIVING = 1
15        FORCE_DISCONNECTED = 2
16
17class ogClient:
18        def __init__(self, ip, port):
19                self.ip = ip
20                self.port = port
21                self.ogrest = ogRest()
22
23        def get_socket(self):
24                return self.sock
25
26        def get_state(self):
27                return self.state
28
29        def connect(self):
30                print ('connecting')
31                self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
32                self.sock.setblocking(0)
33                self.state = State.CONNECTING
34                self.data = ""
35                self.trailer = False
36                self.content_len = 0
37
38                try:
39                        self.sock.connect((self.ip, self.port))
40                except socket.error as err:
41                        if err.errno == errno.EINPROGRESS:
42                                return
43                        elif err.errno == errno.ECONNREFUSED:
44                                return
45
46                        print ('Error connect ' + str(err))
47
48        def send(self, msg):
49                self.sock.send(bytes(msg, 'utf-8'))
50                return len(msg)
51
52        def connect2(self):
53                try:
54                        self.sock.connect((self.ip, self.port))
55                except socket.error as err:
56                        if err.errno == errno.EISCONN:
57                                print ('connected')
58                                self.state = State.RECEIVING
59                        else:
60                                print ('connection refused, retrying...')
61                                self.state = State.CONNECTING
62                                self.sock.close()
63                                self.connect()
64
65        def receive(self):
66                try:
67                        data = self.sock.recv(1024).decode('utf-8')
68                except socket.error as err:
69                        data = ''
70                        print ('Error3 ' + str(err))
71
72                if len(data) == 0:
73                        self.state = State.CONNECTING
74                        self.sock.close()
75                        self.connect()
76
77                self.data = self.data + data
78                httpparser = HTTPParser()
79
80                if not self.trailer:
81                        if self.data.find("\r\n") > 0:
82                                # https://stackoverflow.com/questions/4685217/parse-raw-http-headers
83                                request_line, headers_alone = self.data.split('\n', 1)
84                                headers = email.message_from_file(StringIO(headers_alone))
85
86                                if 'content-length' in headers.keys():
87                                        self.content_len = int(headers['content-length'])
88
89                                self.trailer = True
90
91                if self.trailer and len(self.data) >= self.content_len:
92                        httpparser.parser(self.data)
93                        self.ogrest.processOperation(httpparser, self)
94
95                        # Cleanup state information from request
96                        self.data = ""
97                        self.content_len = 0
98                        self.trailer = False
99
100        def disconnect(self):
101                self.state = State.FORCE_DISCONNECTED
102                self.sock.close()
103
104        def run(self):
105                while 1:
106                        sock = self.get_socket()
107                        state = self.get_state()
108
109                        if state == State.CONNECTING:
110                                readset = [ sock ]
111                                writeset = [ sock ]
112                        elif state == State.FORCE_DISCONNECTED:
113                                return 0
114                        else:
115                                readset = [ sock ]
116                                writeset = [ ]
117
118                        readable, writable, exception = select.select(readset, writeset, [ ])
119                        if state == State.CONNECTING and sock in writable:
120                                self.connect2()
121                        elif state == State.RECEIVING and sock in readable:
122                                self.receive()
123                        else:
124                                print ('bad state' + str(state))
Note: See TracBrowser for help on using the repository browser.