# cf-turnstile
A Rust client for [Cloudflare Turnstile].
# Example
```rust,no_run
use cf_turnstile::{SiteVerifyRequest, TurnstileClient};
let client = TurnstileClient::new("my-secret".to_string().into());
let validated = client.siteverify(SiteVerifyRequest {
response: "myresponse".to_string(),
..Default::default()
}).await?;
assert!(validated.success);
```
## Features
### Idempotency
To utilize Turnstile's [`indempotency_key`](https://developers.cloudflare.com/turnstile/get-started/server-side-validation/#:~:text=A%20response%20may,for%20that%20response.) feature, you can enable the `idempotency` feature flag.
This will enable the `idempotency_key` field on the [`SiteVerifyRequest`](struct.SiteVerifyRequest.html) struct and the [`generate_indepotency_key`](fn.generate_indepotency_key.html) function.
### TLS
**Note**: not enabling any TLS feature is supported for use behind a proxy;
Turnstile's API is HTTPS only.
**Note**: this TLS code was taken from [twilight-http](https://github.com/twilight-rs/twilight/tree/main/twilight-http) in accodance with its license.
`cf-turnstile` has features to enable HTTPS connectivity with [`hyper`]. These
features are mutually exclusive. `rustls-native-roots` is enabled by default.
#### `native`
The `native` feature uses a HTTPS connector provided by [`hyper-tls`].
To enable `native`, do something like this in your `Cargo.toml`:
```toml
[dependencies]
cf-turnstile = { default-features = false, features = ["native"], version = "0.1" }
```
#### `rustls-native-roots`
The `rustls-native-roots` feature uses a HTTPS connector provided by [`hyper-rustls`], which uses
[`rustls`] as the TLS backend, and enables its `native-tokio` feature, which uses [`rustls-native-certs`]
for root certificates.
This is enabled by default.
#### `rustls-webpki-roots`
The `rustls-webpki-roots` feature uses a HTTPS connector provided by [`hyper-rustls`], which uses
[`rustls`] as the TLS backend, and enables its `webpki-tokio` feature, which uses [`webpki-roots`]
for root certificates.
This should be preferred over `rustls-native-roots` in Docker containers based on `scratch`.
### Trust-DNS
The `trust-dns` enables [`hyper-trust-dns`], which replaces the default
`GaiResolver` in [`hyper`]. [`hyper-trust-dns`] instead provides a fully
async DNS resolver on the application level.
[Cloudflare Turnstile]: https://developers.cloudflare.com/turnstile/
[`hyper`]: https://crates.io/crates/hyper
[`hyper-rustls`]: https://crates.io/crates/hyper-rustls
[`hyper-tls`]: https://crates.io/crates/hyper-tls
[`rustls`]: https://crates.io/crates/rustls
[`rustls-native-certs`]: https://crates.io/crates/rustls-native-certs
[`hyper-trust-dns`]: https://crates.io/crates/hyper-trust-dns
[`webpki-roots`]: https://crates.io/crates/webpki-roots