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()); } }
public static Task MyAsyncAuthInterceptor(AuthInterceptorContext context, Metadata metadata) { metadata.Add("token", "abc"); var st = channel.State; return(Task.FromResult(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); } } }
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); } }
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); } }
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); } }
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 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."); } }
private async Task CustomAuthProcessor(AuthInterceptorContext context, Metadata metadata) { await Task.Run(() => metadata.Add("x-custom-auth-ticket", _Token)); return; }