示例#1
0
    def test_cdn_enable_container(self):
        def put_sos(url, token, parsed, conn, cont):
            conn.request(
                'PUT', parsed.path + '/%s' % cont, '',
                self._db_headers({
                    'X-Auth-Token': token,
                    'X-TTL': 123456
                }))
            return check_response(conn)

        def head_sos(url, token, parsed, conn, cont):
            conn.request('HEAD', parsed.path + '/%s' % cont, '',
                         self._db_headers({'X-Auth-Token': token}))
            return check_response(conn)

        cont = uuid4().hex
        self.conts_to_delete.append(cont)
        resp = retry(put_sos, cont)
        resp.read()
        self.assertEquals(resp.status, 201)
        resp = retry(head_sos, cont)
        resp.read()
        self.assertEquals(resp.status, 204)
        self.assertEquals(self._get_header('x-ttl', resp.getheaders()),
                          '123456')
        self.assertEquals(self._get_header('x-cdn-enabled', resp.getheaders()),
                          'True')
示例#2
0
    def test_cdn_enable_container(self):

        def put_sos(url, token, parsed, conn, cont):
            conn.request('PUT',
                parsed.path + '/%s' % cont, '',
                self._db_headers({'X-Auth-Token': token, 'X-TTL': '123456'}))
            return check_response(conn)

        def head_sos(url, token, parsed, conn, cont):
            conn.request('HEAD',
                parsed.path + '/%s' % cont, '',
                self._db_headers({'X-Auth-Token': token}))
            return check_response(conn)

        cont = uuid4().hex
        self.conts_to_delete.append(cont)
        resp = retry(put_sos, cont)
        resp.read()
        self.assertEquals(resp.status, 201)
        resp = retry(head_sos, cont)
        resp.read()
        self.assertEquals(resp.status, 204)
        self.assertEquals(self._get_header('x-ttl', resp.getheaders()),
                          '123456')
        self.assertEquals(self._get_header('x-cdn-enabled', resp.getheaders()),
                          'True')
示例#3
0
    def tearDown(self):
        if skip:
            raise SkipTest

        def delete_sos(url, token, parsed, conn, cont):
            conn.request('DELETE',
                         quote('/'.join([parsed.path, cont])), '',
                         headers=self._db_headers({'X-Auth-Token': token}))
            return check_response(conn)

        def delete_swift(url, token, parsed, conn, cont):
            conn.request('DELETE',
                quote('/'.join([parsed.path, cont])), '',
                headers={'X-Auth-Token': token})
            return check_response(conn)

        def delete_swift_obj(url, token, parsed, conn, cont, obj):
            conn.request('DELETE',
                quote('/'.join([parsed.path, cont, obj])), '',
                headers={'X-Auth-Token': token})
            return check_response(conn)

        for cont, obj in self.swift_objs_to_delete:
            resp = retry(delete_swift_obj, cont, obj)
            resp.read()
            self.assertEquals(resp.status, 204)
        if self.swift_objs_to_delete:
            for cont in self.conts_to_delete:
                resp = retry(delete_swift, cont)
                resp.read()
                self.assertEquals(resp.status, 204)
        for cont in self.conts_to_delete:
            resp = retry(delete_sos, cont)
            resp.read()
            self.assertEquals(resp.status, 204)
示例#4
0
    def tearDown(self):
        if skip:
            raise SkipTest

        def delete_sos(url, token, parsed, conn, cont):
            conn.request('DELETE',
                         quote('/'.join([parsed.path, cont])), '',
                         headers=self._db_headers({'X-Auth-Token': token}))
            return check_response(conn)

        def delete_swift(url, token, parsed, conn, cont):
            conn.request('DELETE',
                quote('/'.join([parsed.path, cont])), '',
                headers={'X-Auth-Token': token})
            return check_response(conn)

        def delete_swift_obj(url, token, parsed, conn, cont, obj):
            conn.request('DELETE',
                quote('/'.join([parsed.path, cont, obj])), '',
                headers={'X-Auth-Token': token})
            return check_response(conn)

        for cont, obj in self.swift_objs_to_delete:
            resp = retry(delete_swift_obj, cont, obj)
            resp.read()
            self.assertEquals(resp.status, 204)
        if self.swift_objs_to_delete:
            for cont in self.conts_to_delete:
                resp = retry(delete_swift, cont)
                resp.read()
                self.assertEquals(resp.status, 204)
        for cont in self.conts_to_delete:
            resp = retry(delete_sos, cont)
            resp.read()
            self.assertEquals(resp.status, 204)
示例#5
0
    def test_registered_info(self):

        def get_info(url, token, parsed, conn):
            conn.request('GET', '/info')
            return check_response(conn)

        resp = retry(get_info)
        if resp.status // 100 == 4:
            # error fething /info. It may not be enabled on this cluster
            raise SkipTest()
        body = resp.read()
        info = json.loads(body)
        try:
            cdn_info = info['cdn_origin']
        except KeyError:
            self.fail('"cdn_origin" key not found in the /info response')
        for key in 'min_ttl max_ttl default_ttl max_cdn_file_size'.split():
            try:
                int(cdn_info[key])
            except ValueError:
                self.fail('%s not set to an integer' % key)
            except KeyError:
                self.fail('%s not set in the /info response' % key)
示例#6
0
    def test_origin_301(self):

        if not self.run_static_web_test_because_of_hack:
            raise SkipTest

        def put_swift(url, token, parsed, conn, cont):
            conn.request('PUT',
                quote(parsed.path + '/%s' % cont), '',
                {'X-Auth-Token': token,
                 'x-container-read': '.r:*',
                 'x-container-meta-web-index': 'index.html'})
            resp = check_response(conn)
            resp.read()
            conn.request('PUT',
                quote(parsed.path + '/%s/hat/index.html' % (cont)),
                'testbody', {'X-Auth-Token': token, 'Content-Length': '8'})
            resp = check_response(conn)
            resp.read()

        def put_sos(url, token, parsed, conn, cont):
            conn.request('PUT',
                quote(parsed.path + '/' + cont), '',
                self._db_headers({'X-Auth-Token': token,
                                  'X-TTL': str(60 * 60 * 24)}))
            resp = check_response(conn)
            resp.read()

        def head_sos(url, token, parsed, conn, cont):
            conn.request('HEAD',
                quote(parsed.path + '/' + cont), '',
                self._db_headers({'X-Auth-Token': token}))
            return check_response(conn)

        def origin_get(url, token, parsed, conn, cdn_url, obj, headers={}):
            cdn_parsed = urlparse(cdn_url)
            conn.request('GET',
                quote(cdn_parsed.path + '/' + obj), '',
                self._origin_headers(headers, cdn_url))
            return check_response(conn)

        cont = uuid4().hex
        self.conts_to_delete.append(cont)
        self.swift_objs_to_delete.append((cont, 'hat/index.html'))
        retry(put_sos, cont)
        retry(put_swift, cont)
        head_resp = retry(head_sos, cont)
        head_resp.read()
        self.assertEquals(head_resp.status, 204)
        for key in self.cdn_url_dict:
            if 'ssl' in key.lower() != self.use_ssl:
                continue
            cdn_url = self._get_header(key, head_resp.getheaders())
            resp = retry(origin_get, cdn_url=cdn_url, obj='hat/')
            body = resp.read()
            try:
                self.assertEquals(resp.status // 100, 2)
                self.assertEquals('testbody', body)
            except AssertionError:
                print "!!!! DO YOU HAVE STATIC WEB TURNED ON? (you should)!!!!"
                raise

            resp = retry(origin_get, cdn_url=cdn_url, obj='hat')
            body = resp.read()
            self.assertEquals(resp.status, 301)
            self.assertEquals(self._get_header('Location', resp.getheaders()),
                              '/hat/')
示例#7
0
    def test_db_listing(self):

        unitest = u'test \u2661'
        xml_test = 'xte<st \u2661'

        def put_sos(url, token, parsed, conn, cont, headers={}):
            headers.update({'X-Auth-Token': token, 'X-TTL': str(60 * 60 * 24)})
            conn.request('PUT', parsed.path + '/' + cont, '',
                self._db_headers(headers))
            return check_response(conn)

        def get_sos(url, token, parsed, conn, output_format, cdn_enabled=''):
            conn.request('GET', parsed.path + '?format=%s&enabled=%s' %
                (output_format, cdn_enabled), '',
                self._db_headers({'X-Auth-Token': token}))
            return check_response(conn)

        def get_sos_marker(url, token, parsed, conn, output_format,
                           cdn_enabled=''):
            conn.request('GET',
                parsed.path + '?marker=%s' % quote(unitest.encode('utf8')), '',
                self._db_headers({'X-Auth-Token': token}))
            return check_response(conn)

        def head_sos(url, token, parsed, conn, cont):
            conn.request('HEAD',
                parsed.path + '/' + cont, '',
                self._db_headers({'X-Auth-Token': token}))
            return check_response(conn)

        def delete_sos(url, token, parsed, conn, cont):
            conn.request('DELETE',
                parsed.path + '/' + cont, '',
                self._db_headers({'X-Auth-Token': token}))
            return check_response(conn)

        conts = [uuid4().hex for i in xrange(5)]
        conts.extend(['x' + uuid4().hex for i in xrange(5)])

        conts.append(unitest)
        conts.append(xml_test)
        for cont in conts:
            if isinstance(cont, unicode):
                cont = cont.encode('utf-8')
            self.conts_to_delete.append(cont)
            cont = quote(cont)
            if cont.startswith('x'):
                resp = retry(put_sos, cont, {'x-cdn-enabled': 'false'})
            else:
                resp = retry(put_sos, cont)
            resp.read()
            self.assertEquals(resp.status, 201)

        head_resp = retry(head_sos, quote(unitest.encode('utf8')))
        head_resp.read()
        unitest_cdn_url = head_resp.getheader('x-cdn-uri')

        resp = retry(get_sos, '')
        body = resp.read()
        for cont in conts:
            self.assert_(cont.encode('utf8') in body)
        resp = retry(get_sos, '', 'true')
        body = resp.read()
        for cont in conts[:-2]:
            self.assertEquals(not cont.startswith('x'), cont in body)
        resp = retry(get_sos, '', 'false')
        body = resp.read()
        for cont in conts:
            self.assertEquals(cont.startswith('x'), cont in body)

        resp = retry(get_sos, 'json')
        body = resp.read()
        data = json.loads(body)
        resp_conts = [d['name'] for d in data]
        self.assertEquals(set(resp_conts), set(conts))
        found_it = False
        for data_dict in data:
            if data_dict['name'] == unitest:
                self.assertEquals(data_dict['x-cdn-uri'], unitest_cdn_url)
                found_it = True
        self.assert_(found_it)

        resp = retry(get_sos, 'xml')
        body = resp.read()
        parseString(body)
        for cont in conts:
            self.assert_('<name>%s</name>' %
                         saxutils.escape(cont.encode('utf8')) in body)

        resp = retry(get_sos_marker, '')
        resp.read()
        self.assertEquals(resp.status, 200)

        del_resp = retry(delete_sos, quote(unitest.encode('utf8')))
        del_resp.read()
        self.assertEquals(del_resp.status, 204)

        head_resp = retry(head_sos, quote(unitest.encode('utf8')))
        head_resp.read()
        self.assertEquals(head_resp.status, 404)

        put_resp = retry(put_sos, quote(unitest.encode('utf8')))
        put_resp.read()
        self.assertEquals(put_resp.status, 201)
示例#8
0
    def test_origin_get(self):

        def put_swift(url, token, parsed, conn, cont, obj):
            conn.request('PUT',
                quote(parsed.path + '/%s' % cont), '',
                {'X-Auth-Token': token})
            resp = check_response(conn)
            resp.read()
            conn.request('PUT',
                quote(parsed.path + '/%s/%s' % (cont, obj)),
                'testbody', {'X-Auth-Token': token, 'Content-Length': '8'})
            return check_response(conn)

        def put_sos(url, token, parsed, conn, cont):
            conn.request('PUT',
                quote(parsed.path + '/' + cont), '',
                self._db_headers({'X-Auth-Token': token,
                                  'X-TTL': str(60 * 60 * 24)}))
            return check_response(conn)

        def head_swift(url, token, parsed, conn, cont, obj):
            conn.request('HEAD',
                quote(parsed.path + '/%s/%s' % (cont, obj)), '',
                {'X-Auth-Token': token})
            return check_response(conn)

        def head_sos(url, token, parsed, conn, cont):
            conn.request('HEAD',
                quote(parsed.path + '/' + cont), '',
                self._db_headers({'X-Auth-Token': token}))
            return check_response(conn)

        def origin_get(url, token, parsed, conn, cdn_url, obj, headers={}):
            cdn_parsed = urlparse(cdn_url)
            conn.request('GET',
                quote(cdn_parsed.path + '/' + obj), '',
                self._origin_headers(headers, cdn_url))
            return check_response(conn)

        cont_objs = [(uuid4().hex, uuid4().hex),
                     (u'test cont \u2661', u'test obj \u2661')]
        for cont, obj in cont_objs:
            if isinstance(cont, unicode):
                cont = cont.encode('utf-8')
            if isinstance(obj, unicode):
                obj = obj.encode('utf-8')
            self.conts_to_delete.append(cont)
            self.swift_objs_to_delete.append((cont, obj))
            resp = retry(put_sos, cont)
            resp.read()
            resp = retry(put_swift, cont, obj)
            resp.read()
            head_resp = retry(head_sos, cont)
            head_resp.read()
            self.assertEquals(head_resp.status, 204)
            sw_head_resp = retry(head_swift, cont, obj)
            sw_head_resp.read()
            self.assertEquals(sw_head_resp.status // 100, 2)
            for key in self.cdn_url_dict:
                if 'ssl' in key.lower() != self.use_ssl:
                    continue
                cdn_url = self._get_header(key, head_resp.getheaders())
                resp = retry(origin_get, cdn_url=cdn_url, obj=obj)
                body = resp.read()
                self.assertEquals(resp.status // 100, 2)
                self.assertEquals('testbody', body)
                date_str_added = self._get_header('date', resp.getheaders())
                date_added = datetime.datetime.strptime(date_str_added,
                    "%a, %d %b %Y %H:%M:%S GMT")
                exp_expires = date_added + datetime.timedelta(1)
                self.assertEquals(
                    self._get_header('Expires', resp.getheaders()),
                    datetime.datetime.strftime(exp_expires,
                                               "%a, %d %b %Y %H:%M:%S GMT"))
                resp = retry(origin_get, cdn_url=cdn_url, obj=obj,
                             headers={'Range': 'bytes=2-4'})
                body = resp.read()
                self.assertEquals(resp.status // 100, 2)
                self.assertEquals('stb', body)
示例#9
0
    def test_obj_cors(self):
        # this is only for swift cluster that allow obj level cors
        # headers to be set- if they aren't it'll be skipped

        def put_swift(url, token, parsed, conn, cont, obj,
                      cont_origin, obj_origin):
            conn.request('PUT',
                quote(parsed.path + '/%s' % cont), '',
                {'X-Auth-Token': token,
                 'X-Container-Meta-Access-Control-Allow-Origin': cont_origin})
            resp = check_response(conn)
            resp.read()
            conn.request('PUT',
                quote(parsed.path + '/%s/%snc' % (cont, obj)),
                'testbody', {'X-Auth-Token': token, 'Content-Length': '8'})
            resp = check_response(conn)
            resp.read()
            conn.request('PUT',
                quote(parsed.path + '/%s/%syc' % (cont, obj)),
                'testbody', {'X-Auth-Token': token, 'Content-Length': '8',
                             'Access-Control-Allow-Origin': obj_origin})
            return check_response(conn)

        def put_sos(url, token, parsed, conn, cont):
            conn.request('PUT',
                quote(parsed.path + '/' + cont), '',
                self._db_headers({'X-Auth-Token': token,
                                  'X-TTL': str(60 * 60 * 24)}))
            return check_response(conn)

        def origin_get(url, token, parsed, conn, cdn_url, obj, headers={}):
            cdn_parsed = urlparse(cdn_url)
            conn.request('GET',
                quote(cdn_parsed.path + '/' + obj), '',
                self._origin_headers(headers, cdn_url))
            return check_response(conn)

        cont = 'cors_cont'
        obj = 'index.html'

        put_sos_resp = retry(put_sos, cont)
        put_sos_resp.read()
        self.assertEquals(put_sos_resp.status, 201)

        resp = retry(put_swift, cont, obj, '*', 'http://www.obj-only.com')
        resp.read()
        self.assertEquals(resp.status, 201)

        self.conts_to_delete.append(cont)
        self.swift_objs_to_delete.append((cont, obj + 'nc'))
        self.swift_objs_to_delete.append((cont, obj + 'yc'))

        for key in self.cdn_url_dict:
            if 'ssl' in key.lower() != self.use_ssl:
                continue
            cdn_url = self._get_header(key, put_sos_resp.getheaders())
            # do the reg request to see if the headers are set at all
            resp = retry(origin_get, cdn_url=cdn_url, obj=obj + 'yc')
            body = resp.read()
            resp_headers = dict((k.lower(), v) for k, v in resp.getheaders())
            if 'access-control-allow-origin' not in resp_headers:
                raise SkipTest

            resp = retry(origin_get, cdn_url=cdn_url, obj=obj + 'nc',
                         headers={'Origin': 'http://www.obj-only.com'})
            body = resp.read()
            resp_headers = dict((k.lower(), v) for k, v in resp.getheaders())
            self.assertEquals(resp_headers.get('access-control-allow-origin'),
                              '*')

            resp = retry(origin_get, cdn_url=cdn_url, obj=obj + 'yc',
                         headers={'Origin': 'http://www.obj-only.com'})
            body = resp.read()
            resp_headers = dict((k.lower(), v) for k, v in resp.getheaders())
            self.assertEquals(resp_headers.get('access-control-allow-origin'),
                              'http://www.obj-only.com')
示例#10
0
    def test_cors(self):

        def put_swift(url, token, parsed, conn, cont, obj, origin):
            conn.request('PUT',
                quote(parsed.path + '/%s' % cont), '',
                {'X-Auth-Token': token,
                 'X-Container-Meta-Access-Control-Allow-Origin': origin})
            resp = check_response(conn)
            resp.read()
            conn.request('PUT',
                quote(parsed.path + '/%s/%s' % (cont, obj)),
                'testbody', {'X-Auth-Token': token, 'Content-Length': '8'})
            return check_response(conn)

        def put_sos(url, token, parsed, conn, cont):
            conn.request('PUT',
                quote(parsed.path + '/' + cont), '',
                self._db_headers({'X-Auth-Token': token,
                                  'X-TTL': str(60 * 60 * 24)}))
            return check_response(conn)

        def origin_get(url, token, parsed, conn, cdn_url, obj, headers={}):
            cdn_parsed = urlparse(cdn_url)
            conn.request('GET',
                quote(cdn_parsed.path + '/' + obj), '',
                self._origin_headers(headers, cdn_url))
            return check_response(conn)

        def origin_options(url, token, parsed, conn, cdn_url, obj, headers={}):
            cdn_parsed = urlparse(cdn_url)
            conn.request('OPTIONS',
                quote(cdn_parsed.path + '/' + obj), '',
                self._origin_headers(headers, cdn_url))
            return check_response(conn, allow_401=True)

        cont = 'cors_cont'
        obj = 'index.html'

        put_sos_resp = retry(put_sos, cont)
        put_sos_resp.read()
        self.assertEquals(put_sos_resp.status, 201)

        resp = retry(put_swift, cont, obj, '*')
        resp.read()
        self.assertEquals(resp.status, 201)

        self.conts_to_delete.append(cont)
        self.swift_objs_to_delete.append((cont, obj))

        for key in self.cdn_url_dict:
            if 'ssl' in key.lower() != self.use_ssl:
                continue
            cdn_url = self._get_header(key, put_sos_resp.getheaders())
            resp = retry(origin_get, cdn_url=cdn_url, obj=obj,
                         headers={'Origin': 'http://www.mytest.com'})
            body = resp.read()
            self.assertEquals(
                self._get_header('Access-Control-Allow-Origin',
                                 resp.getheaders()), '*')

            resp = retry(origin_options, cdn_url=cdn_url, obj=obj,
                         headers={'Origin': 'http://www.mytest.com',
                                  'Access-Control-Request-Method': 'GET'})
            self.assertEquals(
                self._get_header('Access-Control-Allow-Origin',
                                 resp.getheaders()), '*')
            self.assertEquals(
                self._get_header('Access-Control-Allow-Methods',
                                 resp.getheaders()), 'GET, HEAD, OPTIONS')
            body = resp.read()

            resp = retry(origin_options, cdn_url=cdn_url, obj=obj,
                         headers={'Origin': 'http://www.mytest.com',
                                  'Access-Control-Request-Method': 'PUT'})
            self.assertEquals(resp.status, 401)

        cont = 'cors_cont_single_origin'
        obj = 'index.html'

        put_sos_resp = retry(put_sos, cont)
        put_sos_resp.read()
        self.assertEquals(put_sos_resp.status // 100, 2)

        resp = retry(put_swift, cont, obj, 'http://www.only-me.com')
        resp.read()
        self.assertEquals(resp.status, 201)

        self.conts_to_delete.append(cont)
        self.swift_objs_to_delete.append((cont, obj))

        for key in self.cdn_url_dict:
            if 'ssl' in key.lower() != self.use_ssl:
                continue
            cdn_url = self._get_header(key, put_sos_resp.getheaders())
            resp = retry(origin_get, cdn_url=cdn_url, obj=obj,
                         headers={'Origin': 'http://www.mytest.com'})
            self.assertEquals(
                self._get_header('Access-Control-Allow-Origin',
                                 resp.getheaders()), None)
            body = resp.read()

            resp = retry(origin_options, cdn_url=cdn_url, obj=obj,
                         headers={'Origin': 'http://www.mytest.com',
                                  'Access-Control-Request-Method': 'GET'})
            self.assertEquals(resp.status, 401)
            resp.read()

        for key in self.cdn_url_dict:
            if 'ssl' in key.lower() != self.use_ssl:
                continue
            cdn_url = self._get_header(key, put_sos_resp.getheaders())
            resp = retry(origin_get, cdn_url=cdn_url, obj=obj,
                         headers={'Origin': 'http://www.only-me.com'})
            self.assertEquals(
                self._get_header('Access-Control-Allow-Origin',
                                 resp.getheaders()), 'http://www.only-me.com')
            body = resp.read()
示例#11
0
    def test_origin_301(self):

        if not self.run_static_web_test_because_of_webob_hack:
            raise SkipTest

        def put_swift(url, token, parsed, conn, cont):
            conn.request(
                'PUT', quote(parsed.path + '/%s' % cont), '', {
                    'X-Auth-Token': token,
                    'x-container-read': '.r:*',
                    'x-container-meta-web-index': 'index.html'
                })
            resp = check_response(conn)
            resp.read()
            conn.request('PUT',
                         quote(parsed.path + '/%s/hat/index.html' % (cont)),
                         'testbody', {
                             'X-Auth-Token': token,
                             'Content-Length': 8
                         })
            resp = check_response(conn)
            resp.read()

        def put_sos(url, token, parsed, conn, cont):
            conn.request(
                'PUT', quote(parsed.path + '/' + cont), '',
                self._db_headers({
                    'X-Auth-Token': token,
                    'X-TTL': 60 * 60 * 24
                }))
            resp = check_response(conn)
            resp.read()

        def head_sos(url, token, parsed, conn, cont):
            conn.request('HEAD', quote(parsed.path + '/' + cont), '',
                         self._db_headers({'X-Auth-Token': token}))
            return check_response(conn)

        def origin_get(url, token, parsed, conn, cdn_url, obj, headers={}):
            cdn_parsed = urlparse(cdn_url)
            conn.request('GET', quote(cdn_parsed.path + '/' + obj), '',
                         self._origin_headers(headers, cdn_url))
            return check_response(conn)

        cont = uuid4().hex
        self.conts_to_delete.append(cont)
        self.swift_objs_to_delete.append((cont, 'hat/index.html'))
        retry(put_sos, cont)
        retry(put_swift, cont)
        head_resp = retry(head_sos, cont)
        head_resp.read()
        self.assertEquals(head_resp.status, 204)
        for key in self.cdn_url_dict:
            if 'ssl' in key.lower() != self.use_ssl:
                continue
            cdn_url = self._get_header(key, head_resp.getheaders())
            resp = retry(origin_get, cdn_url=cdn_url, obj='hat/')
            body = resp.read()
            try:
                self.assertEquals(resp.status // 100, 2)
                self.assertEquals('testbody', body)
            except AssertionError:
                print "!!!!!!!! DO YOU HAVE STATIC WEB TURNED ON? !!!!!!!!"
                raise

            resp = retry(origin_get, cdn_url=cdn_url, obj='hat')
            body = resp.read()
            self.assertEquals(resp.status, 301)
            self.assertEquals(self._get_header('Location', resp.getheaders()),
                              '/hat/')
示例#12
0
    def test_db_listing(self):

        unitest = u'test \u2661'
        xml_test = 'xte<st \u2661'

        def put_sos(url, token, parsed, conn, cont, headers={}):
            headers.update({'X-Auth-Token': token, 'X-TTL': 60 * 60 * 24})
            conn.request('PUT', parsed.path + '/' + cont, '',
                         self._db_headers(headers))
            return check_response(conn)

        def get_sos(url, token, parsed, conn, output_format, cdn_enabled=''):
            conn.request(
                'GET', parsed.path + '?format=%s&enabled=%s' %
                (output_format, cdn_enabled), '',
                self._db_headers({'X-Auth-Token': token}))
            return check_response(conn)

        def get_sos_marker(url,
                           token,
                           parsed,
                           conn,
                           output_format,
                           cdn_enabled=''):
            conn.request(
                'GET',
                parsed.path + '?marker=%s' % quote(unitest.encode('utf8')), '',
                self._db_headers({'X-Auth-Token': token}))
            return check_response(conn)

        def head_sos(url, token, parsed, conn, cont):
            conn.request('HEAD', parsed.path + '/' + cont, '',
                         self._db_headers({'X-Auth-Token': token}))
            return check_response(conn)

        conts = [uuid4().hex for i in xrange(5)]
        conts.extend(['x' + uuid4().hex for i in xrange(5)])

        conts.append(unitest)
        conts.append(xml_test)
        for cont in conts:
            if isinstance(cont, unicode):
                cont = cont.encode('utf-8')
            self.conts_to_delete.append(cont)
            cont = quote(cont)
            if cont.startswith('x'):
                resp = retry(put_sos, cont, {'x-cdn-enabled': 'false'})
            else:
                resp = retry(put_sos, cont)
            resp.read()
            self.assertEquals(resp.status, 201)

        head_resp = retry(head_sos, quote(unitest.encode('utf8')))
        head_resp.read()
        unitest_cdn_url = head_resp.getheader('x-cdn-uri')

        resp = retry(get_sos, '')
        body = resp.read()
        for cont in conts:
            self.assert_(cont.encode('utf8') in body)
        resp = retry(get_sos, '', 'true')
        body = resp.read()
        for cont in conts[:-2]:
            self.assertEquals(not cont.startswith('x'), cont in body)
        resp = retry(get_sos, '', 'false')
        body = resp.read()
        for cont in conts:
            self.assertEquals(cont.startswith('x'), cont in body)

        resp = retry(get_sos, 'json')
        body = resp.read()
        data = json.loads(body)
        resp_conts = [d['name'] for d in data]
        self.assertEquals(set(resp_conts), set(conts))
        found_it = False
        for data_dict in data:
            if data_dict['name'] == unitest:
                self.assertEquals(data_dict['x-cdn-uri'], unitest_cdn_url)
                found_it = True
        self.assert_(found_it)

        resp = retry(get_sos, 'xml')
        body = resp.read()
        parseString(body)
        for cont in conts:
            self.assert_('<name>%s</name>' %
                         saxutils.escape(cont.encode('utf8')) in body)

        resp = retry(get_sos_marker, '')
        resp.read()
        self.assertEquals(resp.status, 200)
示例#13
0
    def test_origin_get(self):
        def put_swift(url, token, parsed, conn, cont, obj):
            conn.request('PUT', quote(parsed.path + '/%s' % cont), '',
                         {'X-Auth-Token': token})
            resp = check_response(conn)
            resp.read()
            conn.request('PUT', quote(parsed.path + '/%s/%s' % (cont, obj)),
                         'testbody', {
                             'X-Auth-Token': token,
                             'Content-Length': 8
                         })
            return check_response(conn)

        def put_sos(url, token, parsed, conn, cont):
            conn.request(
                'PUT', quote(parsed.path + '/' + cont), '',
                self._db_headers({
                    'X-Auth-Token': token,
                    'X-TTL': 60 * 60 * 24
                }))
            return check_response(conn)

        def head_swift(url, token, parsed, conn, cont, obj):
            conn.request('HEAD', quote(parsed.path + '/%s/%s' % (cont, obj)),
                         '', {'X-Auth-Token': token})
            return check_response(conn)

        def head_sos(url, token, parsed, conn, cont):
            conn.request('HEAD', quote(parsed.path + '/' + cont), '',
                         self._db_headers({'X-Auth-Token': token}))
            return check_response(conn)

        def origin_get(url, token, parsed, conn, cdn_url, obj, headers={}):
            cdn_parsed = urlparse(cdn_url)
            conn.request('GET', quote(cdn_parsed.path + '/' + obj), '',
                         self._origin_headers(headers, cdn_url))
            return check_response(conn)

        cont_objs = [(uuid4().hex, uuid4().hex),
                     (u'test cont \u2661', u'test obj \u2661')]
        for cont, obj in cont_objs:
            if isinstance(cont, unicode):
                cont = cont.encode('utf-8')
            if isinstance(obj, unicode):
                obj = obj.encode('utf-8')
            self.conts_to_delete.append(cont)
            self.swift_objs_to_delete.append((cont, obj))
            resp = retry(put_sos, cont)
            resp.read()
            resp = retry(put_swift, cont, obj)
            resp.read()
            head_resp = retry(head_sos, cont)
            head_resp.read()
            self.assertEquals(head_resp.status, 204)
            sw_head_resp = retry(head_swift, cont, obj)
            sw_head_resp.read()
            self.assertEquals(sw_head_resp.status // 100, 2)
            for key in self.cdn_url_dict:
                if 'ssl' in key.lower() != self.use_ssl:
                    continue
                cdn_url = self._get_header(key, head_resp.getheaders())
                resp = retry(origin_get, cdn_url=cdn_url, obj=obj)
                body = resp.read()
                self.assertEquals(resp.status // 100, 2)
                self.assertEquals('testbody', body)
                date_str_added = self._get_header('date', resp.getheaders())
                date_added = datetime.datetime.strptime(
                    date_str_added, "%a, %d %b %Y %H:%M:%S GMT")
                exp_expires = date_added + datetime.timedelta(1)
                self.assertEquals(
                    self._get_header('Expires', resp.getheaders()),
                    datetime.datetime.strftime(exp_expires,
                                               "%a, %d %b %Y %H:%M:%S GMT"))
                resp = retry(origin_get,
                             cdn_url=cdn_url,
                             obj=obj,
                             headers={'Range': 'bytes=2-4'})
                body = resp.read()
                self.assertEquals(resp.status // 100, 2)
                self.assertEquals('stb', body)
示例#14
0
    def test_obj_cors(self):
        # this is only for swift cluster that allow obj level cors
        # headers to be set- if they aren't it'll be skipped

        def put_swift(url, token, parsed, conn, cont, obj, cont_origin,
                      obj_origin):
            conn.request(
                'PUT', quote(parsed.path + '/%s' % cont), '', {
                    'X-Auth-Token': token,
                    'X-Container-Meta-Access-Control-Allow-Origin': cont_origin
                })
            resp = check_response(conn)
            resp.read()
            conn.request('PUT', quote(parsed.path + '/%s/%snc' % (cont, obj)),
                         'testbody', {
                             'X-Auth-Token': token,
                             'Content-Length': '8'
                         })
            resp = check_response(conn)
            resp.read()
            conn.request(
                'PUT', quote(parsed.path + '/%s/%syc' % (cont, obj)),
                'testbody', {
                    'X-Auth-Token': token,
                    'Content-Length': '8',
                    'Access-Control-Allow-Origin': obj_origin
                })
            return check_response(conn)

        def put_sos(url, token, parsed, conn, cont):
            conn.request(
                'PUT', quote(parsed.path + '/' + cont), '',
                self._db_headers({
                    'X-Auth-Token': token,
                    'X-TTL': str(60 * 60 * 24)
                }))
            return check_response(conn)

        def origin_get(url, token, parsed, conn, cdn_url, obj, headers={}):
            cdn_parsed = urlparse(cdn_url)
            conn.request('GET', quote(cdn_parsed.path + '/' + obj), '',
                         self._origin_headers(headers, cdn_url))
            return check_response(conn)

        cont = 'cors_cont'
        obj = 'index.html'

        put_sos_resp = retry(put_sos, cont)
        put_sos_resp.read()
        self.assertEquals(put_sos_resp.status, 201)

        resp = retry(put_swift, cont, obj, '*', 'http://www.obj-only.com')
        resp.read()
        self.assertEquals(resp.status, 201)

        self.conts_to_delete.append(cont)
        self.swift_objs_to_delete.append((cont, obj + 'nc'))
        self.swift_objs_to_delete.append((cont, obj + 'yc'))

        for key in self.cdn_url_dict:
            if 'ssl' in key.lower() != self.use_ssl:
                continue
            cdn_url = self._get_header(key, put_sos_resp.getheaders())
            # do the reg request to see if the headers are set at all
            resp = retry(origin_get, cdn_url=cdn_url, obj=obj + 'yc')
            body = resp.read()
            resp_headers = dict((k.lower(), v) for k, v in resp.getheaders())
            if 'access-control-allow-origin' not in resp_headers:
                raise SkipTest

            resp = retry(origin_get,
                         cdn_url=cdn_url,
                         obj=obj + 'nc',
                         headers={'Origin': 'http://www.obj-only.com'})
            body = resp.read()
            resp_headers = dict((k.lower(), v) for k, v in resp.getheaders())
            self.assertEquals(resp_headers.get('access-control-allow-origin'),
                              '*')

            resp = retry(origin_get,
                         cdn_url=cdn_url,
                         obj=obj + 'yc',
                         headers={'Origin': 'http://www.obj-only.com'})
            body = resp.read()
            resp_headers = dict((k.lower(), v) for k, v in resp.getheaders())
            self.assertEquals(resp_headers.get('access-control-allow-origin'),
                              'http://www.obj-only.com')
示例#15
0
    def test_cors(self):
        def put_swift(url, token, parsed, conn, cont, obj, origin):
            conn.request(
                'PUT', quote(parsed.path + '/%s' % cont), '', {
                    'X-Auth-Token': token,
                    'X-Container-Meta-Access-Control-Allow-Origin': origin
                })
            resp = check_response(conn)
            resp.read()
            conn.request('PUT', quote(parsed.path + '/%s/%s' % (cont, obj)),
                         'testbody', {
                             'X-Auth-Token': token,
                             'Content-Length': '8'
                         })
            return check_response(conn)

        def put_sos(url, token, parsed, conn, cont):
            conn.request(
                'PUT', quote(parsed.path + '/' + cont), '',
                self._db_headers({
                    'X-Auth-Token': token,
                    'X-TTL': str(60 * 60 * 24)
                }))
            return check_response(conn)

        def origin_get(url, token, parsed, conn, cdn_url, obj, headers={}):
            cdn_parsed = urlparse(cdn_url)
            conn.request('GET', quote(cdn_parsed.path + '/' + obj), '',
                         self._origin_headers(headers, cdn_url))
            return check_response(conn)

        def origin_options(url, token, parsed, conn, cdn_url, obj, headers={}):
            cdn_parsed = urlparse(cdn_url)
            conn.request('OPTIONS', quote(cdn_parsed.path + '/' + obj), '',
                         self._origin_headers(headers, cdn_url))
            return check_response(conn, allow_401=True)

        cont = 'cors_cont'
        obj = 'index.html'

        put_sos_resp = retry(put_sos, cont)
        put_sos_resp.read()
        self.assertEquals(put_sos_resp.status, 201)

        resp = retry(put_swift, cont, obj, '*')
        resp.read()
        self.assertEquals(resp.status, 201)

        self.conts_to_delete.append(cont)
        self.swift_objs_to_delete.append((cont, obj))

        for key in self.cdn_url_dict:
            if 'ssl' in key.lower() != self.use_ssl:
                continue
            cdn_url = self._get_header(key, put_sos_resp.getheaders())
            resp = retry(origin_get,
                         cdn_url=cdn_url,
                         obj=obj,
                         headers={'Origin': 'http://www.mytest.com'})
            body = resp.read()
            self.assertEquals(
                self._get_header('Access-Control-Allow-Origin',
                                 resp.getheaders()), '*')

            resp = retry(origin_options,
                         cdn_url=cdn_url,
                         obj=obj,
                         headers={
                             'Origin': 'http://www.mytest.com',
                             'Access-Control-Request-Method': 'GET'
                         })
            self.assertEquals(
                self._get_header('Access-Control-Allow-Origin',
                                 resp.getheaders()), '*')
            self.assertEquals(
                self._get_header('Access-Control-Allow-Methods',
                                 resp.getheaders()), 'GET, HEAD, OPTIONS')
            body = resp.read()

            resp = retry(origin_options,
                         cdn_url=cdn_url,
                         obj=obj,
                         headers={
                             'Origin': 'http://www.mytest.com',
                             'Access-Control-Request-Method': 'PUT'
                         })
            self.assertEquals(resp.status, 401)

        cont = 'cors_cont_single_origin'
        obj = 'index.html'

        put_sos_resp = retry(put_sos, cont)
        put_sos_resp.read()
        self.assertEquals(put_sos_resp.status // 100, 2)

        resp = retry(put_swift, cont, obj, 'http://www.only-me.com')
        resp.read()
        self.assertEquals(resp.status, 201)

        self.conts_to_delete.append(cont)
        self.swift_objs_to_delete.append((cont, obj))

        for key in self.cdn_url_dict:
            if 'ssl' in key.lower() != self.use_ssl:
                continue
            cdn_url = self._get_header(key, put_sos_resp.getheaders())
            resp = retry(origin_get,
                         cdn_url=cdn_url,
                         obj=obj,
                         headers={'Origin': 'http://www.mytest.com'})
            self.assertEquals(
                self._get_header('Access-Control-Allow-Origin',
                                 resp.getheaders()), None)
            body = resp.read()

            resp = retry(origin_options,
                         cdn_url=cdn_url,
                         obj=obj,
                         headers={
                             'Origin': 'http://www.mytest.com',
                             'Access-Control-Request-Method': 'GET'
                         })
            self.assertEquals(resp.status, 401)
            resp.read()

        for key in self.cdn_url_dict:
            if 'ssl' in key.lower() != self.use_ssl:
                continue
            cdn_url = self._get_header(key, put_sos_resp.getheaders())
            resp = retry(origin_get,
                         cdn_url=cdn_url,
                         obj=obj,
                         headers={'Origin': 'http://www.only-me.com'})
            self.assertEquals(
                self._get_header('Access-Control-Allow-Origin',
                                 resp.getheaders()), 'http://www.only-me.com')
            body = resp.read()