Skip to content

Commit e17b22e

Browse files
committed
Set context and feature usage in transport
1 parent 9c3853a commit e17b22e

File tree

4 files changed

+53
-29
lines changed

4 files changed

+53
-29
lines changed

src/msgraph_core/graph_client_factory.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,10 @@
88

99
import httpx
1010
from kiota_http.kiota_client_factory import KiotaClientFactory
11-
from kiota_http.middleware import AsyncKiotaTransport
1211
from kiota_http.middleware.middleware import BaseMiddleware
1312

1413
from ._enums import APIVersion, NationalClouds
15-
from .middleware import GraphTelemetryHandler
14+
from .middleware import AsyncGraphTransport, GraphTelemetryHandler
1615

1716

1817
class GraphClientFactory(KiotaClientFactory):
@@ -40,9 +39,10 @@ def create_with_default_middleware(
4039
middleware, current_transport
4140
)
4241

43-
client._transport = AsyncKiotaTransport(
42+
client._transport = AsyncGraphTransport(
4443
transport=current_transport, pipeline=middleware_pipeline
4544
)
45+
client._transport.pipeline
4646
return client
4747

4848
@staticmethod
@@ -66,7 +66,7 @@ def create_with_custom_middleware(
6666
middleware, current_transport
6767
)
6868

69-
client._transport = AsyncKiotaTransport(
69+
client._transport = AsyncGraphTransport(
7070
transport=current_transport, pipeline=middleware_pipeline
7171
)
7272
return client

src/msgraph_core/middleware/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
# Copyright (c) Microsoft Corporation.
33
# Licensed under the MIT License.
44
# ------------------------------------
5+
from .async_graph_transport import AsyncGraphTransport
56
from .request_context import GraphRequestContext
67
from .telemetry import GraphTelemetryHandler
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import json
2+
3+
import httpx
4+
from kiota_http.middleware import MiddlewarePipeline, RedirectHandler, RetryHandler
5+
6+
from .._enums import FeatureUsageFlag
7+
from .request_context import GraphRequestContext
8+
9+
10+
class AsyncGraphTransport(httpx.AsyncBaseTransport):
11+
"""A custom transport for requests to the Microsoft Graph API
12+
"""
13+
14+
def __init__(self, transport: httpx.AsyncBaseTransport, pipeline: MiddlewarePipeline) -> None:
15+
self.transport = transport
16+
self.pipeline = pipeline
17+
18+
async def handle_async_request(self, request: httpx.Request) -> httpx.Response:
19+
if self.pipeline:
20+
self.set_request_context_and_feature_usage(request)
21+
response = await self.pipeline.send(request)
22+
return response
23+
24+
response = await self.transport.handle_async_request(request)
25+
return response
26+
27+
def set_request_context_and_feature_usage(self, request: httpx.Request) -> httpx.Request:
28+
29+
request_options = {}
30+
options = request.headers.get('request_options', None)
31+
if options:
32+
request_options = json.loads(options)
33+
34+
context = GraphRequestContext(request_options, request.headers)
35+
middleware = self.pipeline._first_middleware
36+
while middleware:
37+
if isinstance(middleware, RedirectHandler):
38+
context.feature_usage = FeatureUsageFlag.REDIRECT_HANDLER_ENABLED
39+
if isinstance(middleware, RetryHandler):
40+
context.feature_usage = FeatureUsageFlag.RETRY_HANDLER_ENABLED
41+
42+
middleware = middleware.next
43+
request.context = context #type: ignore
44+
return request

src/msgraph_core/middleware/telemetry.py

Lines changed: 4 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
import platform
44

55
import httpx
6-
from kiota_http.middleware import AsyncKiotaTransport, BaseMiddleware, RedirectHandler, RetryHandler
6+
from kiota_http.middleware import BaseMiddleware
77
from urllib3.util import parse_url
88

99
from .._constants import SDK_VERSION
10-
from .._enums import FeatureUsageFlag, NationalClouds
10+
from .._enums import NationalClouds
11+
from .async_graph_transport import AsyncGraphTransport
1112
from .request_context import GraphRequestContext
1213

1314

@@ -20,10 +21,9 @@ class GraphTelemetryHandler(BaseMiddleware):
2021
the SDK team improve the developer experience.
2122
"""
2223

23-
async def send(self, request: GraphRequest, transport: AsyncKiotaTransport):
24+
async def send(self, request: GraphRequest, transport: AsyncGraphTransport):
2425
"""Adds telemetry headers and sends the http request.
2526
"""
26-
self.set_request_context_and_feature_usage(request, transport)
2727

2828
if self.is_graph_url(request.url):
2929
self._add_client_request_id_header(request)
@@ -34,27 +34,6 @@ async def send(self, request: GraphRequest, transport: AsyncKiotaTransport):
3434
response = await super().send(request, transport)
3535
return response
3636

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-
5837
def is_graph_url(self, url):
5938
"""Check if the request is made to a graph endpoint. We do not add telemetry headers to
6039
non-graph endpoints"""

0 commit comments

Comments
 (0)