userAgentPolicy.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // Copyright (c) Microsoft Corporation. All rights reserved.
  2. // Licensed under the MIT License. See License.txt in the project root for license information.
  3. import { HttpHeaders } from "../httpHeaders";
  4. import { HttpOperationResponse } from "../httpOperationResponse";
  5. import { Constants } from "../util/constants";
  6. import { WebResource } from "../webResource";
  7. import { getDefaultUserAgentKey, getPlatformSpecificData } from "./msRestUserAgentPolicy";
  8. import { BaseRequestPolicy, RequestPolicy, RequestPolicyFactory, RequestPolicyOptions } from "./requestPolicy";
  9. export type TelemetryInfo = { key?: string; value?: string };
  10. function getRuntimeInfo(): TelemetryInfo[] {
  11. const msRestRuntime = {
  12. key: "ms-rest-js",
  13. value: Constants.msRestVersion
  14. };
  15. return [msRestRuntime];
  16. }
  17. function getUserAgentString(telemetryInfo: TelemetryInfo[], keySeparator = " ", valueSeparator = "/"): string {
  18. return telemetryInfo.map(info => {
  19. const value = info.value ? `${valueSeparator}${info.value}` : "";
  20. return `${info.key}${value}`;
  21. }).join(keySeparator);
  22. }
  23. export const getDefaultUserAgentHeaderName = getDefaultUserAgentKey;
  24. export function getDefaultUserAgentValue(): string {
  25. const runtimeInfo = getRuntimeInfo();
  26. const platformSpecificData = getPlatformSpecificData();
  27. const userAgent = getUserAgentString(runtimeInfo.concat(platformSpecificData));
  28. return userAgent;
  29. }
  30. export function userAgentPolicy(userAgentData?: TelemetryInfo): RequestPolicyFactory {
  31. const key: string = (!userAgentData || userAgentData.key == undefined) ? getDefaultUserAgentKey() : userAgentData.key;
  32. const value: string = (!userAgentData || userAgentData.value == undefined) ? getDefaultUserAgentValue() : userAgentData.value;
  33. return {
  34. create: (nextPolicy: RequestPolicy, options: RequestPolicyOptions) => {
  35. return new UserAgentPolicy(nextPolicy, options, key, value);
  36. }
  37. };
  38. }
  39. export class UserAgentPolicy extends BaseRequestPolicy {
  40. constructor(readonly _nextPolicy: RequestPolicy, readonly _options: RequestPolicyOptions, protected headerKey: string, protected headerValue: string) {
  41. super(_nextPolicy, _options);
  42. }
  43. sendRequest(request: WebResource): Promise<HttpOperationResponse> {
  44. this.addUserAgentHeader(request);
  45. return this._nextPolicy.sendRequest(request);
  46. }
  47. addUserAgentHeader(request: WebResource): void {
  48. if (!request.headers) {
  49. request.headers = new HttpHeaders();
  50. }
  51. if (!request.headers.get(this.headerKey) && this.headerValue) {
  52. request.headers.set(this.headerKey, this.headerValue);
  53. }
  54. }
  55. }