Line data Source code
1 : /*
2 : This file is part of TALER
3 : (C) 2016-2023 Taler Systems SA
4 :
5 : TALER is free software; you can redistribute it and/or
6 : modify it under the terms of the GNU General Public License
7 : as published by the Free Software Foundation; either version 3,
8 : or (at your option) any later version.
9 :
10 : TALER is distributed in the hope that it will be useful,
11 : but WITHOUT ANY WARRANTY; without even the implied warranty of
12 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 : GNU General Public License for more details.
14 :
15 : You should have received a copy of the GNU General Public
16 : License along with TALER; see the file COPYING. If not,
17 : see <http://www.gnu.org/licenses/>
18 : */
19 : /**
20 : * @file bank-lib/fakebank_common_parser.c
21 : * @brief functions to help parse REST requests
22 : * @author Christian Grothoff <christian@grothoff.org>
23 : */
24 : #include "taler/taler_fakebank_lib.h"
25 : #include "taler/taler_bank_service.h"
26 : #include "taler/taler_mhd_lib.h"
27 : #include <gnunet/gnunet_mhd_compat.h>
28 : #include "fakebank.h"
29 : #include "fakebank_common_parser.h"
30 :
31 :
32 : enum GNUNET_GenericReturnValue
33 177 : TALER_FAKEBANK_common_parse_history_args (
34 : const struct TALER_FAKEBANK_Handle *h,
35 : struct MHD_Connection *connection,
36 : struct HistoryArgs *ha)
37 : {
38 : const char *offset;
39 : const char *limit;
40 : const char *long_poll_ms;
41 : unsigned long long lp_timeout;
42 : unsigned long long sval;
43 : long long d;
44 : char dummy;
45 :
46 177 : offset = MHD_lookup_connection_value (connection,
47 : MHD_GET_ARGUMENT_KIND,
48 : "offset");
49 177 : if (NULL == offset)
50 21 : offset = MHD_lookup_connection_value (connection,
51 : MHD_GET_ARGUMENT_KIND,
52 : "start");
53 177 : ha->have_start = (NULL != offset);
54 177 : limit = MHD_lookup_connection_value (connection,
55 : MHD_GET_ARGUMENT_KIND,
56 : "limit");
57 177 : if (NULL == limit)
58 0 : limit = MHD_lookup_connection_value (connection,
59 : MHD_GET_ARGUMENT_KIND,
60 : "delta");
61 177 : long_poll_ms = MHD_lookup_connection_value (connection,
62 : MHD_GET_ARGUMENT_KIND,
63 : "long_poll_ms");
64 177 : lp_timeout = 0;
65 177 : if ( (NULL == limit) ||
66 177 : (1 != sscanf (limit,
67 : "%lld%c",
68 : &d,
69 : &dummy)) )
70 : {
71 : /* Fail if one of the above failed. */
72 : /* Invalid request, given that this is fakebank we impolitely
73 : * just kill the connection instead of returning a nice error.
74 : */
75 0 : GNUNET_break_op (0);
76 : return (MHD_YES ==
77 0 : TALER_MHD_reply_with_error (connection,
78 : MHD_HTTP_BAD_REQUEST,
79 : TALER_EC_GENERIC_PARAMETER_MALFORMED,
80 : "delta"))
81 : ? GNUNET_NO
82 0 : : GNUNET_SYSERR;
83 : }
84 177 : if ( (NULL != long_poll_ms) &&
85 0 : (1 != sscanf (long_poll_ms,
86 : "%llu%c",
87 : &lp_timeout,
88 : &dummy)) )
89 : {
90 : /* Fail if one of the above failed. */
91 : /* Invalid request, given that this is fakebank we impolitely
92 : * just kill the connection instead of returning a nice error.
93 : */
94 0 : GNUNET_break_op (0);
95 : return (MHD_YES ==
96 0 : TALER_MHD_reply_with_error (connection,
97 : MHD_HTTP_BAD_REQUEST,
98 : TALER_EC_GENERIC_PARAMETER_MALFORMED,
99 : "long_poll_ms"))
100 : ? GNUNET_NO
101 0 : : GNUNET_SYSERR;
102 : }
103 177 : if ( (NULL != offset) &&
104 156 : (1 != sscanf (offset,
105 : "%llu%c",
106 : &sval,
107 : &dummy)) )
108 : {
109 : /* Fail if one of the above failed. */
110 : /* Invalid request, given that this is fakebank we impolitely
111 : * just kill the connection instead of returning a nice error.
112 : */
113 0 : GNUNET_break_op (0);
114 : return (MHD_YES ==
115 0 : TALER_MHD_reply_with_error (connection,
116 : MHD_HTTP_BAD_REQUEST,
117 : TALER_EC_GENERIC_PARAMETER_MALFORMED,
118 : "start"))
119 : ? GNUNET_NO
120 0 : : GNUNET_SYSERR;
121 : }
122 177 : if (NULL == offset)
123 21 : ha->start_idx = (d > 0) ? 0 : UINT64_MAX;
124 : else
125 156 : ha->start_idx = (uint64_t) sval;
126 177 : ha->delta = (int64_t) d;
127 177 : if (0 == ha->delta)
128 : {
129 0 : GNUNET_break_op (0);
130 : return (MHD_YES ==
131 0 : TALER_MHD_reply_with_error (connection,
132 : MHD_HTTP_BAD_REQUEST,
133 : TALER_EC_GENERIC_PARAMETER_MALFORMED,
134 : "limit"))
135 : ? GNUNET_NO
136 0 : : GNUNET_SYSERR;
137 : }
138 : ha->lp_timeout
139 177 : = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS,
140 : lp_timeout);
141 177 : GNUNET_log (GNUNET_ERROR_TYPE_INFO,
142 : "Request for %lld records from %llu\n",
143 : (long long) ha->delta,
144 : (unsigned long long) ha->start_idx);
145 177 : return GNUNET_OK;
146 : }
|