private IObservable <Unit> GetMetadataAsync(AuthInterceptorContext context, IntPtr callbackPtr, IntPtr userDataPtr)
 {
     try
     {
         var metadata = new Metadata();
         return(interceptor(context, metadata)
                .ForEachAsync(_ =>
         {
             using (var metadataArray = MetadataArraySafeHandle.Create(metadata))
             {
                 Native.grpcsharp_metadata_credentials_notify_from_plugin(callbackPtr, userDataPtr, metadataArray, StatusCode.OK, null);
             }
         })
                .Catch((Exception e) =>
         {
             Native.grpcsharp_metadata_credentials_notify_from_plugin(callbackPtr, userDataPtr, MetadataArraySafeHandle.Create(Metadata.Empty), StatusCode.Unknown, GetMetadataExceptionMsg);
             Logger.Error(e, GetMetadataExceptionMsg);
             return Observable.ReturnUnit();
         }));
     }
     catch (Exception e)
     {
         Native.grpcsharp_metadata_credentials_notify_from_plugin(callbackPtr, userDataPtr, MetadataArraySafeHandle.Create(Metadata.Empty), StatusCode.Unknown, GetMetadataExceptionMsg);
         Logger.Error(e, GetMetadataExceptionMsg);
         return(Observable.ReturnUnit());
     }
 }
Example #2
0
        public static Task MyAsyncAuthInterceptor(AuthInterceptorContext context, Metadata metadata)
        {
            metadata.Add("token", "abc");
            var st = channel.State;

            return(Task.FromResult(0));
        }
Example #3
0
        private async Task ReadCredentialMetadata(HttpClient client, HttpRequestMessage message, CallCredentials credentials)
        {
            var configurator = new CallCredentialsConfigurator();

            credentials.InternalPopulateConfiguration(configurator, null);

            if (configurator.Interceptor != null)
            {
                var authInterceptorContext = new AuthInterceptorContext(client.BaseAddress.OriginalString, Method.FullName);
                var metadata = new Metadata();
                await configurator.Interceptor(authInterceptorContext, metadata).ConfigureAwait(false);

                foreach (var entry in metadata)
                {
                    AddHeader(message.Headers, entry);
                }
            }

            if (configurator.Credentials != null)
            {
                foreach (var c in configurator.Credentials)
                {
                    await ReadCredentialMetadata(client, message, c).ConfigureAwait(false);
                }
            }
        }
Example #4
0
        private async Task AddAuthHeadersAsync(HttpRequestMessage request, RestMethod method)
        {
            Uri    hostUri            = request.RequestUri.IsAbsoluteUri ? request.RequestUri : _httpClient.BaseAddress;
            string schemeAndAuthority = hostUri.GetLeftPart(UriPartial.Authority);

            var metadata = new Metadata();
            var context  = new AuthInterceptorContext(schemeAndAuthority, method.FullName);

            await _channelAuthInterceptor(context, metadata).ConfigureAwait(false);

            foreach (var entry in metadata)
            {
                request.Headers.Add(entry.Key, entry.Value);
            }
        }
Example #5
0
        private async void StartGetMetadata(AuthInterceptorContext context, IntPtr callbackPtr, IntPtr userDataPtr)
        {
            try
            {
                var metadata = new Metadata();
                await interceptor(context, metadata).ConfigureAwait(false);

                using (var metadataArray = MetadataArraySafeHandle.Create(metadata))
                {
                    Native.grpcsharp_metadata_credentials_notify_from_plugin(callbackPtr, userDataPtr, metadataArray, StatusCode.OK, null);
                }
            }
            catch (Exception e)
            {
                Native.grpcsharp_metadata_credentials_notify_from_plugin(callbackPtr, userDataPtr, MetadataArraySafeHandle.Create(Metadata.Empty), StatusCode.Unknown, GetMetadataExceptionMsg);
                Logger.Error(e, GetMetadataExceptionMsg);
            }
        }
Example #6
0
        private void NativeMetadataInterceptorHandler(IntPtr statePtr, IntPtr serviceUrlPtr, IntPtr methodNamePtr, IntPtr callbackPtr, IntPtr userDataPtr, bool isDestroy)
        {
            if (isDestroy)
            {
                gcHandle.Free();
                return;
            }

            try
            {
                var context = new AuthInterceptorContext(Marshal.PtrToStringAnsi(serviceUrlPtr),
                                                         Marshal.PtrToStringAnsi(methodNamePtr));
                StartGetMetadata(context, callbackPtr, userDataPtr);
            }
            catch (Exception e)
            {
                Native.grpcsharp_metadata_credentials_notify_from_plugin(callbackPtr, userDataPtr, MetadataArraySafeHandle.Create(Metadata.Empty), StatusCode.Unknown, GetMetadataExceptionMsg);
                Logger.Error(e, GetMetadataExceptionMsg);
            }
        }
        private void NativeMetadataInterceptorHandler(IntPtr statePtr, IntPtr serviceUrlPtr, IntPtr methodNamePtr, IntPtr callbackPtr, IntPtr userDataPtr, bool isDestroy)
        {
            if (isDestroy)
            {
                gcHandle.Free();
                return;
            }

            try
            {
                var context = new AuthInterceptorContext(Marshal.PtrToStringAnsi(serviceUrlPtr), Marshal.PtrToStringAnsi(methodNamePtr));
                // Make a guarantee that credentials_notify_from_plugin is invoked async to be compliant with c-core API.
                ThreadPool.QueueUserWorkItem(async(stateInfo) => await GetMetadataAsync(context, callbackPtr, userDataPtr));
            }
            catch (Exception e)
            {
                Native.grpcsharp_metadata_credentials_notify_from_plugin(callbackPtr, userDataPtr, MetadataArraySafeHandle.Create(Metadata.Empty), StatusCode.Unknown, GetMetadataExceptionStatusMsg);
                Logger.Error(e, GetMetadataExceptionLogMsg);
            }
        }
Example #8
0
        private void NativeMetadataInterceptorHandler(IntPtr serviceUrlPtr, IntPtr methodNamePtr, IntPtr callbackPtr, IntPtr userDataPtr, bool isDestroy)
        {
            if (isDestroy)
            {
                this.callbackRegistration.Dispose();
                return;
            }

            try
            {
                var context = new AuthInterceptorContext(Marshal.PtrToStringAnsi(serviceUrlPtr), Marshal.PtrToStringAnsi(methodNamePtr));
                // Make a guarantee that credentials_notify_from_plugin is invoked async to be compliant with c-core API.
                ThreadPool.QueueUserWorkItem(async(stateInfo) => await GetMetadataAsync(context, callbackPtr, userDataPtr));
            }
            catch (Exception e)
            {
                // eat the exception, we must not throw when inside callback from native code.
                Logger.Error(e, "Exception occurred while invoking native metadata interceptor handler.");
            }
        }
        private void NativeMetadataInterceptorHandler(IntPtr statePtr, IntPtr serviceUrlPtr, IntPtr methodNamePtr, IntPtr callbackPtr, IntPtr userDataPtr, bool isDestroy)
        {
            if (isDestroy)
            {
                gcHandle.Free();
                return;
            }

            try
            {
                var context = new AuthInterceptorContext(Marshal.PtrToStringAnsi(serviceUrlPtr),
                                                         Marshal.PtrToStringAnsi(methodNamePtr));
                StartGetMetadata(context, callbackPtr, userDataPtr);
            }
            catch (Exception e)
            {
                Native.grpcsharp_metadata_credentials_notify_from_plugin(callbackPtr, userDataPtr, MetadataArraySafeHandle.Create(Metadata.Empty), StatusCode.Unknown, GetMetadataExceptionMsg);
                Logger.Error(e, GetMetadataExceptionMsg);
            }
        }
Example #10
0
        private async Task AddAuthHeadersAsync(HttpRequestMessage request, RestMethod restMethod, CancellationToken combinedCancellationToken)
        {
            Uri    hostUri            = request.RequestUri.IsAbsoluteUri ? request.RequestUri : _httpClient.BaseAddress;
            string schemeAndAuthority = hostUri.GetLeftPart(UriPartial.Authority);

            var metadata = new Metadata();
            var context  = new AuthInterceptorContext(schemeAndAuthority, restMethod.FullName);

            var combinedCancellationTask = Task.Delay(-1, combinedCancellationToken);
            var channelTask = _channelAuthInterceptor(context, metadata);
            var resultTask  = await Task.WhenAny(channelTask, combinedCancellationTask).ConfigureAwait(false);

            // If the combinedCancellationTask "wins" `Task.WhenAny` by being cancelled, the following await will throw TaskCancelledException.
            // If the channelTask "wins" by being faulted, the await will rethrow its exception.
            // Finally, if the channelTask completes, the await does nothing.
            await resultTask.ConfigureAwait(false);

            // If we're here, the channelTask has completed successfully.

            foreach (var entry in metadata)
            {
                request.Headers.Add(entry.Key, entry.Value);
            }
        }
        private void NativeMetadataInterceptorHandler(IntPtr serviceUrlPtr, IntPtr methodNamePtr, IntPtr callbackPtr, IntPtr userDataPtr, bool isDestroy)
        {
            if (isDestroy)
            {
                this.callbackRegistration.Dispose();
                return;
            }

            try
            {
                // NOTE: The serviceUrlPtr and methodNamePtr values come from the grpc_auth_metadata_context
                // and are only guaranteed to be valid until synchronous return of this handler.
                // We are effectively making a copy of these strings by creating C# string from the native char pointers,
                // and passing the resulting C# strings to the context is therefore safe.
                var context = new AuthInterceptorContext(Marshal.PtrToStringAnsi(serviceUrlPtr), Marshal.PtrToStringAnsi(methodNamePtr));
                // Make a guarantee that credentials_notify_from_plugin is invoked async to be compliant with c-core API.
                ThreadPool.QueueUserWorkItem(async(stateInfo) => await GetMetadataAsync(context, callbackPtr, userDataPtr));
            }
            catch (Exception e)
            {
                // eat the exception, we must not throw when inside callback from native code.
                Logger.Error(e, "Exception occurred while invoking native metadata interceptor handler.");
            }
        }
Example #12
0
        private async Task CustomAuthProcessor(AuthInterceptorContext context, Metadata metadata)
        {
            await Task.Run(() => metadata.Add("x-custom-auth-ticket", _Token));

            return;
        }
        private async void StartGetMetadata(AuthInterceptorContext context, IntPtr callbackPtr, IntPtr userDataPtr)
        {
            try
            {
                var metadata = new Metadata();
                await interceptor(context, metadata).ConfigureAwait(false);

                using (var metadataArray = MetadataArraySafeHandle.Create(metadata))
                {
                    Native.grpcsharp_metadata_credentials_notify_from_plugin(callbackPtr, userDataPtr, metadataArray, StatusCode.OK, null);
                }
            }
            catch (Exception e)
            {
                Native.grpcsharp_metadata_credentials_notify_from_plugin(callbackPtr, userDataPtr, MetadataArraySafeHandle.Create(Metadata.Empty), StatusCode.Unknown, GetMetadataExceptionMsg);
                Logger.Error(e, GetMetadataExceptionMsg);
            }
        }