in src/WebJobs.Extensions.DurableTask/HttpApiHandler.cs [1256:1316]
private HttpManagementPayload GetClientResponseLinks(
HttpRequestMessage request,
string instanceId,
string taskHubName,
string connectionName,
bool returnInternalServerErrorOnFailure = false)
{
Uri notificationUri = this.GetWebhookUri();
Uri baseUri = request?.RequestUri ?? notificationUri;
bool useForwardedHost = this.config.Options.HttpSettings.UseForwardedHost;
if (useForwardedHost && request != null)
{
if (request.Headers.TryGetValues("X-Forwarded-Host", out var forwardedHost) &&
request.Headers.TryGetValues("X-Forwarded-Proto", out var forwardedProto))
{
baseUri = new UriBuilder(baseUri)
{
Host = forwardedHost.FirstOrDefault(),
Scheme = forwardedProto.FirstOrDefault(),
}.Uri;
}
}
// e.g. http://{host}/runtime/webhooks/durabletask?code={systemKey}
string hostUrl = baseUri.GetLeftPart(UriPartial.Authority);
string baseUrl = hostUrl + notificationUri.AbsolutePath.TrimEnd('/');
string allInstancesPrefix = baseUrl + "/" + InstancesControllerSegment;
string instancePrefix = allInstancesPrefix + WebUtility.UrlEncode(instanceId);
string taskHub = WebUtility.UrlEncode(taskHubName ?? this.durableTaskOptions.HubName);
string connection = WebUtility.UrlEncode(connectionName ?? this.config.GetDefaultConnectionName());
string querySuffix = $"{TaskHubParameter}={taskHub}&{ConnectionParameter}={connection}";
if (!string.IsNullOrEmpty(notificationUri.Query))
{
// This is expected to include the auto-generated system key for this extension.
querySuffix += "&" + notificationUri.Query.TrimStart('?');
}
var httpManagementPayload = new HttpManagementPayload
{
Id = instanceId,
StatusQueryGetUri = instancePrefix + "?" + querySuffix,
SendEventPostUri = instancePrefix + "/" + RaiseEventOperation + "/{eventName}?" + querySuffix,
TerminatePostUri = instancePrefix + "/" + TerminateOperation + "?reason={text}&" + querySuffix,
RewindPostUri = instancePrefix + "/" + RewindOperation + "?reason={text}&" + querySuffix,
PurgeHistoryDeleteUri = instancePrefix + "?" + querySuffix,
RestartPostUri = instancePrefix + "/" + RestartOperation + "?" + querySuffix,
SuspendPostUri = instancePrefix + "/" + SuspendOperation + "?reason={text}&" + querySuffix,
ResumePostUri = instancePrefix + "/" + ResumeOperation + "?reason={text}&" + querySuffix,
};
if (returnInternalServerErrorOnFailure)
{
httpManagementPayload.StatusQueryGetUri += "&returnInternalServerErrorOnFailure=true";
}
return httpManagementPayload;
}