You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by to...@apache.org on 2014/09/07 15:22:47 UTC

git commit: Add support for pretty-formatting XML response bodies when LIBCLOUD_DEBUG_PRETTY_PRINT_RESPONSE environment variable is set.

Repository: libcloud
Updated Branches:
  refs/heads/trunk 26118a33e -> 039ecec20


Add support for pretty-formatting XML response bodies when
LIBCLOUD_DEBUG_PRETTY_PRINT_RESPONSE environment variable is set.

Also fix issue with curl log lines under Python 3.


Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/039ecec2
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/039ecec2
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/039ecec2

Branch: refs/heads/trunk
Commit: 039ecec2036d2910a467f8fe717f8bbf9c5af777
Parents: 26118a3
Author: Tomaz Muraus <to...@apache.org>
Authored: Sun Sep 7 14:57:32 2014 +0200
Committer: Tomaz Muraus <to...@apache.org>
Committed: Sun Sep 7 15:03:03 2014 +0200

----------------------------------------------------------------------
 CHANGES.rst              |  8 ++---
 docs/troubleshooting.rst | 69 ++++++++++++++++++++++++++++++++++++++-----
 libcloud/common/base.py  | 19 ++++++++----
 3 files changed, 80 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/039ecec2/CHANGES.rst
----------------------------------------------------------------------
diff --git a/CHANGES.rst b/CHANGES.rst
index a1da690..42227ab 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -11,10 +11,10 @@ General
   OpenStack Identity (Keystone) service API v3.
   [Tomaz Muraus]
 
-- Add support for prettifying JSON response body which is printed to a file
-  like object when using ``LIBCLOUD_DEBUG`` environment variable.
-  This option can be enabled by setting ``LIBCLOUD_DEBUG_PRETTY_PRINT_JSON``
-  environment variable.
+- Add support for prettifying JSON or XML response body which is printed to a
+  file like object when using ``LIBCLOUD_DEBUG`` environment variable.
+  This option can be enabled by setting
+  ``LIBCLOUD_DEBUG_PRETTY_PRINT_RESPONSE`` environment variable.
   [Tomaz Muraus]
 
 - Add support for using an HTTP proxy for outgoing HTTP and HTTPS requests.

http://git-wip-us.apache.org/repos/asf/libcloud/blob/039ecec2/docs/troubleshooting.rst
----------------------------------------------------------------------
diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst
index 5f20602..8c12103 100644
--- a/docs/troubleshooting.rst
+++ b/docs/troubleshooting.rst
@@ -32,9 +32,11 @@ response body (if compressed) before logging it.
 To enable it, set ``LIBCLOUD_DEBUG`` environment variable and make it point
 to a file where the debug output should be saved.
 
-If the API returns a JSON which is not human friendly, you can also set
-``LIBCLOUD_DEBUG_PRETTY_PRINT_JSON`` environment variable which will cause
-the JSON to be beautified / formated so it's easier for humands to read it.
+If the API returns JSON or XML in the response body which is not human
+friendly, you can also set ``LIBCLOUD_DEBUG_PRETTY_PRINT_RESPONSE``
+environment variable which will cause the JSON or XML to be beautified
+/ formated so it's easier for humans to read it. Keep in mind that this
+only works for non-chunked responses.
 
 Example 1 - Logging output to standard error
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -68,10 +70,10 @@ Example output:
 
     # -------- end 4431824872:4431825232 response ----------
 
-Example 2 - Making JSON response human friendly
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Example 2 - Making JSON / XML response human friendly
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-Non-formatted response:
+Non-formatted JSON response:
 
 .. sourcecode:: bash
 
@@ -95,7 +97,7 @@ Human friendly formatted JSON response:
 
 .. sourcecode:: bash
 
-    LIBCLOUD_DEBUG=/dev/stderr LIBCLOUD_DEBUG_PRETTY_PRINT_JSON=1 python my_script.py
+    LIBCLOUD_DEBUG=/dev/stderr LIBCLOUD_DEBUG_PRETTY_PRINT_RESPONSE=1 python my_script.py
 
 .. sourcecode:: bash
 
@@ -180,3 +182,56 @@ Human friendly formatted JSON response:
         ]
     }
     # -------- end 41102928:41133624 response ----------
+
+Non-formatted XML response:
+
+.. sourcecode:: bash
+
+    LIBCLOUD_DEBUG=/dev/stderr python my_script.py
+
+.. sourcecode:: bash
+
+    # -------- begin 33145616:33126160 response ----------
+    HTTP/1.1 200 OK
+    X-Amzn-Requestid: e84f62d0-368e-11e4-820b-8bf013dc269e
+    Date: Sun, 07 Sep 2014 13:00:13 GMT
+    Content-Length: 457
+    Content-Type: text/xml
+
+    <?xml version="1.0"?>
+    <ListHostedZonesResponse xmlns="https://route53.amazonaws.com/doc/2012-02-29/"><HostedZones><HostedZone><Id>/hostedzone/Z14L0C73CHH1DN</Id><Name>example1.com.</Name><CallerReference>41747982-568E-0DFC-8C11-71C23757C740</CallerReference><Config><Comment>test</Comment></Config><ResourceRecordSetCount>9</ResourceRecordSetCount></HostedZone></HostedZones><IsTruncated>false</IsTruncated><MaxItems>100</MaxItems></ListHostedZonesResponse>
+    # -------- end 33145616:33126160 response ----------
+
+Human friendly formatted XML response:
+
+.. sourcecode:: bash
+
+    LIBCLOUD_DEBUG=/dev/stderr LIBCLOUD_DEBUG_PRETTY_PRINT_RESPONSE=1 python my_script.py
+
+.. sourcecode:: bash
+
+    # -------- begin 19444496:19425040 response ----------
+    HTTP/1.1 200 OK
+    X-Amzn-Requestid: 01c02441-368f-11e4-b616-9b9bd7509a8f
+    Date: Sun, 07 Sep 2014 13:00:56 GMT
+    Content-Length: 457
+    Content-Type: text/xml
+
+    <?xml version="1.0" ?>
+    <ListHostedZonesResponse xmlns="https://route53.amazonaws.com/doc/2012-02-29/">
+        <HostedZones>
+            <HostedZone>
+                <Id>/hostedzone/Z14L0C73CHH1DN</Id>
+                <Name>example1.com.</Name>
+                <CallerReference>41747982-568E-0DFC-8C11-71C23757C740</CallerReference>
+                <Config>
+                    <Comment>test</Comment>
+                </Config>
+                <ResourceRecordSetCount>9</ResourceRecordSetCount>
+            </HostedZone>
+        </HostedZones>
+        <IsTruncated>false</IsTruncated>
+        <MaxItems>100</MaxItems>
+    </ListHostedZonesResponse>
+
+    # -------- end 19444496:19425040 response ----------

http://git-wip-us.apache.org/repos/asf/libcloud/blob/039ecec2/libcloud/common/base.py
----------------------------------------------------------------------
diff --git a/libcloud/common/base.py b/libcloud/common/base.py
index f559c22..1d05b4b 100644
--- a/libcloud/common/base.py
+++ b/libcloud/common/base.py
@@ -20,6 +20,8 @@ import copy
 import binascii
 import time
 
+import xml.dom.minidom
+
 try:
     from lxml import etree as ET
 except ImportError:
@@ -308,21 +310,28 @@ class LoggingConnection():
         elif encoding in ['gzip', 'x-gzip']:
             body = decompress_data('gzip', body)
 
-        pretty_print_json = os.environ.get('LIBCLOUD_DEBUG_PRETTY_PRINT_JSON',
-                                           False)
+        pretty_print = os.environ.get('LIBCLOUD_DEBUG_PRETTY_PRINT_RESPONSE',
+                                      False)
 
         if r.chunked:
             ht += "%x\r\n" % (len(body))
-            ht += u(body)
+            ht += body.decode('utf-8')
             ht += "\r\n0\r\n"
         else:
-            if pretty_print_json and content_type == 'application/json':
+            if pretty_print and content_type == 'application/json':
                 try:
-                    body = json.loads(u(body))
+                    body = json.loads(body.decode('utf-8'))
                     body = json.dumps(body, sort_keys=True, indent=4)
                 except:
                     # Invalid JSON or server is lying about content-type
                     pass
+            elif pretty_print and content_type == 'text/xml':
+                try:
+                    elem = xml.dom.minidom.parseString(body.decode('utf-8'))
+                    body = elem.toprettyxml()
+                except Exception:
+                    # Invalid XML
+                    pass
 
             ht += u(body)