private static void OnSigningComplete(ulong id, int errorCode, string uri, HttpHeader[] headers, uint headerCount) { SigningCallback callback = PendingCallbacks.ReleaseStrongReference(id); if (callback == null) { return; } if (errorCode != 0) { callback.TaskSource.SetException(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.TaskSource.SetResult(signedRequest); } }
public static Task <HttpRequest> SignRequest(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; } SigningCallback callback = new SigningCallback(); 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 = PendingCallbacks.AcquireStrongReference(callback); API.SignRequestNative(request.Method, request.Uri, request.Headers, headerCount, callback.BodyStream.Delegates, nativeConfig, id, API.OnSigningComplete); return(callback.TaskSource.Task); }