mvantellingen / python-zeep

A Python SOAP client
http://docs.python-zeep.org
Other
1.88k stars 586 forks source link

Access to HTTP request? #1397

Open silentbugs opened 11 months ago

silentbugs commented 11 months ago

Is it possible to directly access the request (python requests) object for low level HTTP handling?

I am writing a logger plugin and wanted to also log raw HTTP-related things, such as the method, request headers, request body, response headers, response body.

atlantis-dsf commented 8 months ago

You can generally turn on logging by the requests module like this

import logging
from http.client import HTTPConnection

def debug_requests_on():
    """Switches on logging of the requests module."""
    HTTPConnection.debuglevel = 1

    logging.basicConfig()
    logging.getLogger().setLevel(logging.DEBUG)
    requests_log = logging.getLogger("requests.packages.urllib3")
    requests_log.setLevel(logging.DEBUG)
    requests_log.propagate = True

debug_requests_on()

Sadly I don't have the link from where I got it, but it's proven very useful

Another way you can do this is by creating request/response hooks for a session and using that session as transport

from zeep.client import Client
from zeep.transports import Transport
from requests import Session, Response

def log_traffic(r: Response):
    print(r.headers, r.request.body, "etc...")

with Session() as s:
    s.hooks["response"].append(lambda r, *args, **kwargs: log_traffic(r))
    transport = Transport(session=s)
    c = Client(transport=transport)
    response = c.service.myoperation()