#ifndef OAUTH2_PRIVATE_H
#define OAUTH2_PRIVATE_H

struct json_tree;
struct dcrypt_public_key;

struct oauth2_request {
	pool_t pool;

	const struct oauth2_settings *set;
	struct http_client_request *req;
	struct json_istream *json_istream;
	struct istream *is;
	struct io *io;

	const char *delayed_error;
	struct timeout *to_delayed_error;

	const char *username;
	const char *key_file_template;

	void (*json_parsed_cb)(struct oauth2_request *, const char *error);

	ARRAY_TYPE(oauth2_field) fields;

	oauth2_request_callback_t *req_callback;
	void *req_context;
	/* indicates whether token is valid */
	unsigned int response_status;
};

void oauth2_request_parse_json(struct oauth2_request *req);
int oauth2_json_tree_build(const buffer_t *json, struct json_tree **jtree_r,
			   const char **error_r);

int oauth2_validation_key_cache_lookup_pubkey(
	struct oauth2_validation_key_cache *cache, const char *key_id,
	struct dcrypt_public_key **pubkey_r);
int oauth2_validation_key_cache_lookup_hmac_key(
	struct oauth2_validation_key_cache *cache, const char *key_id,
	const buffer_t **hmac_key_r);
void oauth2_validation_key_cache_insert_pubkey(
	struct oauth2_validation_key_cache *cache, const char *key_id,
	struct dcrypt_public_key *pubkey);
void oauth2_validation_key_cache_insert_hmac_key(
	struct oauth2_validation_key_cache *cache, const char *key_id,
	const buffer_t *hmac_key);

#endif
