Elfocrash / Cosmonaut

🌐 A supercharged Azure CosmosDB .NET SDK with ORM support
https://cosmonaut.readthedocs.io
MIT License
342 stars 44 forks source link

Proxy Support #56

Open goda opened 5 years ago

goda commented 5 years ago

Can support be added for proxy authentication? Version 2.2.1 of Azure.DocumentDB allows for specifying an HttpClientHandler in the DocumentClient constructor , through which proxy settings can be set so that anyone behind a proxy can connect to Azure Cosmos DB?

I'm using it like this in my own implementation: var documentClient = new DocumentClient(serviceEndpoint, authKey, handler: handler);

Elfocrash commented 5 years ago

Hey @goda,

Cosmonaut allows you to provide your own IDocumentClient through the ICosmonautClient which is required in one of the constructors for the CosmosStore so a temporary workaround would be to register that in your IoC.

I am definitely interested in add this in a more user friendly way. Do you have any proposals on how you can see this working with Cosmonaut?

Thanks, Nick

goda commented 5 years ago

Thanks Nick! The workaround was simple to implement and works very well. Great work on the library - I'm planning on spending some time to integrate it into my project which uses repository pattern to access Cosmos.

In terms of a suggestion to make the proxy option easier to implement, to me it seems like it is doable via some minor changes.

Adding a property of type HttpClientHandler (e.g. ClientHandler) to CosmosStoreSettings would allow one to simply pass the proxy configured HttpClientHandler when initializing the CosmosStoreSettings. Finally a simple change to the DocumentClientFactory method is required:

        internal static IDocumentClient CreateDocumentClient(CosmosStoreSettings settings)
        {
            return new DocumentClient(settings.EndpointUrl, settings.AuthKey, settings.ClientHandler ?? new HttpClientHandler(), settings.ConnectionPolicy ?? ConnectionPolicy.Default, settings.ConsistencyLevel);
        }

The only caveat with this is that due to the limited DocumentClient constructor overloads - currently it is not possible to both have HttpClientHandler and JsonSerializerSettings passed. I'm sure there are other ways of working around this issue but I haven't explored since I don't need the JsonSerializerSettings option.

Elfocrash commented 5 years ago

Hey @goda I had a look into this and it looks like, unless I use reflection, there is no way to have both an HttpClientHandler and JsonSerializerSettings like you mentioned. I don't really wanna use reflection on this one, so I'll try to raise it with the CosmosDB team.