Skip to content

Commit

Permalink
Add support for tunneling HTTP PUT and DELETE requets over POST.
Browse files Browse the repository at this point in the history
  • Loading branch information
Eddie O'Neil committed Jan 21, 2009
1 parent 549de05 commit e683e48
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 24 deletions.
60 changes: 42 additions & 18 deletions gnip/__init__.py
Expand Up @@ -8,6 +8,7 @@
import time
import gzip
import StringIO
import logging
from elementtree.ElementTree import *
from pyjavaproperties import Properties
from xml_objects import *
Expand Down Expand Up @@ -46,6 +47,8 @@ def __init__(self, username, password, gnip_server=None):
else:
self.base_url = gnip_server

self.tunnel_over_post = bool(p['gnip.tunnel.over.post=false'])

# Configure authentication
self.client = davclient.DAVClient(self.base_url)
self.client.set_basic_auth(username,password)
Expand Down Expand Up @@ -197,9 +200,9 @@ def remove_rule_from_filter(self, publisher_scope, publisher_name, filter_name,
passed in parameters.
"""

url_path = "/" + publisher_scope + "/publishers/" + publisher_name + "/filters/" + filter_name + "/rules?" + rule.to_delete_query_string()
url_path = "/" + publisher_scope + "/publishers/" + publisher_name + "/filters/" + filter_name + "/rules"

return self.__parse_response(self.__do_http_delete(url_path))
return self.__parse_response(self.__do_http_delete(url_path, rule.to_delete_query_string()))

def rule_exists_in_filter(self, publisher_scope, publisher_name, filter_name, rule):
"""Check if a rule exists in a Gnip filter.
Expand Down Expand Up @@ -448,36 +451,56 @@ def update_publisher(self, publisher):
return self.__parse_response(self.__do_http_put(url_path, publisher.to_xml()))

def __compress_with_gzip(self, string):

if (string is None or len(string) is 0):
return ""
zbuf = StringIO.StringIO()
zfile = gzip.GzipFile(mode='wb', fileobj=zbuf, compresslevel=9)
zfile.write(string)
zfile.close()
return zbuf.getvalue()

def __do_http_delete(self, url_path):

self.client.delete(self.base_url + url_path)
return self.client.response

def __do_http_get(self, url_path):

self.client.get(self.base_url + url_path)
return self.client.response

def __do_http_head(self):

self.client.head(self.base_url)
return self.client.response

def __do_http_post(self, url_path, data):
def __do_http_get(self, url_path, query_string = None):
url = self.base_url + url_path
if query_string is not None:
url+="?" + query_string
self.client.get(url)
return self.client.response

self.client.post(self.base_url + url_path, self.__compress_with_gzip(data))
def __do_http_post(self, url_path, data, query_string = None):
url = self.base_url + url_path
if query_string is not None:
url+="?" + query_string
self.client.post(url, self.__compress_with_gzip(data))
return self.client.response

def __do_http_put(self, url_path, data):
def __do_http_put(self, url_path, data, query_string = None):
if (self.tunnel_over_post):
url = self.base_url + url_path + ';edit'
if query_string is not None:
url+="?" + query_string
self.client.post(url, self.__compress_with_gzip(data))
else :
url = self.base_url + url_path
if query_string is not None:
url+="?" + query_string
self.client.put(url, self.__compress_with_gzip(data))
return self.client.response

self.client.put(self.base_url + url_path, self.__compress_with_gzip(data))
def __do_http_delete(self, url_path, query_string = None):
if (self.tunnel_over_post):
url = self.base_url + url_path + ';delete'
if query_string is not None:
url+="?" + query_string
self.client.post(url, self.__compress_with_gzip(" "))
else :
url = self.base_url + url_path
if query_string is not None:
url+="?" + query_string
self.client.delete(url)
return self.client.response

def __parse_response(self, response, data_object=None):
Expand All @@ -491,6 +514,7 @@ def __parse_response(self, response, data_object=None):
return Response(response.status, self.__parse_error(response.body))

def __parse_error(self, error_xml):
logging.info("Parsing error from XML: " + error_xml)
error = Error()
error.from_xml(error_xml)
return error
Expand Down
3 changes: 2 additions & 1 deletion gnip/gnip.properties
@@ -1 +1,2 @@
gnip.server=https://prod.gnipcentral.com
gnip.server=https://prod.gnipcentral.com
gnip.tunnel.over.post=false
2 changes: 1 addition & 1 deletion regression.py
Expand Up @@ -22,7 +22,7 @@
sys.path.append("./test")

def regressionTest():
logging.getLogger('').setLevel(logging.INFO)
logging.getLogger('').setLevel(logging.WARN)
path = os.path.abspath(os.path.dirname(sys.argv[0])) + "/test"
logging.debug("Searching for tests in " + path)
files = os.listdir(path)
Expand Down
2 changes: 1 addition & 1 deletion test/activities_test.py
Expand Up @@ -12,7 +12,7 @@

class ActivityTestCase(unittest.TestCase):
def setUp(self):
logging.getLogger('').setLevel(logging.INFO)
logging.getLogger('').setLevel(logging.WARN)

def testActivitiesXmlParses(self):
randVal1 = str(random.randint(1, 99999999))
Expand Down
2 changes: 1 addition & 1 deletion test/activity_test.py
Expand Up @@ -11,7 +11,7 @@

class ActivityTestCase(unittest.TestCase):
def setUp(self):
logging.getLogger('').setLevel(logging.INFO)
logging.getLogger('').setLevel(logging.WARN)
index = int(__file__.rfind("/"))
basedir = __file__[0:index]
#logging.info("Loading XML files from: " + basedir)
Expand Down
21 changes: 19 additions & 2 deletions test/gnip_test.py
Expand Up @@ -31,6 +31,7 @@ def __init__(self,*args):
self.filterFullData = None

def setUp(self):
self.gnip.tunnel_over_post = False
self.filterXml = \
'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' +\
'<filter fullData="true" name="test">' + \
Expand Down Expand Up @@ -148,7 +149,11 @@ def testUpdateFilter(self):
self.assertEqual(200, response.code)
self.assertEqual(self.success, response.result)

def testRemoveRuleFromFilter(self):
def testUpdateFilterOverPost(self):
self.gnip.tunnel_over_post = True
self.testUpdateFilter()

def testDeleteRuleFromFilter(self):
a_filter = filter.Filter(name=self.filterName, rules=self.rules, full_data=self.filterFullData)
self.gnip.create_filter(self.testpublisherscope, self.testpublisher, a_filter)
expected_rule = Rule(type="actor", value="you")
Expand All @@ -159,6 +164,10 @@ def testRemoveRuleFromFilter(self):
a_filter_with_new_rule = self.gnip.find_filter(self.testpublisherscope, self.testpublisher, a_filter.name).result
self.assertFalse(expected_rule in a_filter_with_new_rule.rules)

def testDeleteRuleFromFilterOverPost(self):
self.gnip.tunnel_over_post = True
self.testDeleteRuleFromFilter()

def testRuleSearchFromFilter(self):
a_filter = filter.Filter(name=self.filterName, rules=self.rules, full_data=self.filterFullData)
self.gnip.create_filter(self.testpublisherscope, self.testpublisher, a_filter)
Expand All @@ -182,7 +191,7 @@ def testAddSingleRuleUpdateToFilter(self):
a_filter_with_new_rule = self.gnip.find_filter(self.testpublisherscope, self.testpublisher, a_filter.name).result
self.assertTrue(expected_rule in a_filter_with_new_rule.rules)

def testBatchUpdateOfFilterRules(self):
def testAddBatchUpdateOfFilterRules(self):
a_filter = filter.Filter(name=self.filterName, rules=self.rules, full_data=self.filterFullData)
self.gnip.create_filter(self.testpublisherscope, self.testpublisher, a_filter)
new_rules = [Rule("actor","jud"), Rule("actor","eddie"), Rule("actor","alex")]
Expand All @@ -207,6 +216,10 @@ def testDeleteFilter(self):
self.assertEqual(200, response.code)
self.assertEqual(self.success, response.result)

def testDeleteFilterOverPost(self):
self.gnip.tunnel_over_post = True
self.testDeleteFilter()

def testFindFilter(self):
a_filter = filter.Filter(name=self.filterName, rules=self.rules, full_data=self.filterFullData)
self.gnip.create_filter(self.testpublisherscope, self.testpublisher, a_filter)
Expand Down Expand Up @@ -235,6 +248,10 @@ def testUpdatePublisher(self):
self.assertEqual(200, response.code)
self.assertEquals(expected_publisher, response.result)

def testUpdatePublisherOverPost(self):
self.gnip.tunnel_over_post = True
self.testUpdatePublisher()

if __name__ == '__main__':
unittest.main()

0 comments on commit e683e48

Please sign in to comment.