Lines Matching refs:req

82 typedef void doveadm_server_handler_t(struct client_request_http *req);
93 static void doveadm_http_server_send_response(struct client_request_http *req);
130 struct client_request_http *req = context;
131 struct ostream *output = req->output;
134 escaped = str_new(req->pool, 10);
145 if (req->method_id != NULL) {
146 json_append_escaped(escaped, req->method_id);
154 struct client_request_http *req = context;
155 struct ostream *output = req->output;
158 escaped = str_new(req->pool, 10);
163 if (req->method_id != NULL) {
164 json_append_escaped(escaped, req->method_id);
171 doveadm_http_server_command_execute(struct client_request_http *req)
173 struct client_connection_http *conn = req->conn;
180 if (req->method_err == 0 &&
182 req->cmd->name))
183 req->method_err = 403;
184 if (req->method_err != 0) {
185 if (req->method_err == 404) {
186 doveadm_http_server_json_error(req, "unknownMethod");
187 } else if (req->method_err == 403) {
188 doveadm_http_server_json_error(req, "unAuthorized");
189 } else if (req->method_err == 400) {
190 doveadm_http_server_json_error(req, "invalidRequest");
192 doveadm_http_server_json_error(req, "internalError");
200 cctx.input = req->input;
201 cctx.output = req->output;
205 cctx.cmd = req->cmd;
211 doveadm_cmd_params_null_terminate_arrays(&req->pargv);
212 cctx.argv = array_get(&req->pargv, (unsigned int*)&cctx.argc);
230 o_stream_switch_ioloop(req->output);
238 req->cmd->name,
239 o_stream_get_error(req->output));
245 if (req->first_row == TRUE)
246 req->first_row = FALSE;
248 o_stream_nsend_str(req->output,",");
252 i_error("Command %s failed", req->cmd->name);
253 doveadm_http_server_json_error(req, "exitCode");
255 doveadm_http_server_json_success(req, is);
261 request_json_parse_init(struct client_request_http *req)
263 struct http_server_request *http_sreq = req->http_request;
268 if ((ret=json_parse_next(req->json_parser, &type, &value)) <= 0)
277 req->first_row = TRUE;
278 o_stream_nsend_str(req->output,"[");
281 req->parse_state = CLIENT_REQUEST_PARSE_CMD;
286 request_json_parse_cmd(struct client_request_http *req)
288 struct http_server_request *http_sreq = req->http_request;
293 if ((ret=json_parse_next(req->json_parser, &type, &value)) <= 0)
297 req->parse_state = CLIENT_REQUEST_PARSE_DONE;
307 req->method_err = 0;
308 p_free_and_null(req->pool, req->method_id);
309 req->cmd = NULL;
310 doveadm_cmd_params_clean(&req->pargv);
313 req->parse_state = CLIENT_REQUEST_PARSE_CMD_NAME;
318 request_json_parse_cmd_name(struct client_request_http *req)
320 struct http_server_request *http_sreq = req->http_request;
328 if ((ret=json_parse_next(req->json_parser, &type, &value)) <= 0)
342 req->cmd = ccmd;
349 json_parse_skip_next(req->json_parser);
350 req->method_err = 404;
351 req->parse_state = CLIENT_REQUEST_PARSE_CMD_ID;
356 for (pargc = 0; req->cmd->parameters[pargc].name != NULL; pargc++) {
357 param = array_append_space(&req->pargv);
358 *param = req->cmd->parameters[pargc];
363 req->parse_state = CLIENT_REQUEST_PARSE_CMD_PARAMS;
368 request_json_parse_cmd_params(struct client_request_http *req)
370 struct http_server_request *http_sreq = req->http_request;
375 if ((ret=json_parse_next(req->json_parser, &type, &value)) <= 0)
379 req->parse_state = CLIENT_REQUEST_PARSE_CMD_ID;
391 req->parse_state = CLIENT_REQUEST_PARSE_CMD_PARAM_KEY;
396 request_json_parse_cmd_param_key(struct client_request_http *req)
398 struct http_server_request *http_sreq = req->http_request;
405 if ((ret=json_parse_next(req->json_parser, &type, &value)) <= 0)
409 req->parse_state = CLIENT_REQUEST_PARSE_CMD_ID;
415 array_foreach_modifiable(&req->pargv, par) {
417 req->cmd_param = par;
422 if (found && req->cmd_param->value_set) {
427 req->cmd_param->name);
431 if (!found || req->method_err != 0) {
432 json_parse_skip_next(req->json_parser);
433 req->method_err = 400;
434 req->parse_state = CLIENT_REQUEST_PARSE_CMD_PARAM_KEY;
439 req->value_is_array = FALSE;
440 req->parse_state = CLIENT_REQUEST_PARSE_CMD_PARAM_VALUE;
445 request_json_parse_param_value(struct client_request_http *req)
447 struct http_server_request *http_sreq = req->http_request;
452 if (req->cmd_param->type == CMD_PARAM_ISTREAM) {
456 ret = json_parse_next_stream(req->json_parser, &is[0]);
460 req->cmd_param->value.v_istream =
464 req->cmd_param->value_set = TRUE;
468 req->parse_state = CLIENT_REQUEST_PARSE_CMD_PARAM_ISTREAM;
472 if ((ret=json_parse_next(req->json_parser, &type, &value)) <= 0)
474 if (req->cmd_param->type == CMD_PARAM_ARRAY) {
478 p_array_init(&req->cmd_param->value.v_array, req->pool, 1);
479 req->cmd_param->value_set = TRUE;
482 req->value_is_array = TRUE;
483 req->parse_state = CLIENT_REQUEST_PARSE_CMD_PARAM_ARRAY;
492 req->cmd_param->name);
495 tmp = p_strdup(req->pool, value);
496 array_append(&req->cmd_param->value.v_array, &tmp, 1);
499 req->parse_state = CLIENT_REQUEST_PARSE_CMD_PARAM_KEY;
504 req->cmd_param->value_set = TRUE;
505 switch(req->cmd_param->type) {
507 req->cmd_param->value.v_bool = (strcmp(value, "true") == 0);
510 if (str_to_int64(value, &req->cmd_param->value.v_int64) != 0) {
511 req->method_err = 400;
515 if (net_addr2ip(value, &req->cmd_param->value.v_ip) != 0) {
516 req->method_err = 400;
520 req->cmd_param->value.v_string = p_strdup(req->pool, value);
527 req->parse_state = CLIENT_REQUEST_PARSE_CMD_PARAM_KEY;
532 request_json_parse_param_array(struct client_request_http *req)
534 struct http_server_request *http_sreq = req->http_request;
539 if ((ret=json_parse_next(req->json_parser, &type, &value)) <= 0)
543 req->parse_state = CLIENT_REQUEST_PARSE_CMD_PARAM_KEY;
556 value = p_strdup(req->pool, value);
557 array_append(&req->cmd_param->value.v_array, &value, 1);
564 request_json_parse_param_istream(struct client_request_http *req)
566 struct http_server_request *http_sreq = req->http_request;
567 struct istream *v_input = req->cmd_param->value.v_istream;
582 req->method_err = 400;
583 if (req->input->stream_errno == 0) {
592 req->parse_state = CLIENT_REQUEST_PARSE_CMD_PARAM_KEY;
597 request_json_parse_cmd_id(struct client_request_http *req)
599 struct http_server_request *http_sreq = req->http_request;
604 if ((ret=json_parse_next(req->json_parser, &type, &value)) <= 0)
615 req->method_id = p_strdup(req->pool, value);
616 req->parse_state = CLIENT_REQUEST_PARSE_CMD_DONE;
621 request_json_parse_cmd_done(struct client_request_http *req)
623 struct http_server_request *http_sreq = req->http_request;
628 if ((ret=json_parse_next(req->json_parser, &type, &value)) <= 0)
639 doveadm_http_server_command_execute(req);
642 req->parse_state = CLIENT_REQUEST_PARSE_CMD;
647 request_json_parse_done(struct client_request_http *req)
649 struct http_server_request *http_sreq = req->http_request;
654 if ((ret=json_parse_next(req->json_parser, &type, &value)) <= 0)
664 doveadm_http_server_json_parse_v1(struct client_request_http *req)
667 switch (req->parse_state) {
670 return request_json_parse_init(req);
673 return request_json_parse_cmd(req);
676 return request_json_parse_cmd_name(req);
679 return request_json_parse_cmd_params(req);
682 return request_json_parse_cmd_param_key(req);
685 return request_json_parse_param_value(req);
688 return request_json_parse_param_array(req);
691 return request_json_parse_param_istream(req);
694 return request_json_parse_cmd_id(req);
697 return request_json_parse_cmd_done(req);
700 return request_json_parse_done(req);
708 doveadm_http_server_read_request_v1(struct client_request_http *req)
710 struct http_server_request *http_sreq = req->http_request;
714 if (req->json_parser == NULL) {
715 req->json_parser = json_parser_init_flags(
716 req->input, JSON_PARSER_NO_ROOT_OBJECT);
719 while ((ret=doveadm_http_server_json_parse_v1(req)) > 0);
723 io_remove(&req->io);
724 i_stream_destroy(&req->input);
727 if (!req->input->eof && ret == 0)
729 io_remove(&req->io);
731 doveadm_cmd_params_clean(&req->pargv);
733 if (req->input->stream_errno != 0) {
737 i_stream_get_name(req->input),
738 i_stream_get_error(req->input));
742 if (json_parser_deinit(&req->json_parser, &error) != 0) {
749 i_stream_destroy(&req->input);
750 o_stream_nsend_str(req->output,"]");
752 doveadm_http_server_send_response(req);
772 doveadm_http_server_send_api_v1(struct client_request_http *req)
774 struct ostream *output = req->output;
781 tmp = str_new(req->pool, 8);
833 doveadm_http_server_send_response(req);
837 doveadm_http_server_options_handler(struct client_request_http *req)
839 struct http_server_request *http_sreq = req->http_request;
857 doveadm_http_server_print_mounts(struct client_request_http *req)
859 struct ostream *output = req->output;
883 doveadm_http_server_send_response(req);
890 static void doveadm_http_server_send_response(struct client_request_http *req)
892 struct http_server_request *http_sreq = req->http_request;
896 if (req->output != NULL) {
897 if (o_stream_finish(req->output) == -1) {
899 o_stream_get_error(req->output));
900 o_stream_destroy(&req->output);
906 payload = iostream_temp_finish(&req->output,
923 doveadm_http_server_request_destroy(struct client_request_http *req)
925 struct client_connection_http *conn = req->conn;
926 struct http_server_request *http_sreq = req->http_request;
932 i_assert(conn->request == req);
952 if (req->json_parser != NULL) {
954 (void)json_parser_deinit(&req->json_parser, &error);
957 if (req->output != NULL)
958 o_stream_set_no_error_handling(req->output, TRUE);
959 io_remove(&req->io);
960 o_stream_destroy(&req->output);
961 i_stream_destroy(&req->input);
963 http_server_request_unref(&req->http_request);
966 pool_unref(&req->pool);
971 doveadm_http_server_auth_basic(struct client_request_http *req,
974 struct client_connection_http *conn = req->conn;
998 doveadm_http_server_auth_api_key(struct client_request_http *req,
1001 struct client_connection_http *conn = req->conn;
1024 doveadm_http_server_auth_verify(struct client_request_http *req,
1029 return doveadm_http_server_auth_basic(req, creds);
1031 return doveadm_http_server_auth_api_key(req, creds);
1039 doveadm_http_server_authorize_request(struct client_request_http *req)
1041 struct client_connection_http *conn = req->conn;
1042 struct http_server_request *http_sreq = req->http_request;
1056 auth = doveadm_http_server_auth_verify(req, &creds);
1082 struct client_request_http *req;
1093 req = p_new(pool, struct client_request_http, 1);
1094 req->pool = pool;
1095 req->conn = conn;
1097 req->http_request = http_sreq;
1098 http_server_request_ref(req->http_request);
1102 doveadm_http_server_request_destroy, req);
1104 conn->request = req;
1125 if (ep->auth == TRUE && !doveadm_http_server_authorize_request(req))
1130 req->input = http_req->payload;
1131 i_stream_set_name(req->input,
1133 i_stream_ref(req->input);
1134 req->io = io_add_istream(req->input, *ep->handler, req);
1135 req->output = iostream_temp_create_named(
1137 p_array_init(&req->pargv, req->pool, 5);
1138 ep->handler(req);
1140 req->output = iostream_temp_create_named(
1142 ep->handler(req);