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')
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')
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)
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)
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/')
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)
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)
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')
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()
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/')
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)
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)
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')
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()