1
+ import http
2
+ import json
1
3
import platform
2
4
3
5
import httpx
4
- from kiota_http .middleware . middleware import BaseMiddleware
6
+ from kiota_http .middleware import AsyncKiotaTransport , BaseMiddleware , RedirectHandler , RetryHandler
5
7
from urllib3 .util import parse_url
6
8
7
9
from .._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
10
16
11
17
12
18
class GraphTelemetryHandler (BaseMiddleware ):
13
19
"""Middleware component that attaches metadata to a Graph request in order to help
14
20
the SDK team improve the developer experience.
15
21
"""
16
22
17
- async def send (
18
- self , request : GraphRequest , transport : httpx .AsyncBaseTransport
19
- ) -> httpx .Response :
23
+ async def send (self , request : GraphRequest , transport : AsyncKiotaTransport ):
20
24
"""Adds telemetry headers and sends the http request.
21
25
"""
26
+ self .set_request_context_and_feature_usage (request , transport )
27
+
22
28
if self .is_graph_url (request .url ):
23
29
self ._add_client_request_id_header (request )
24
30
self ._append_sdk_version_header (request )
@@ -28,6 +34,27 @@ async def send(
28
34
response = await super ().send (request , transport )
29
35
return response
30
36
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
+
31
58
def is_graph_url (self , url ):
32
59
"""Check if the request is made to a graph endpoint. We do not add telemetry headers to
33
60
non-graph endpoints"""
0 commit comments