diff options
| author | MS <ms@taler.net> | 2020-07-27 12:48:48 +0200 | 
|---|---|---|
| committer | MS <ms@taler.net> | 2020-07-27 12:48:48 +0200 | 
| commit | 7c2de4c5e6b7b1184d059057e1d412d6f0133816 (patch) | |
| tree | 258e80ba800130496785daa4851ae3893c11aed3 /src/util | |
| parent | e1fcb2b26cb90a912e57acf5753480a18237f021 (diff) | |
payto parser: extract 'subject' parameter.
Diffstat (limited to 'src/util')
| -rw-r--r-- | src/util/payto.c | 39 | ||||
| -rw-r--r-- | src/util/test_payto.c | 11 | 
2 files changed, 50 insertions, 0 deletions
| diff --git a/src/util/payto.c b/src/util/payto.c index 3540052c..4b2bbf4e 100644 --- a/src/util/payto.c +++ b/src/util/payto.c @@ -29,6 +29,45 @@  /** + * Extract the subject value from the URI parameters. + * + * @param payto_uri the URL to parse + * @return NULL if the subject parameter is not found. + *         The caller should free the returned value. + */ +char * +TALER_payto_get_subject (const char *payto_uri) +{ +  const char *key; +  const char *value_start; +  const char *value_end; + +  key = strchr (payto_uri, +                (unsigned char) '?'); +  if (NULL == key) +    return NULL; + +  do { +    if (0 == strncasecmp (++key, +			  "subject", +			  strlen ("subject"))) +    { +      value_start = strchr (key, +	                    (unsigned char) '='); +      if (NULL == value_start) +        return NULL; +      value_end = strchrnul (value_start, +	                     (unsigned char) '&'); + +      return GNUNET_strndup (value_start + 1, +	                     value_end - value_start - 1); +    } +  } while ( (key = strchr (key, +			 (unsigned char) '&')) ); +  return NULL; +} + +/**   * Obtain the payment method from a @a payto_uri. The   * format of a payto URI is 'payto://$METHOD/$SOMETHING'.   * We return $METHOD. diff --git a/src/util/test_payto.c b/src/util/test_payto.c index 7dc2eb14..c809a039 100644 --- a/src/util/test_payto.c +++ b/src/util/test_payto.c @@ -22,6 +22,8 @@  #include "taler_util.h"  #define CHECK(a,b) do { \ +    GNUNET_assert (a != NULL); \ +    GNUNET_assert (b != NULL); \      if (0 != strcmp (a,b)) {   \        GNUNET_break (0); \        fprintf (stderr, "Got %s, wanted %s\n", b, a); \ @@ -52,6 +54,15 @@ main (int argc,      "payto://x-taler-bank/localhost:1080/alice?subject=hello&amount=EUR:1");    CHECK ("alice",           r); + +  r = TALER_payto_get_subject ( +    "payto://x-taler-bank/localhost:1080/alice?subject=hello&amount=EUR:1"); +  CHECK ("hello", +	 r); + +  r = TALER_payto_get_subject ( +    "payto://x-taler-bank/localhost:1080/alice"); +  GNUNET_assert (r == NULL);    return 0;  } | 
