<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -8,6 +8,7 @@ import iso8601
 import time
 import gzip
 import StringIO
+import logging
 from elementtree.ElementTree import *
 from pyjavaproperties import Properties
 from xml_objects import *
@@ -46,6 +47,8 @@ class Gnip:
         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)
@@ -197,9 +200,9 @@ class Gnip:
         passed in parameters.
         &quot;&quot;&quot;
 
-        url_path = &quot;/&quot; + publisher_scope + &quot;/publishers/&quot; + publisher_name + &quot;/filters/&quot; + filter_name + &quot;/rules?&quot; + rule.to_delete_query_string()
+        url_path = &quot;/&quot; + publisher_scope + &quot;/publishers/&quot; + publisher_name + &quot;/filters/&quot; + filter_name + &quot;/rules&quot;
 
-        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):
         &quot;&quot;&quot;Check if a rule exists in a Gnip filter.
@@ -448,36 +451,56 @@ class Gnip:
         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 &quot;&quot;
         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+=&quot;?&quot; + 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+=&quot;?&quot; + 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+=&quot;?&quot; + 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+=&quot;?&quot; + 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+=&quot;?&quot; + query_string
+            self.client.post(url, self.__compress_with_gzip(&quot; &quot;))
+        else :
+            url = self.base_url + url_path
+            if query_string is not None:
+                url+=&quot;?&quot; + query_string
+            self.client.delete(url)
         return self.client.response
 
     def __parse_response(self, response, data_object=None):
@@ -491,6 +514,7 @@ class Gnip:
             return Response(response.status, self.__parse_error(response.body))
 
     def __parse_error(self, error_xml):
+        logging.info(&quot;Parsing error from XML: &quot; + error_xml)
         error = Error()
         error.from_xml(error_xml)
         return error</diff>
      <filename>gnip/__init__.py</filename>
    </modified>
    <modified>
      <diff>@@ -1 +1,2 @@
-gnip.server=https://prod.gnipcentral.com
\ No newline at end of file
+gnip.server=https://prod.gnipcentral.com
+gnip.tunnel.over.post=false
\ No newline at end of file</diff>
      <filename>gnip/gnip.properties</filename>
    </modified>
    <modified>
      <diff>@@ -22,7 +22,7 @@ sys.path.append(&quot;.&quot;)
 sys.path.append(&quot;./test&quot;)
 
 def regressionTest():
-    logging.getLogger('').setLevel(logging.INFO)
+    logging.getLogger('').setLevel(logging.WARN)
     path = os.path.abspath(os.path.dirname(sys.argv[0])) + &quot;/test&quot;
     logging.debug(&quot;Searching for tests in &quot; + path)
     files = os.listdir(path)</diff>
      <filename>regression.py</filename>
    </modified>
    <modified>
      <diff>@@ -12,7 +12,7 @@ import random
 
 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))        </diff>
      <filename>test/activities_test.py</filename>
    </modified>
    <modified>
      <diff>@@ -11,7 +11,7 @@ import logging
 
 class ActivityTestCase(unittest.TestCase):
     def setUp(self):
-        logging.getLogger('').setLevel(logging.INFO)
+        logging.getLogger('').setLevel(logging.WARN)
         index = int(__file__.rfind(&quot;/&quot;))
         basedir = __file__[0:index]
         #logging.info(&quot;Loading XML files from: &quot; + basedir)</diff>
      <filename>test/activity_test.py</filename>
    </modified>
    <modified>
      <diff>@@ -31,6 +31,7 @@ class GnipTestCase(unittest.TestCase):
         self.filterFullData = None
     
     def setUp(self):
+        self.gnip.tunnel_over_post = False
         self.filterXml = \
         '&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;yes&quot;?&gt;' +\
             '&lt;filter fullData=&quot;true&quot; name=&quot;test&quot;&gt;' + \
@@ -148,7 +149,11 @@ class GnipTestCase(unittest.TestCase):
         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=&quot;actor&quot;, value=&quot;you&quot;)
@@ -159,6 +164,10 @@ class GnipTestCase(unittest.TestCase):
         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)
@@ -182,7 +191,7 @@ class GnipTestCase(unittest.TestCase):
         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(&quot;actor&quot;,&quot;jud&quot;), Rule(&quot;actor&quot;,&quot;eddie&quot;), Rule(&quot;actor&quot;,&quot;alex&quot;)]
@@ -207,6 +216,10 @@ class GnipTestCase(unittest.TestCase):
         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)
@@ -235,6 +248,10 @@ class GnipTestCase(unittest.TestCase):
         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()
 </diff>
      <filename>test/gnip_test.py</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>549de05b5118fcca168f1b8474fbc46994215ca3</id>
    </parent>
  </parents>
  <author>
    <name>Eddie O'Neil</name>
    <email>ekoneil@arapahoe.boulder.gnipcentral.com</email>
  </author>
  <url>http://github.com/gnip/gnip-python/commit/e683e48bd7028b768b3643fb45949251c81b8b44</url>
  <id>e683e48bd7028b768b3643fb45949251c81b8b44</id>
  <committed-date>2009-01-20T18:37:21-08:00</committed-date>
  <authored-date>2009-01-20T18:37:21-08:00</authored-date>
  <message>Add support for tunneling HTTP PUT and DELETE requets over POST.</message>
  <tree>8501175420c125132c563b5c703128127bf9aeb5</tree>
  <committer>
    <name>Eddie O'Neil</name>
    <email>ekoneil@arapahoe.boulder.gnipcentral.com</email>
  </committer>
</commit>
