/* * Copyright 1999-2006 University of Chicago * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef GLOBUS_URL_H #define GLOBUS_URL_H /** * @file globus_url.h * @brief URL Parsing */ /** * @defgroup globus_url URL String Parser * @ingroup globus_common * @brief URL String Parser * * The Globus URL functions provide a simple mechanism for parsing * a URL string into a data structure, and for determining the scheme * of an URL string. */ #ifdef __cplusplus extern "C" { #endif /* Supported URL Schemes */ /** * @brief URL Schemes. * @ingroup globus_url * * The Globus URL library supports a set of URL schemes (protocols). This * enumeration can be used to quickly dispatch a parsed URL based on a * constant value. * * @see globus_url_t::scheme_type */ typedef enum { /** File Transfer Protocol */ GLOBUS_URL_SCHEME_FTP=0, /** GSI-enhanced File Transfer Protocol */ GLOBUS_URL_SCHEME_GSIFTP, /** HyperText Transfer Protocol */ GLOBUS_URL_SCHEME_HTTP, /** Secure HyperText Transfer Protocol */ GLOBUS_URL_SCHEME_HTTPS, /** Lightweight Directory Access Protocol*/ GLOBUS_URL_SCHEME_LDAP, /** File Location */ GLOBUS_URL_SCHEME_FILE, /** Nexus endpoint */ GLOBUS_URL_SCHEME_X_NEXUS, /** GASS Cache Entry */ GLOBUS_URL_SCHEME_X_GASS_CACHE, /** Any other URL of the form scheme://something */ GLOBUS_URL_SCHEME_UNKNOWN, GLOBUS_URL_SCHEME_SSHFTP, /** Total number of URL schemes supported */ GLOBUS_URL_NUM_SCHEMES } globus_url_scheme_t; /* Other schemes defined in RFCs but _not_ supported here are 'news', 'nntp', 'telnet', 'gopher', 'wais', 'mailto', and 'prospero' */ /** * @brief Parsed URLs. * @ingroup globus_url * * This structure contains the fields which were parsed from an string * representation of an URL. There are no methods to access fields of this * structure. */ typedef struct { /** A string containing the URL's scheme (http, ftp, etc) */ char *scheme; /** An enumerated scheme type. This is derived from the scheme string */ globus_url_scheme_t scheme_type; /* * Other fields as seen in these known url schemes: * * ftp://[user[:password]@]host[:port]/[url_path] * gsiftp://[user[:password]@]host[:port]/[url_path] * http://host[:port]/url_path * x-nexus://host:port * x-gass-cache://url_path * ldap://host[:port]/dn?attributes?scope?filter * otherurl://host[:port]/url_path or * otherurl://url_specific_part */ char *user; /**< The username portion of the URL. [ftp, gsiftp] */ char *password; /**< The user's password from the URL. [ftp, gsiftp] */ char *host; /**< The host name or IP address of the URL. [ftp, gsiftp, http, https, ldap, x-nexus */ unsigned short port;/**< The TCP port number of the service providing the URL [ftp, gsiftp, http, https, ldap, x-nexus] */ char *url_path; /**< The path name of the resource on the service providing the URL. [ftp, gsiftp, http, https] */ char *dn; /**< The distinguished name for the base of an LDAP search. [ldap] */ char *attributes; /**< The list of attributes which should be returned from an LDAP search. [ldap] */ char *scope; /**< The scope of an LDAP search. [ldap] */ char *filter; /**< The filter to be applied to an LDAP search [ldap] */ char *url_specific_part; /**< An unparsed string containing the remaining text after the optional host and port of an unknown URL, or the contents of a x-gass-cache URL [x-gass-cache, unknown] */ } globus_url_t; /* Fill in the data structure pointed to by url */ int globus_url_parse(const char *url_string, globus_url_t *url); /* Fill in the data structure pointed to by url */ int globus_url_parse_rfc1738(const char *url_string, globus_url_t *url); /* Fill in the data structure pointed to by url */ int globus_url_parse_loose(const char *url_string, globus_url_t *url); /* Destroy the fields of the data structure pointed to by url */ int globus_url_destroy(globus_url_t *url); /* Create a copy of a globus_url_t structure */ int globus_url_copy(globus_url_t * dest, const globus_url_t * src); /* Find out the URL scheme type */ int globus_url_get_scheme(const char *url_string, globus_url_scheme_t *scheme_type); void globus_url_string_hex_decode( char * s); char * globus_url_string_hex_encode( const char * s, const char * enc); /* Return conditions */ #define GLOBUS_URL_SUCCESS 0 #define GLOBUS_URL_ERROR_NULL_STRING -1 #define GLOBUS_URL_ERROR_NULL_URL -2 #define GLOBUS_URL_ERROR_BAD_SCHEME -3 #define GLOBUS_URL_ERROR_BAD_USER -4 #define GLOBUS_URL_ERROR_BAD_PASSWORD -5 #define GLOBUS_URL_ERROR_BAD_HOST -6 #define GLOBUS_URL_ERROR_BAD_PORT -7 #define GLOBUS_URL_ERROR_BAD_PATH -8 /* for ldap URLs */ #define GLOBUS_URL_ERROR_BAD_DN -9 #define GLOBUS_URL_ERROR_BAD_ATTRIBUTES -10 #define GLOBUS_URL_ERROR_BAD_SCOPE -11 #define GLOBUS_URL_ERROR_BAD_FILTER -12 /* when malloc fails */ #define GLOBUS_URL_ERROR_OUT_OF_MEMORY -13 /* for nexus errors/former assertion failures */ #define GLOBUS_URL_ERROR_INTERNAL_ERROR -14 #define GLOBUS_URL_TRUE 1 #define GLOBUS_URL_FALSE 0 #ifdef __cplusplus } #endif #endif /* GLOBUS_URL_H */