예제 #1
0
파일: tcprelay.py 프로젝트: turn1tup/Serxy
    def handle_event(self, sock, fd, event):
        # handle events and dispatch to handlers

        # if sock:
        #     logging.log(shell.VERBOSE_LEVEL, 'fd %d %s', fd,
        #                 eventloop.EVENT_NAMES.get(event, event))
        if sock == self._server_socket:
            if event & eventloop.POLL_ERR:
                # TODO
                raise Exception('server_socket error')
            try:
                logging.debug('accept')
                conn = self._server_socket.accept()
                TCPRelayHandler(self, self._fd_to_handlers, self._eventloop,
                                conn[0], self._config, self._dns_resolver,
                                self._is_local)
            except (OSError, IOError) as e:
                error_no = eventloop.errno_from_exception(e)
                if error_no in (errno.EAGAIN, errno.EINPROGRESS,
                                errno.EWOULDBLOCK):
                    return
                else:
                    if self._config['verbose']:
                        traceback.print_exc()
        else:
            if sock:
                handler = self._fd_to_handlers.get(fd, None)
                if handler:
                    handler.handle_event(sock, event)
            else:
                logging.warn('poll removed fd')
예제 #2
0
파일: tcprelay.py 프로젝트: turn1tup/Serxy
    def _on_remote_read(self):
        # handle all remote read events
        data = None
        try:
            data = self._remote_sock.recv(BUF_SIZE)

        except (OSError, IOError) as e:
            if eventloop.errno_from_exception(e) in \
                    (errno.ETIMEDOUT, errno.EAGAIN, errno.EWOULDBLOCK):
                return
        if not data:
            self.destroy()
            return
        forbidden, type = common.forbidden_or_not(self._config,
                                                  self.r_dst_host, data)
        if forbidden:
            logging.info('Forbidden event -- proxy:{0}-- website:{1}'.format(
                self._remote_sock.getpeername(), self.r_dst_host))
            self.destroy(type='forbidden')
            return

        self._update_activity(len(data))
        try:
            self._write_to_sock(data, self._local_sock)
            self._data_send = True
        except Exception as e:
            if self._config['verbose']:
                traceback.print_exc()
            # TODO use logging when debug completed
            self.destroy()
예제 #3
0
파일: tcprelay.py 프로젝트: turn1tup/Serxy
    def _handle_dns_resolved(self, result, error):
        if error:
            self._log_error(error)
            self.destroy()
            return
        if result:
            ip = result[1]
            if ip:

                try:
                    self._stage = STAGE_CONNECTING
                    remote_addr = ip
                    remote_port = self._remote_address[1]

                    remote_sock = self._create_remote_socket(
                        remote_addr, remote_port)
                    try:
                        remote_sock.connect((remote_addr, remote_port))
                    except (OSError, IOError) as e:
                        if eventloop.errno_from_exception(e) == \
                                errno.EINPROGRESS:
                            pass
                    self._loop.add(remote_sock,
                                   eventloop.POLL_ERR | eventloop.POLL_OUT,
                                   self._server)
                    self._stage = STAGE_CONNECTING
                    self._update_stream(STREAM_UP, WAIT_STATUS_READWRITING)
                    self._update_stream(STREAM_DOWN, WAIT_STATUS_READING)
                    return
                except Exception as e:
                    if self._config['verbose']:
                        traceback.print_exc()
        self.destroy()
예제 #4
0
파일: tcprelay.py 프로젝트: turn1tup/Serxy
 def _on_local_read(self):
     #
     #logging.info('_on_local_read')
     # handle all local read events and dispatch them to methods for
     # each stage
     if not self._local_sock:
         return
     is_local = self._is_local
     data = None
     try:
         data = self._local_sock.recv(BUF_SIZE)
     except (OSError, IOError) as e:
         if eventloop.errno_from_exception(e) in \
                 (errno.ETIMEDOUT, errno.EAGAIN, errno.EWOULDBLOCK):
             return
     if not data:
         self.destroy()
         return
     self._update_activity(len(data))
     if not data:
         return
     if self._stage == STAGE_STREAM:
         self._write_to_sock(data, self._remote_sock)
         return
     # elif is_local and self._stage == STAGE_INIT:
     #     # TODO check auth method
     #     self._write_to_sock(b'\x05\00', self._local_sock)
     #     self._stage = STAGE_ADDR
     #     return
     elif self._stage == STAGE_CONNECTING:
         self._handle_stage_connecting(data)
     elif not is_local and self._stage == STAGE_INIT:
         self._handle_stage_addr(data)
예제 #5
0
파일: tcprelay.py 프로젝트: turn1tup/Serxy
 def _write_to_sock(self, data, sock):
     # write data to sock
     # if only some of the data are written, put remaining in the buffer
     # and update the stream to wait for writing
     if not data or not sock:
         return False
     uncomplete = False
     try:
         l = len(data)
         s = sock.send(data)
         if s < l:
             data = data[s:]
             uncomplete = True
     except (OSError, IOError) as e:
         error_no = eventloop.errno_from_exception(e)
         if error_no in (errno.EAGAIN, errno.EINPROGRESS,
                         errno.EWOULDBLOCK):
             uncomplete = True
         else:
             if self._config['verbose']:
                 traceback.print_exc()
             self.destroy()
             return False
     if uncomplete:
         if sock == self._local_sock:
             self._data_to_write_to_local.append(data)
             self._update_stream(STREAM_DOWN, WAIT_STATUS_WRITING)
         elif sock == self._remote_sock:
             self._data_to_write_to_remote.append(data)
             self._update_stream(STREAM_UP, WAIT_STATUS_WRITING)
         else:
             logging.error('write_all_to_sock:unknown socket')
     else:
         if sock == self._local_sock:
             self._update_stream(STREAM_DOWN, WAIT_STATUS_READING)
         elif sock == self._remote_sock:
             self._update_stream(STREAM_UP, WAIT_STATUS_READING)
         else:
             logging.error('write_all_to_sock:unknown socket')
     return True