private static void OnHttpRequestSigningComplete(ulong id, int errorCode, string uri, HttpHeader[] headers, uint headerCount) { HttpRequestSigningCallback callback = PendingHttpRequestSignings.ReleaseStrongReference(id); if (callback == null) { return; } if (errorCode != 0) { callback.Result.CompleteExceptionally(new CrtException(errorCode)); } else { HttpRequest sourceRequest = callback.OriginalRequest; HttpRequest signedRequest = new HttpRequest(); signedRequest.Method = sourceRequest.Method; signedRequest.Uri = uri; signedRequest.Headers = headers; signedRequest.BodyStream = sourceRequest.BodyStream; callback.Result.Complete(signedRequest); } }
public static CrtResult <HttpRequest> SignHttpRequest(HttpRequest request, AwsSigningConfig signingConfig) { if (request == null || signingConfig == null) { throw new CrtException("Null argument passed to SignRequest"); } if (request.BodyStream != null) { if (!request.BodyStream.CanSeek) { throw new CrtException("Http request payload stream must be seekable in order to be signed"); } } var nativeConfig = new AwsSigningConfigNative(signingConfig); uint headerCount = 0; if (request.Headers != null) { headerCount = (uint)request.Headers.Length; } HttpRequestSigningCallback callback = new HttpRequestSigningCallback(); callback.OriginalRequest = request; /* needed to build final signed request */ callback.ShouldSignHeader = signingConfig.ShouldSignHeader; /* prevent GC while signing */ callback.BodyStream = new CrtStreamWrapper(request.BodyStream); ulong id = PendingHttpRequestSignings.AcquireStrongReference(callback); API.SignRequestNative(request.Method, request.Uri, request.Headers, headerCount, callback.BodyStream.Delegates, nativeConfig, id, API.OnHttpRequestSigningComplete); return(callback.Result); }