mirror of
https://github.com/Unidata/netcdf-c.git
synced 2025-02-05 16:20:10 +08:00
re: https://github.com/Unidata/netcdf-c/issues/1876 and: https://github.com/Unidata/netcdf-c/pull/1835 and: https://github.com/Unidata/netcdf4-python/issues/1041 The change in PR 1835 was correct with respect to using %20 instead of '+' for encoding blanks. However, it was a mistake to assume everything was unencoded and then to do encoding ourselves. The problem is that different servers do different things, with Columbia being an outlier. So, I have added a set of client controls that can at least give the caller some control over this. The caller can append the following fragment to his URL to control what gets encoded before sending it to the server. The syntax is as follows: ```` https://<host>/<path>/<query>#encode=path|query|all|none ```` The possible values: * path -- URL encode (i.e. %xx encode) as needed in the path part of the URL. * query -- URL encode as needed in the query part of the URL. * all -- equivalent to ````#encode=path,query````. * none -- do not url encode any part of the URL sent to the server; not strictly necessary, so mostly for completeness. Note that if "encode=" is used, then before it is processed, all encoding is turned of so that ````#encode=path```` will only encode the path and not the query. The default is ````#encode=query````, so the path is left untouched, but the query is always encoded. Internally, this required changes to pass the encode flags down into the OC2 library. Misc. Unrelated Changes: * Shut up those irritating warning from putget.m4
117 lines
3.9 KiB
C
117 lines
3.9 KiB
C
/*
|
|
* Copyright 2018, University Corporation for Atmospheric Research
|
|
* See netcdf/COPYRIGHT file for copying and redistribution conditions.
|
|
*/
|
|
|
|
#ifndef NCURI_H
|
|
#define NCURI_H
|
|
|
|
#include "ncexternl.h"
|
|
|
|
/* Define flags to control what is included by ncuribuild*/
|
|
#define NCURIPATH 1
|
|
#define NCURIPWD 2
|
|
#define NCURIQUERY 4
|
|
#define NCURIFRAG 8
|
|
#define NCURIENCODEPATH 16 /* If output url path should be encoded */
|
|
#define NCURIENCODEQUERY 32 /* If output url query should be encoded */
|
|
#define NCURIENCODE (NCURIENCODEPATH|NCURIENCODEQUERY)
|
|
#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 0
|
|
/* Declaration modifiers for DLL support (MSC et al) */
|
|
#if defined(DLL_NETCDF) /* define when library is a DLL */
|
|
# if defined(DLL_EXPORT) /* define when building the library */
|
|
# define MSC_EXTRA __declspec(dllexport)
|
|
# else
|
|
# define MSC_EXTRA __declspec(dllimport)
|
|
# endif
|
|
# include <io.h>
|
|
#else
|
|
#define MSC_EXTRA /**< Needed for DLL build. */
|
|
#endif /* defined(DLL_NETCDF) */
|
|
|
|
#define EXTERNL MSC_EXTRA extern /**< Needed for DLL build. */
|
|
#endif
|
|
|
|
#if defined(_CPLUSPLUS_) || defined(__CPLUSPLUS__) || defined(__CPLUSPLUS)
|
|
extern "C" {
|
|
#endif
|
|
|
|
EXTERNL int ncuriparse(const char* s, NCURI** ncuri);
|
|
EXTERNL void ncurifree(NCURI* ncuri);
|
|
|
|
/* Replace the protocol */
|
|
EXTERNL int ncurisetprotocol(NCURI*,const char* newprotocol);
|
|
|
|
/* Replace the constraints */
|
|
EXTERNL int ncurisetquery(NCURI*,const char* query);
|
|
|
|
/* Replace the fragment list */
|
|
EXTERNL int ncurisetfragments(NCURI*, const char* fragments);
|
|
|
|
/* Replace a specific &key=...& in uri fragment */
|
|
EXTERNL int ncurisetfragmentkey(NCURI* duri,const char* key, const char* value);
|
|
|
|
/* append a specific &key=...& in uri fragment */
|
|
EXTERNL int ncuriappendfragmentkey(NCURI* duri,const char* key, const char* value);
|
|
|
|
/* Construct a complete NC URI; caller frees returned string */
|
|
EXTERNL 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.
|
|
*/
|
|
EXTERNL const char* ncurifragmentlookup(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.
|
|
*/
|
|
EXTERNL const char* ncuriquerylookup(NCURI*, const char* param);
|
|
|
|
/* Obtain the complete list of fragment pairs in envv format */
|
|
EXTERNL const char** ncurifragmentparams(NCURI*);
|
|
|
|
/* Obtain the complete list of query pairs in envv format */
|
|
EXTERNL const char** ncuriqueryparams(NCURI*);
|
|
|
|
/* URL Encode/Decode */
|
|
EXTERNL char* ncuridecode(const char* s);
|
|
/* Partial decode */
|
|
EXTERNL char* ncuridecodepartial(const char* s, const char* decodeset);
|
|
/* Encode using specified character set */
|
|
EXTERNL char* ncuriencodeonly(const char* s, const char* allowable);
|
|
/* Encode user or pwd */
|
|
EXTERNL char* ncuriencodeuserpwd(const char* s);
|
|
|
|
#if defined(_CPLUSPLUS_) || defined(__CPLUSPLUS__) || defined(__CPLUSPLUS)
|
|
}
|
|
#endif
|
|
|
|
#endif /*NCURI_H*/
|