Exemplo n.º 1
0
    def make_response(self):
        response = Response(ResponseCode.NOT_FOUND)
        real_path = os.path.normpath(self.root +
                                     self.request.path)  # нормализую путь

        # проверка на выход из root
        if (os.path.commonpath([
                real_path, self.root
        ])) != self.root:  # commonpath - вернет общий путь
            return response

        if os.path.isfile(os.path.join(real_path, DEFAULT_PAGE)):
            real_path = os.path.join(real_path, DEFAULT_PAGE)
        elif os.path.exists(real_path):  # директория||файл существует
            response.code = ResponseCode.FORBIDDEN
        else:  # директория||файл не существует
            return response

        try:
            file = open(real_path, 'rb')
            content = file.read()
            if self.request.method == 'GET':
                response.content = content
                response.content_type = self.get_content_type(real_path)
            response.content_length = len(content)
            response.code = ResponseCode.OK
            file.close()
        except IOError as e:
            print("Error in path: " + real_path)  # 403 (см. http_const)

        return response
Exemplo n.º 2
0
    def make_response(self):
        response = Response(ResponseCode.NOT_FOUND)
        real_path = os.path.normpath(self.root + self.request.path)       

        
        if (os.path.commonpath([real_path, self.root])) != self.root:     
            return response

        if os.path.isfile(os.path.join(real_path, DEFAULT_PAGE)):
            real_path = os.path.join(real_path, DEFAULT_PAGE)
        elif os.path.exists(real_path):                                         
            response.code = ResponseCode.FORBIDDEN
        else:                                                                   
            return response

        try:
            file = open(real_path, 'rb')
            content = file.read()
            if self.request.method == 'GET':
                response.content = content
                response.content_type = self.get_content_type(real_path)
            response.content_length = len(content)
            response.code = ResponseCode.OK
            file.close()
        except IOError as e:
            print("Error in path: " + real_path)                                       

        return response
Exemplo n.º 3
0
def url_open(url, headers=_DEFAULT_HEADERS, connect_timeout=5, read_timeout=4, 
        full_timeout=10, logger=logging.getLogger(__name__)):
    """ open url
    """
    resp = Response()

    t = urlparse.urlparse(url)
    path = t.path or '/'
    if len(t.netloc.split(':')) == 2:
        host, port = t.netloc.split(':')
    else:
        host, port = t.netloc, 80

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(connect_timeout)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    try:
        s.connect((host, port))
        s.send("GET %s HTTP/1.1\r\n" % path)
        s.send("Host:%s\r\n" % host)
        for k,v in headers:
            s.send("%s:%s\r\n" % (k, v))
        s.send('\r\n')
    except socket.timeout as e:
        logger.exception('connection timeout: [%s]' % str(e))
        resp.status_code = Response.CONNECTION_TIMEOUT
        return resp
    except socket.error as e:
        logger.exception('socket error while send: [%s]' % str(e))
        resp.status_code = Response.SOCKET_ERROR
        return resp

    data = []
    begin = time.time()
    s.settimeout(read_timeout)
    while 1:
        if time.time() - begin > full_timeout:
            logger.exception('full timeout')
            resp.status_code = Response.FULL_TIMEOUT
            break
        try:
            msg = s.recv(4096)
            if len(msg) == 0:
                break
            data.append(msg)
        except socket.timeout as e:
            logger.exception('read timeout: [%s]' % str(e))
            resp.status_code = Response.READ_TIMEOUT
            break
        except socket.error as e:
            logger.exception('socket error while read: [%s]' % str(e))
            resp.status_code = Response.SOCKET_ERROR
            break
    try:
        s.shutdown(1)
        s.close()
    except socket.error as e:
        logger.exception('socket error while close: [%s]' % str(e))

    resp.content = ''.join(data)
    if resp.status_code != 200:
        return resp
    
    try:
        http_resp = HTTPResponse(_FakeSocket(resp.content))
        http_resp.begin()
    except Exception as e:
        logger.exception('read http response error: [%s]' % str(e))
        resp.status_code = Response.HTTP_RESPONSE_ERROR
        return resp
    
    resp.status_code = http_resp.status
    resp.content = http_resp.read(len(resp.content))
    location = http_resp.getheader('location', '')
    if location and str(http_resp.status)[0] == '3':
        redirect_url = urlparse.urljoin(url, location)
        logger.info('redirect to: [%s]' % redirect_url)
        new_full_timeout = full_timeout - (time.time() - begin)
        return url_open(url=redirect_url, headers=headers, 
                connect_timeout=connect_timeout, read_timeout=read_timeout, 
                full_timeout=new_full_timeout, logger=logger)
    return resp