oauth2_request_callback(req, &res);
}
+void oauth2_parse_json(struct oauth2_request *req)
+{
+ enum json_type type;
+ const char *token, *error;
+ int ret;
+
+ while((ret = json_parse_next(req->parser, &type, &token)) > 0) {
+ if (req->field_name == NULL) {
+ if (type != JSON_TYPE_OBJECT_KEY) break;
+ /* cannot use t_strdup because we might
+ have to read more */
+ req->field_name = p_strdup(req->pool, token);
+ } else if (type < JSON_TYPE_STRING) {
+ /* this should be last allocation */
+ p_free(req->pool, req->field_name);
+ json_parse_skip(req->parser);
+ } else {
+ if (!array_is_created(&req->fields))
+ p_array_init(&req->fields, req->pool, 4);
+ struct oauth2_field *field =
+ array_append_space(&req->fields);
+ field->name = req->field_name;
+ req->field_name = NULL;
+ field->value = p_strdup(req->pool, token);
+ }
+ }
+
+ /* read more */
+ if (ret == 0) return;
+
+ io_remove(&req->io);
+
+ if (ret > 0) {
+ (void)json_parser_deinit(&req->parser, &error);
+ error = "Invalid response data";
+ } else if (i_stream_read_eof(req->is) &&
+ req->is->v_offset == 0 && req->is->stream_errno == 0) {
+ /* discard error, empty response is OK. */
+ (void)json_parser_deinit(&req->parser, &error);
+ error = NULL;
+ } else if (json_parser_deinit(&req->parser, &error) == 0) {
+ error = NULL;
+ } else {
+ i_assert(error != NULL);
+ }
+
+ i_stream_unref(&req->is);
+
+ req->json_parsed_cb(req, error);
+}
+
static void
oauth2_request_response(const struct http_response *response,
struct oauth2_request *req)
/* Copyright (c) 2017-2018 Dovecot authors, see the included COPYING file */
#include "lib.h"
-#include "ioloop.h"
#include "istream.h"
#include "http-client.h"
#include "json-tree.h"
return ret;
}
-void oauth2_parse_json(struct oauth2_request *req)
-{
- enum json_type type;
- const char *token, *error;
- int ret;
-
- while((ret = json_parse_next(req->parser, &type, &token)) > 0) {
- if (req->field_name == NULL) {
- if (type != JSON_TYPE_OBJECT_KEY) break;
- /* cannot use t_strdup because we might
- have to read more */
- req->field_name = p_strdup(req->pool, token);
- } else if (type < JSON_TYPE_STRING) {
- /* this should be last allocation */
- p_free(req->pool, req->field_name);
- json_parse_skip(req->parser);
- } else {
- if (!array_is_created(&req->fields))
- p_array_init(&req->fields, req->pool, 4);
- struct oauth2_field *field =
- array_append_space(&req->fields);
- field->name = req->field_name;
- req->field_name = NULL;
- field->value = p_strdup(req->pool, token);
- }
- }
-
- /* read more */
- if (ret == 0) return;
-
- io_remove(&req->io);
-
- if (ret > 0) {
- (void)json_parser_deinit(&req->parser, &error);
- error = "Invalid response data";
- } else if (i_stream_read_eof(req->is) &&
- req->is->v_offset == 0 && req->is->stream_errno == 0) {
- /* discard error, empty response is OK. */
- (void)json_parser_deinit(&req->parser, &error);
- error = NULL;
- } else if (json_parser_deinit(&req->parser, &error) == 0) {
- error = NULL;
- } else {
- i_assert(error != NULL);
- }
-
- i_stream_unref(&req->is);
-
- req->json_parsed_cb(req, error);
-}
-
void oauth2_request_abort(struct oauth2_request **_req)
{
struct oauth2_request *req = *_req;