1+ import http
2+ import json
13import platform
24
35import httpx
4- from kiota_http .middleware . middleware import BaseMiddleware
6+ from kiota_http .middleware import AsyncKiotaTransport , BaseMiddleware , RedirectHandler , RetryHandler
57from urllib3 .util import parse_url
68
79from .._constants import SDK_VERSION
8- from .._enums import NationalClouds
9- from .middleware import GraphRequest
10+ from .._enums import FeatureUsageFlag , NationalClouds
11+ from .request_context import GraphRequestContext
12+
13+
14+ class GraphRequest (httpx .Request ):
15+ context : GraphRequestContext
1016
1117
1218class GraphTelemetryHandler (BaseMiddleware ):
1319 """Middleware component that attaches metadata to a Graph request in order to help
1420 the SDK team improve the developer experience.
1521 """
1622
17- async def send (
18- self , request : GraphRequest , transport : httpx .AsyncBaseTransport
19- ) -> httpx .Response :
23+ async def send (self , request : GraphRequest , transport : AsyncKiotaTransport ):
2024 """Adds telemetry headers and sends the http request.
2125 """
26+ self .set_request_context_and_feature_usage (request , transport )
27+
2228 if self .is_graph_url (request .url ):
2329 self ._add_client_request_id_header (request )
2430 self ._append_sdk_version_header (request )
@@ -28,6 +34,27 @@ async def send(
2834 response = await super ().send (request , transport )
2935 return response
3036
37+ def set_request_context_and_feature_usage (
38+ self , request : GraphRequest , transport : AsyncKiotaTransport
39+ ) -> GraphRequest :
40+
41+ request_options = {}
42+ options = request .headers .pop ('request_options' , None )
43+ if options :
44+ request_options = json .loads (options )
45+
46+ request .context = GraphRequestContext (request_options , request .headers )
47+ middleware = transport .pipeline ._first_middleware
48+ while middleware :
49+ if isinstance (middleware , RedirectHandler ):
50+ request .context .feature_usage = FeatureUsageFlag .REDIRECT_HANDLER_ENABLED
51+ if isinstance (middleware , RetryHandler ):
52+ request .context .feature_usage = FeatureUsageFlag .RETRY_HANDLER_ENABLED
53+
54+ middleware = middleware .next
55+
56+ return request
57+
3158 def is_graph_url (self , url ):
3259 """Check if the request is made to a graph endpoint. We do not add telemetry headers to
3360 non-graph endpoints"""
0 commit comments