mirror of
https://github.com/Unidata/netcdf-c.git
synced 2024-11-27 07:30:33 +08:00
bc9e41ae2b
generates garbage. This in turn interferes with using .netrc because the garbage user+pwd can will override the .netrc. Note that this may work ok sometimes if the garbage happens to start with a nul character. 2. It turns out that the user:pwd combination needs to support character escaping. One reason is the user may contain an '@' character. The other is that modern password rules make it not unlikely that the password will contain characters that interfere with url parsing. So, the rule I have implemented is that all occurrences of the user:pwd format must escape any dodgy characters. The escape format is URL escaping of the form %XX. This applies both to user:pwd embedded in a URL as well as the use of HTTP.CREDENTIALS.USERPASSWORD in a .dodsrc/.daprc file. The user and password in .netrc must not be escaped. This is now documented in docs/auth.md The fix for #2 actually obviated #1. Now, internally, the user and pwd are stored separately and not in the user:pwd format. They are combined (and escaped) only when needed.
95 lines
3.0 KiB
C
95 lines
3.0 KiB
C
/*
|
|
* Copyright 1996, University Corporation for Atmospheric Research
|
|
* See netcdf/COPYRIGHT file for copying and redistribution conditions.
|
|
*/
|
|
|
|
#ifndef NCURI_H
|
|
#define NCURI_H
|
|
|
|
/* Define error codes */
|
|
#define NCU_OK (0)
|
|
#define NCU_EINVAL (1) /* Generic, mostly means bad argument */
|
|
#define NCU_EBADURL (2)
|
|
#define NCU_ENOMEM (3)
|
|
#define NCU_EPROTO (4)
|
|
#define NCU_EPATH (5)
|
|
#define NCU_EUSRPWD (6)
|
|
#define NCU_EHOST (7)
|
|
#define NCU_EPORT (8)
|
|
#define NCU_EPARAMS (9)
|
|
#define NCU_ENOPARAM (10)
|
|
#define NCU_ECONSTRAINTS (11)
|
|
|
|
/* Define flags to control what is included by ncuribuild*/
|
|
#define NCURIPATH 1
|
|
#define NCURIPWD 2
|
|
#define NCURIQUERY 4
|
|
#define NCURIFRAG 8
|
|
#define NCURIENCODE 16 /* If output should be encoded */
|
|
#define NCURIBASE (NCURIPWD|NCURIPATH)
|
|
#define NCURISVC (NCURIQUERY|NCURIBASE) /* for sending to server */
|
|
#define NCURIALL (NCURIPATH|NCURIPWD|NCURIQUERY|NCURIFRAG) /* for rebuilding after changes */
|
|
|
|
|
|
/*! This is an open structure meaning
|
|
it is ok to directly access its fields
|
|
*/
|
|
typedef struct NCURI {
|
|
char* uri; /* copy of url as passed by the caller */
|
|
char* protocol;
|
|
char* user; /* from user:password@ */
|
|
char* password; /* from user:password@ */
|
|
char* host; /*!< host*/
|
|
char* port; /*!< port */
|
|
char* path; /*!< path */
|
|
char* query; /*!< query */
|
|
char* fragment; /*!< fragment */
|
|
char** fraglist; /* envv style list of decomposed fragment*/
|
|
char** querylist; /* envv style list of decomposed query*/
|
|
#if 0
|
|
char* projection; /*!< without leading '?'*/
|
|
char* selection; /*!< with leading '&'*/
|
|
#endif
|
|
} NCURI;
|
|
|
|
#if defined(_CPLUSPLUS_) || defined(__CPLUSPLUS__) || defined(__CPLUSPLUS)
|
|
extern "C" {
|
|
#endif
|
|
|
|
extern int ncuriparse(const char* s, NCURI** ncuri);
|
|
extern void ncurifree(NCURI* ncuri);
|
|
|
|
/* Replace the protocol */
|
|
extern int ncurisetprotocol(NCURI*,const char* newprotocol);
|
|
|
|
/* Replace the constraints */
|
|
extern int ncurisetquery(NCURI*,const char* query);
|
|
|
|
/* Construct a complete NC URI; caller frees returned string */
|
|
extern char* ncuribuild(NCURI*,const char* prefix, const char* suffix, int flags);
|
|
|
|
/*! Search the fragment for a given parameter
|
|
Null result => entry not found; !NULL=>found;
|
|
In any case, the result is imutable and should not be free'd.
|
|
*/
|
|
extern const char* ncurilookup(NCURI*, const char* param);
|
|
|
|
/*! Search the query for a given parameter
|
|
Null result => entry not found; !NULL=>found;
|
|
In any case, the result is imutable and should not be free'd.
|
|
*/
|
|
extern const char* ncuriquerylookup(NCURI*, const char* param);
|
|
|
|
/* URL Encode/Decode */
|
|
extern char* ncuridecode(char* s);
|
|
/* Encode using specified character set */
|
|
extern char* ncuriencodeonly(char* s, char* allowable);
|
|
/* Encode user or pwd */
|
|
extern char* ncuriencodeuserpwd(char* s);
|
|
|
|
#if defined(_CPLUSPLUS_) || defined(__CPLUSPLUS__) || defined(__CPLUSPLUS)
|
|
}
|
|
#endif
|
|
|
|
#endif /*NCURI_H*/
|