1 | import { __extends } from "tslib";
|
2 | import * as utils from "../util/utils";
|
3 | import { BaseRequestPolicy, } from "./requestPolicy";
|
4 | export function rpRegistrationPolicy(retryTimeout) {
|
5 | if (retryTimeout === void 0) { retryTimeout = 30; }
|
6 | return {
|
7 | create: function (nextPolicy, options) {
|
8 | return new RPRegistrationPolicy(nextPolicy, options, retryTimeout);
|
9 | },
|
10 | };
|
11 | }
|
12 | var RPRegistrationPolicy = (function (_super) {
|
13 | __extends(RPRegistrationPolicy, _super);
|
14 | function RPRegistrationPolicy(nextPolicy, options, _retryTimeout) {
|
15 | if (_retryTimeout === void 0) { _retryTimeout = 30; }
|
16 | var _this = _super.call(this, nextPolicy, options) || this;
|
17 | _this._retryTimeout = _retryTimeout;
|
18 | return _this;
|
19 | }
|
20 | RPRegistrationPolicy.prototype.sendRequest = function (request) {
|
21 | var _this = this;
|
22 | return this._nextPolicy
|
23 | .sendRequest(request.clone())
|
24 | .then(function (response) { return registerIfNeeded(_this, request, response); });
|
25 | };
|
26 | return RPRegistrationPolicy;
|
27 | }(BaseRequestPolicy));
|
28 | export { RPRegistrationPolicy };
|
29 | function registerIfNeeded(policy, request, response) {
|
30 | if (response.status === 409) {
|
31 | var rpName = checkRPNotRegisteredError(response.bodyAsText);
|
32 | if (rpName) {
|
33 | var urlPrefix = extractSubscriptionUrl(request.url);
|
34 | return (registerRP(policy, urlPrefix, rpName, request)
|
35 |
|
36 |
|
37 |
|
38 | .catch(function () { return false; })
|
39 | .then(function (registrationStatus) {
|
40 | if (registrationStatus) {
|
41 |
|
42 |
|
43 | request.headers.set("x-ms-client-request-id", utils.generateUuid());
|
44 | return policy._nextPolicy.sendRequest(request.clone());
|
45 | }
|
46 | return response;
|
47 | }));
|
48 | }
|
49 | }
|
50 | return Promise.resolve(response);
|
51 | }
|
52 |
|
53 |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 | function getRequestEssentials(originalRequest, reuseUrlToo) {
|
59 | if (reuseUrlToo === void 0) { reuseUrlToo = false; }
|
60 | var reqOptions = originalRequest.clone();
|
61 | if (reuseUrlToo) {
|
62 | reqOptions.url = originalRequest.url;
|
63 | }
|
64 |
|
65 |
|
66 | reqOptions.headers.set("x-ms-client-request-id", utils.generateUuid());
|
67 |
|
68 | reqOptions.headers.set("Content-Type", "application/json; charset=utf-8");
|
69 | return reqOptions;
|
70 | }
|
71 |
|
72 |
|
73 |
|
74 |
|
75 |
|
76 |
|
77 | function checkRPNotRegisteredError(body) {
|
78 | var result, responseBody;
|
79 | if (body) {
|
80 | try {
|
81 | responseBody = JSON.parse(body);
|
82 | }
|
83 | catch (err) {
|
84 |
|
85 | }
|
86 | if (responseBody &&
|
87 | responseBody.error &&
|
88 | responseBody.error.message &&
|
89 | responseBody.error.code &&
|
90 | responseBody.error.code === "MissingSubscriptionRegistration") {
|
91 | var matchRes = responseBody.error.message.match(/.*'(.*)'/i);
|
92 | if (matchRes) {
|
93 | result = matchRes.pop();
|
94 | }
|
95 | }
|
96 | }
|
97 | return result;
|
98 | }
|
99 |
|
100 |
|
101 |
|
102 |
|
103 |
|
104 |
|
105 | function extractSubscriptionUrl(url) {
|
106 | var result;
|
107 | var matchRes = url.match(/.*\/subscriptions\/[a-f0-9-]+\//gi);
|
108 | if (matchRes && matchRes[0]) {
|
109 | result = matchRes[0];
|
110 | }
|
111 | else {
|
112 | throw new Error("Unable to extract subscriptionId from the given url - " + url + ".");
|
113 | }
|
114 | return result;
|
115 | }
|
116 |
|
117 |
|
118 |
|
119 |
|
120 |
|
121 |
|
122 |
|
123 |
|
124 |
|
125 | function registerRP(policy, urlPrefix, provider, originalRequest) {
|
126 | var postUrl = urlPrefix + "providers/" + provider + "/register?api-version=2016-02-01";
|
127 | var getUrl = urlPrefix + "providers/" + provider + "?api-version=2016-02-01";
|
128 | var reqOptions = getRequestEssentials(originalRequest);
|
129 | reqOptions.method = "POST";
|
130 | reqOptions.url = postUrl;
|
131 | return policy._nextPolicy.sendRequest(reqOptions).then(function (response) {
|
132 | if (response.status !== 200) {
|
133 | throw new Error("Autoregistration of " + provider + " failed. Please try registering manually.");
|
134 | }
|
135 | return getRegistrationStatus(policy, getUrl, originalRequest);
|
136 | });
|
137 | }
|
138 |
|
139 |
|
140 |
|
141 |
|
142 |
|
143 |
|
144 |
|
145 |
|
146 |
|
147 | function getRegistrationStatus(policy, url, originalRequest) {
|
148 | var reqOptions = getRequestEssentials(originalRequest);
|
149 | reqOptions.url = url;
|
150 | reqOptions.method = "GET";
|
151 | return policy._nextPolicy.sendRequest(reqOptions).then(function (res) {
|
152 | var obj = res.parsedBody;
|
153 | if (res.parsedBody && obj.registrationState && obj.registrationState === "Registered") {
|
154 | return true;
|
155 | }
|
156 | else {
|
157 | return utils
|
158 | .delay(policy._retryTimeout * 1000)
|
159 | .then(function () { return getRegistrationStatus(policy, url, originalRequest); });
|
160 | }
|
161 | });
|
162 | }
|
163 |
|
\ | No newline at end of file |