Spaces:
Build error
Build error
Validify-testbot-1
/
botbuilder-python
/libraries
/botbuilder-applicationinsights
/botbuilder
/applicationinsights
/django
/bot_telemetry_middleware.py
# Copyright (c) Microsoft Corporation. All rights reserved. | |
# Licensed under the MIT License. | |
"""Bot Telemetry Middleware.""" | |
from threading import current_thread | |
# Map of thread id => POST body text | |
_REQUEST_BODIES = {} | |
def retrieve_bot_body(): | |
""" | |
Retrieve the POST body text from temporary cache. | |
The POST body corresponds to the thread ID and must reside in the cache just for the lifetime of the request. | |
""" | |
result = _REQUEST_BODIES.get(current_thread().ident, None) | |
return result | |
class BotTelemetryMiddleware: | |
""" | |
Save off the POST body to later populate bot-specific properties to add to Application Insights. | |
Example activating MIDDLEWARE in Django settings: | |
.. code-block:: python | |
MIDDLEWARE = [ | |
# Ideally add somewhere near top | |
'botbuilder.applicationinsights.django.BotTelemetryMiddleware', | |
... | |
] | |
""" | |
def __init__(self, get_response): | |
self.get_response = get_response | |
def __call__(self, request): | |
self.process_request(request) | |
response = self.get_response(request) | |
_REQUEST_BODIES.pop(current_thread().ident, None) | |
return response | |
def process_request(self, request) -> bool: | |
"""Process the incoming Django request.""" | |
# Bot Service doesn't handle anything over 256k | |
# TODO: Add length check | |
body_unicode = ( | |
request.body.decode("utf-8") if request.method == "POST" else None | |
) | |
# Sanity check JSON | |
if body_unicode is not None: | |
# Integration layer expecting just the json text. | |
_REQUEST_BODIES[current_thread().ident] = body_unicode | |
return True | |