(root)/
glib-2.79.0/
glib/
guri.h
       1  /* GLIB - Library of useful routines for C programming
       2   * Copyright © 2020 Red Hat, Inc.
       3   *
       4   * SPDX-License-Identifier: LGPL-2.1-or-later
       5   *
       6   * This library is free software; you can redistribute it and/or
       7   * modify it under the terms of the GNU Lesser General Public
       8   * License as published by the Free Software Foundation; either
       9   * version 2 of the License, or (at your option) any later version.
      10   *
      11   * This library is distributed in the hope that it will be useful,
      12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
      13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      14   * Lesser General Public License for more details.
      15   *
      16   * You should have received a copy of the GNU Lesser General
      17   * Public License along with this library; if not, see
      18   * <http://www.gnu.org/licenses/>.
      19   */
      20  
      21  #pragma once
      22  
      23  #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
      24  #error "Only <glib.h> can be included directly."
      25  #endif
      26  
      27  #include <glib/gtypes.h>
      28  
      29  G_BEGIN_DECLS
      30  
      31  G_GNUC_BEGIN_IGNORE_DEPRECATIONS
      32  
      33  typedef struct _GUri GUri;
      34  
      35  GLIB_AVAILABLE_IN_2_66
      36  GUri *       g_uri_ref              (GUri *uri);
      37  GLIB_AVAILABLE_IN_2_66
      38  void         g_uri_unref            (GUri *uri);
      39  
      40  /**
      41   * GUriFlags:
      42   * @G_URI_FLAGS_NONE: No flags set.
      43   * @G_URI_FLAGS_PARSE_RELAXED: Parse the URI more relaxedly than the
      44   *     [RFC 3986](https://tools.ietf.org/html/rfc3986) grammar specifies,
      45   *     fixing up or ignoring common mistakes in URIs coming from external
      46   *     sources. This is also needed for some obscure URI schemes where `;`
      47   *     separates the host from the path. Don’t use this flag unless you need to.
      48   * @G_URI_FLAGS_HAS_PASSWORD: The userinfo field may contain a password,
      49   *     which will be separated from the username by `:`.
      50   * @G_URI_FLAGS_HAS_AUTH_PARAMS: The userinfo may contain additional
      51   *     authentication-related parameters, which will be separated from
      52   *     the username and/or password by `;`.
      53   * @G_URI_FLAGS_NON_DNS: The host component should not be assumed to be a
      54   *     DNS hostname or IP address (for example, for `smb` URIs with NetBIOS
      55   *     hostnames).
      56   * @G_URI_FLAGS_ENCODED: When parsing a URI, this indicates that `%`-encoded
      57   *     characters in the userinfo, path, query, and fragment fields
      58   *     should not be decoded. (And likewise the host field if
      59   *     %G_URI_FLAGS_NON_DNS is also set.) When building a URI, it indicates
      60   *     that you have already `%`-encoded the components, and so #GUri
      61   *     should not do any encoding itself.
      62   * @G_URI_FLAGS_ENCODED_QUERY: Same as %G_URI_FLAGS_ENCODED, for the query
      63   *     field only.
      64   * @G_URI_FLAGS_ENCODED_PATH: Same as %G_URI_FLAGS_ENCODED, for the path only.
      65   * @G_URI_FLAGS_ENCODED_FRAGMENT: Same as %G_URI_FLAGS_ENCODED, for the
      66   *     fragment only.
      67   * @G_URI_FLAGS_SCHEME_NORMALIZE: A scheme-based normalization will be applied.
      68   *     For example, when parsing an HTTP URI changing omitted path to `/` and
      69   *     omitted port to `80`; and when building a URI, changing empty path to `/`
      70   *     and default port `80`). This only supports a subset of known schemes. (Since: 2.68)
      71   *
      72   * Flags that describe a URI.
      73   *
      74   * When parsing a URI, if you need to choose different flags based on
      75   * the type of URI, you can use g_uri_peek_scheme() on the URI string
      76   * to check the scheme first, and use that to decide what flags to
      77   * parse it with.
      78   *
      79   * Since: 2.66
      80   */
      81  GLIB_AVAILABLE_TYPE_IN_2_66
      82  typedef enum {
      83    G_URI_FLAGS_NONE            = 0,
      84    G_URI_FLAGS_PARSE_RELAXED   = 1 << 0,
      85    G_URI_FLAGS_HAS_PASSWORD    = 1 << 1,
      86    G_URI_FLAGS_HAS_AUTH_PARAMS = 1 << 2,
      87    G_URI_FLAGS_ENCODED         = 1 << 3,
      88    G_URI_FLAGS_NON_DNS         = 1 << 4,
      89    G_URI_FLAGS_ENCODED_QUERY   = 1 << 5,
      90    G_URI_FLAGS_ENCODED_PATH    = 1 << 6,
      91    G_URI_FLAGS_ENCODED_FRAGMENT = 1 << 7,
      92    G_URI_FLAGS_SCHEME_NORMALIZE GLIB_AVAILABLE_ENUMERATOR_IN_2_68 = 1 << 8,
      93  } GUriFlags;
      94  
      95  GLIB_AVAILABLE_IN_2_66
      96  gboolean     g_uri_split            (const gchar  *uri_ref,
      97                                       GUriFlags     flags,
      98                                       gchar       **scheme,
      99                                       gchar       **userinfo,
     100                                       gchar       **host,
     101                                       gint         *port,
     102                                       gchar       **path,
     103                                       gchar       **query,
     104                                       gchar       **fragment,
     105                                       GError      **error);
     106  GLIB_AVAILABLE_IN_2_66
     107  gboolean     g_uri_split_with_user  (const gchar  *uri_ref,
     108                                       GUriFlags     flags,
     109                                       gchar       **scheme,
     110                                       gchar       **user,
     111                                       gchar       **password,
     112                                       gchar       **auth_params,
     113                                       gchar       **host,
     114                                       gint         *port,
     115                                       gchar       **path,
     116                                       gchar       **query,
     117                                       gchar       **fragment,
     118                                       GError      **error);
     119  GLIB_AVAILABLE_IN_2_66
     120  gboolean     g_uri_split_network    (const gchar  *uri_string,
     121                                       GUriFlags     flags,
     122                                       gchar       **scheme,
     123                                       gchar       **host,
     124                                       gint         *port,
     125                                       GError      **error);
     126  
     127  GLIB_AVAILABLE_IN_2_66
     128  gboolean     g_uri_is_valid         (const gchar  *uri_string,
     129                                       GUriFlags     flags,
     130                                       GError      **error);
     131  
     132  GLIB_AVAILABLE_IN_2_66
     133  gchar *      g_uri_join             (GUriFlags     flags,
     134                                       const gchar  *scheme,
     135                                       const gchar  *userinfo,
     136                                       const gchar  *host,
     137                                       gint          port,
     138                                       const gchar  *path,
     139                                       const gchar  *query,
     140                                       const gchar  *fragment);
     141  GLIB_AVAILABLE_IN_2_66
     142  gchar *      g_uri_join_with_user   (GUriFlags     flags,
     143                                       const gchar  *scheme,
     144                                       const gchar  *user,
     145                                       const gchar  *password,
     146                                       const gchar  *auth_params,
     147                                       const gchar  *host,
     148                                       gint          port,
     149                                       const gchar  *path,
     150                                       const gchar  *query,
     151                                       const gchar  *fragment);
     152  
     153  GLIB_AVAILABLE_IN_2_66
     154  GUri *       g_uri_parse            (const gchar  *uri_string,
     155                                       GUriFlags     flags,
     156                                       GError      **error);
     157  GLIB_AVAILABLE_IN_2_66
     158  GUri *       g_uri_parse_relative   (GUri         *base_uri,
     159                                       const gchar  *uri_ref,
     160                                       GUriFlags     flags,
     161                                       GError      **error);
     162  
     163  GLIB_AVAILABLE_IN_2_66
     164  gchar *      g_uri_resolve_relative (const gchar  *base_uri_string,
     165                                       const gchar  *uri_ref,
     166                                       GUriFlags     flags,
     167                                       GError      **error);
     168  
     169  GLIB_AVAILABLE_IN_2_66
     170  GUri *       g_uri_build            (GUriFlags     flags,
     171                                       const gchar  *scheme,
     172                                       const gchar  *userinfo,
     173                                       const gchar  *host,
     174                                       gint          port,
     175                                       const gchar  *path,
     176                                       const gchar  *query,
     177                                       const gchar  *fragment);
     178  GLIB_AVAILABLE_IN_2_66
     179  GUri *       g_uri_build_with_user  (GUriFlags     flags,
     180                                       const gchar  *scheme,
     181                                       const gchar  *user,
     182                                       const gchar  *password,
     183                                       const gchar  *auth_params,
     184                                       const gchar  *host,
     185                                       gint          port,
     186                                       const gchar  *path,
     187                                       const gchar  *query,
     188                                       const gchar  *fragment);
     189  
     190  /**
     191   * GUriHideFlags:
     192   * @G_URI_HIDE_NONE: No flags set.
     193   * @G_URI_HIDE_USERINFO: Hide the userinfo.
     194   * @G_URI_HIDE_PASSWORD: Hide the password.
     195   * @G_URI_HIDE_AUTH_PARAMS: Hide the auth_params.
     196   * @G_URI_HIDE_QUERY: Hide the query.
     197   * @G_URI_HIDE_FRAGMENT: Hide the fragment.
     198   *
     199   * Flags describing what parts of the URI to hide in
     200   * g_uri_to_string_partial(). Note that %G_URI_HIDE_PASSWORD and
     201   * %G_URI_HIDE_AUTH_PARAMS will only work if the #GUri was parsed with
     202   * the corresponding flags.
     203   *
     204   * Since: 2.66
     205   */
     206  GLIB_AVAILABLE_TYPE_IN_2_66
     207  typedef enum {
     208    G_URI_HIDE_NONE        = 0,
     209    G_URI_HIDE_USERINFO    = 1 << 0,
     210    G_URI_HIDE_PASSWORD    = 1 << 1,
     211    G_URI_HIDE_AUTH_PARAMS = 1 << 2,
     212    G_URI_HIDE_QUERY       = 1 << 3,
     213    G_URI_HIDE_FRAGMENT    = 1 << 4,
     214  } GUriHideFlags;
     215  
     216  GLIB_AVAILABLE_IN_2_66
     217  char *       g_uri_to_string         (GUri          *uri);
     218  GLIB_AVAILABLE_IN_2_66
     219  char *       g_uri_to_string_partial (GUri          *uri,
     220                                        GUriHideFlags  flags);
     221  
     222  GLIB_AVAILABLE_IN_2_66
     223  const gchar *g_uri_get_scheme        (GUri          *uri);
     224  GLIB_AVAILABLE_IN_2_66
     225  const gchar *g_uri_get_userinfo      (GUri          *uri);
     226  GLIB_AVAILABLE_IN_2_66
     227  const gchar *g_uri_get_user          (GUri          *uri);
     228  GLIB_AVAILABLE_IN_2_66
     229  const gchar *g_uri_get_password      (GUri          *uri);
     230  GLIB_AVAILABLE_IN_2_66
     231  const gchar *g_uri_get_auth_params   (GUri          *uri);
     232  GLIB_AVAILABLE_IN_2_66
     233  const gchar *g_uri_get_host          (GUri          *uri);
     234  GLIB_AVAILABLE_IN_2_66
     235  gint         g_uri_get_port          (GUri          *uri);
     236  GLIB_AVAILABLE_IN_2_66
     237  const gchar *g_uri_get_path          (GUri          *uri);
     238  GLIB_AVAILABLE_IN_2_66
     239  const gchar *g_uri_get_query         (GUri          *uri);
     240  GLIB_AVAILABLE_IN_2_66
     241  const gchar *g_uri_get_fragment      (GUri          *uri);
     242  GLIB_AVAILABLE_IN_2_66
     243  GUriFlags    g_uri_get_flags         (GUri          *uri);
     244  
     245  /**
     246   * GUriParamsFlags:
     247   * @G_URI_PARAMS_NONE: No flags set.
     248   * @G_URI_PARAMS_CASE_INSENSITIVE: Parameter names are case insensitive.
     249   * @G_URI_PARAMS_WWW_FORM: Replace `+` with space character. Only useful for
     250   *     URLs on the web, using the `https` or `http` schemas.
     251   * @G_URI_PARAMS_PARSE_RELAXED: See %G_URI_FLAGS_PARSE_RELAXED.
     252   *
     253   * Flags modifying the way parameters are handled by g_uri_parse_params() and
     254   * #GUriParamsIter.
     255   *
     256   * Since: 2.66
     257   */
     258  GLIB_AVAILABLE_TYPE_IN_2_66
     259  typedef enum {
     260    G_URI_PARAMS_NONE             = 0,
     261    G_URI_PARAMS_CASE_INSENSITIVE = 1 << 0,
     262    G_URI_PARAMS_WWW_FORM         = 1 << 1,
     263    G_URI_PARAMS_PARSE_RELAXED    = 1 << 2,
     264  } GUriParamsFlags;
     265  
     266  GLIB_AVAILABLE_IN_2_66
     267  GHashTable *g_uri_parse_params       (const gchar    *params,
     268                                        gssize          length,
     269                                        const gchar    *separators,
     270                                        GUriParamsFlags flags,
     271                                        GError        **error);
     272  
     273  typedef struct _GUriParamsIter GUriParamsIter;
     274  
     275  struct _GUriParamsIter
     276  {
     277    /*< private >*/
     278    gint     dummy0;
     279    gpointer dummy1;
     280    gpointer dummy2;
     281    guint8   dummy3[256];
     282  };
     283  
     284  GLIB_AVAILABLE_IN_2_66
     285  void        g_uri_params_iter_init   (GUriParamsIter *iter,
     286                                        const gchar    *params,
     287                                        gssize          length,
     288                                        const gchar    *separators,
     289                                        GUriParamsFlags flags);
     290  
     291  GLIB_AVAILABLE_IN_2_66
     292  gboolean    g_uri_params_iter_next   (GUriParamsIter *iter,
     293                                        gchar         **attribute,
     294                                        gchar         **value,
     295                                        GError        **error);
     296  
     297  /**
     298   * G_URI_ERROR:
     299   *
     300   * Error domain for URI methods. Errors in this domain will be from
     301   * the #GUriError enumeration. See #GError for information on error
     302   * domains.
     303   *
     304   * Since: 2.66
     305   */
     306  #define G_URI_ERROR (g_uri_error_quark ()) GLIB_AVAILABLE_MACRO_IN_2_66
     307  GLIB_AVAILABLE_IN_2_66
     308  GQuark g_uri_error_quark (void);
     309  
     310  /**
     311   * GUriError:
     312   * @G_URI_ERROR_FAILED: Generic error if no more specific error is available.
     313   *     See the error message for details.
     314   * @G_URI_ERROR_BAD_SCHEME: The scheme of a URI could not be parsed.
     315   * @G_URI_ERROR_BAD_USER: The user/userinfo of a URI could not be parsed.
     316   * @G_URI_ERROR_BAD_PASSWORD: The password of a URI could not be parsed.
     317   * @G_URI_ERROR_BAD_AUTH_PARAMS: The authentication parameters of a URI could not be parsed.
     318   * @G_URI_ERROR_BAD_HOST: The host of a URI could not be parsed.
     319   * @G_URI_ERROR_BAD_PORT: The port of a URI could not be parsed.
     320   * @G_URI_ERROR_BAD_PATH: The path of a URI could not be parsed.
     321   * @G_URI_ERROR_BAD_QUERY: The query of a URI could not be parsed.
     322   * @G_URI_ERROR_BAD_FRAGMENT: The fragment of a URI could not be parsed.
     323   *
     324   * Error codes returned by #GUri methods.
     325   *
     326   * Since: 2.66
     327   */
     328  typedef enum {
     329    G_URI_ERROR_FAILED,
     330    G_URI_ERROR_BAD_SCHEME,
     331    G_URI_ERROR_BAD_USER,
     332    G_URI_ERROR_BAD_PASSWORD,
     333    G_URI_ERROR_BAD_AUTH_PARAMS,
     334    G_URI_ERROR_BAD_HOST,
     335    G_URI_ERROR_BAD_PORT,
     336    G_URI_ERROR_BAD_PATH,
     337    G_URI_ERROR_BAD_QUERY,
     338    G_URI_ERROR_BAD_FRAGMENT,
     339  } GUriError;
     340  
     341  /**
     342   * G_URI_RESERVED_CHARS_GENERIC_DELIMITERS:
     343   *
     344   * Generic delimiters characters as defined in
     345   * [RFC 3986](https://tools.ietf.org/html/rfc3986). Includes `:/?#[]@`.
     346   *
     347   * Since: 2.16
     348   **/
     349  #define G_URI_RESERVED_CHARS_GENERIC_DELIMITERS ":/?#[]@"
     350  
     351  /**
     352   * G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS:
     353   *
     354   * Subcomponent delimiter characters as defined in
     355   * [RFC 3986](https://tools.ietf.org/html/rfc3986). Includes `!$&'()*+,;=`.
     356   *
     357   * Since: 2.16
     358   **/
     359  #define G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS "!$&'()*+,;="
     360  
     361  /**
     362   * G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT:
     363   *
     364   * Allowed characters in path elements. Includes `!$&'()*+,;=:@`.
     365   *
     366   * Since: 2.16
     367   **/
     368  #define G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS ":@"
     369  
     370  /**
     371   * G_URI_RESERVED_CHARS_ALLOWED_IN_PATH:
     372   *
     373   * Allowed characters in a path. Includes `!$&'()*+,;=:@/`.
     374   *
     375   * Since: 2.16
     376   **/
     377  #define G_URI_RESERVED_CHARS_ALLOWED_IN_PATH G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT "/"
     378  
     379  /**
     380   * G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO:
     381   *
     382   * Allowed characters in userinfo as defined in
     383   * [RFC 3986](https://tools.ietf.org/html/rfc3986). Includes `!$&'()*+,;=:`.
     384   *
     385   * Since: 2.16
     386   **/
     387  #define G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS ":"
     388  
     389  GLIB_AVAILABLE_IN_ALL
     390  char *      g_uri_unescape_string  (const char *escaped_string,
     391                                      const char *illegal_characters);
     392  GLIB_AVAILABLE_IN_ALL
     393  char *      g_uri_unescape_segment (const char *escaped_string,
     394                                      const char *escaped_string_end,
     395                                      const char *illegal_characters);
     396  
     397  GLIB_AVAILABLE_IN_ALL
     398  char *      g_uri_parse_scheme     (const char *uri);
     399  GLIB_AVAILABLE_IN_2_66
     400  const char *g_uri_peek_scheme      (const char *uri);
     401  
     402  GLIB_AVAILABLE_IN_ALL
     403  char *      g_uri_escape_string    (const char *unescaped,
     404                                      const char *reserved_chars_allowed,
     405                                      gboolean    allow_utf8);
     406  
     407  GLIB_AVAILABLE_IN_2_66
     408  GBytes *    g_uri_unescape_bytes   (const char *escaped_string,
     409                                      gssize      length,
     410                                      const char *illegal_characters,
     411                                      GError    **error);
     412  
     413  GLIB_AVAILABLE_IN_2_66
     414  char *      g_uri_escape_bytes     (const guint8 *unescaped,
     415                                      gsize         length,
     416                                      const char   *reserved_chars_allowed);
     417  
     418  G_GNUC_END_IGNORE_DEPRECATIONS
     419  
     420  G_END_DECLS