From 793ecc8e60e7666274fb246decbc4bb9b00f3b17 Mon Sep 17 00:00:00 2001 From: Dennis Heimbigner Date: Thu, 5 Nov 2020 11:04:56 -0700 Subject: [PATCH 1/2] Yet another fix for DAP2 double URL encoding. 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:////#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 --- RELEASE_NOTES.md | 1 + configure.ac | 8 ++++---- include/ncdap.h | 3 +++ include/ncuri.h | 19 ++++++++++--------- libdap2/daputil.c | 33 +++++++++++++++++++++++++-------- libdap2/daputil.h | 2 ++ libdap2/ncd2dispatch.c | 28 ++++++++++++++++++++++++++++ libdispatch/ncuri.c | 14 ++++++++++---- libsrc/putget.m4 | 4 ++++ oc2/oc.c | 4 ++-- oc2/oc.h | 13 +++++++++++-- oc2/ocinternal.c | 11 +++++++---- oc2/ocinternal.h | 2 +- oc2/ocread.c | 26 +++++++++++++++----------- oc2/ocread.h | 6 +++--- 15 files changed, 126 insertions(+), 48 deletions(-) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 70e05f70f9..4236c02549 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -7,6 +7,7 @@ This file contains a high-level description of this package's evolution. Release ## 4.8.0 - TBD +* [Enhancement] Give the client control over what parts of a DAP2 URL are URL encoded (i.e. %xx). This is to support the different decoding rules that servers apply to incoming URLS. * [Bug Fix] Fix incorrect time offsets from `ncdump -t`, in some cases when the time `units` attribute contains both a **non-zero** time-of-day, and a time zone suffix containing the letter "T", such as "UTC". See [Github #1866](https://github.com/Unidata/netcdf-c/pull/1866) for more information. * [Bug Fix] Cleanup the NCZarr S3 build options. See [Github #1869](https://github.com/Unidata/netcdf-c/pull/1869) for more information. * [Bug Fix] Support aligned access for selected ARM processors. See [Github #1871](https://github.com/Unidata/netcdf-c/pull/1871) for more information. diff --git a/configure.ac b/configure.ac index 2e166be5b0..226c3394fe 100644 --- a/configure.ac +++ b/configure.ac @@ -498,11 +498,11 @@ CFLAGS="$SAVECFLAGS" # --enable-dap => enable-dap4 enable_dap4=$enable_dap # Default is to do the short remote tests. -# Temporary: Change default to npt do these tests -AC_MSG_CHECKING([whether dap remote testing should be enabled (default on)]) +# Temporary: Change default to not do these tests +AC_MSG_CHECKING([whether dap remote testing should be enabled (default off)]) AC_ARG_ENABLE([dap-remote-tests], - [AS_HELP_STRING([--disable-dap-remote-tests], - [disable dap remote tests])]) + [AS_HELP_STRING([--enable-dap-remote-tests], + [enable dap remote tests])]) test "x$enable_dap_remote_tests" = xyes || enable_dap_remote_tests=no if test "x$enable_dap" = "xno" ; then enable_dap_remote_tests=no diff --git a/include/ncdap.h b/include/ncdap.h index 40894ba612..bb49a8472f 100644 --- a/include/ncdap.h +++ b/include/ncdap.h @@ -36,6 +36,9 @@ typedef unsigned int NCFLAGS; #define NCF_PREFETCH_ALL (0x0800) /* Prefetch all variables */ /* Allow _FillValue/Variable type mismatch */ #define NCF_FILLMISMATCH (0x1000) +/* Hack to control URL encoding */ +#define NCF_ENCODE_PATH (0x2000) +#define NCF_ENCODE_QUERY (0x4000) /*COLUMBIA_HACK*/ #define NCF_COLUMBIA (0x80000000) /* Hack for columbia server */ diff --git a/include/ncuri.h b/include/ncuri.h index 63f40ce0ab..d2cd5dbfa5 100644 --- a/include/ncuri.h +++ b/include/ncuri.h @@ -9,15 +9,16 @@ #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 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 */ - +#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 diff --git a/libdap2/daputil.c b/libdap2/daputil.c index c8aa27eef0..987286fce1 100644 --- a/libdap2/daputil.c +++ b/libdap2/daputil.c @@ -654,8 +654,8 @@ dap_fetch(NCDAPCOMMON* nccomm, OClink conn, const char* ce, NCerror ncstat = NC_NOERR; OCerror ocstat = OC_NOERR; char* ext = NULL; - OCflags flags = 0; int httpcode = 0; + OCflags ocflags = 0; #ifdef HAVE_GETTIMEOFDAY struct timeval time0; struct timeval time1; @@ -668,13 +668,14 @@ dap_fetch(NCDAPCOMMON* nccomm, OClink conn, const char* ce, if(ce != NULL && strlen(ce) == 0) ce = NULL; - if(FLAGSET(nccomm->controls,NCF_UNCONSTRAINABLE)) { + if(FLAGSET(nccomm->controls,NCF_UNCONSTRAINABLE)) ce = NULL; - } - - if(FLAGSET(nccomm->controls,NCF_ONDISK)) { - flags |= OCONDISK; - } + if(FLAGSET(nccomm->controls,NCF_ONDISK)) + ocflags |= OCONDISK; + if(FLAGSET(nccomm->controls,NCF_ENCODE_PATH)) + ocflags |= OCENCODEPATH; + if(FLAGSET(nccomm->controls,NCF_ENCODE_QUERY)) + ocflags |= OCENCODEQUERY; if(SHOWFETCH) { /* Build uri string minus the constraint and #tag */ @@ -688,7 +689,7 @@ dap_fetch(NCDAPCOMMON* nccomm, OClink conn, const char* ce, gettimeofday(&time0,NULL); #endif } - ocstat = oc_fetch(conn,ce,dxd,flags,rootp); + ocstat = oc_fetch(conn,ce,dxd,ocflags,rootp); if(FLAGSET(nccomm->controls,NCF_SHOWFETCH)) { #ifdef HAVE_GETTIMEOFDAY double secs; @@ -810,3 +811,19 @@ nccpadding(unsigned long offset, int alignment) return pad; } +int +dapparamparselist(const char* s0, int delim, NClist* list) +{ + int stat = NC_NOERR; + char* s = strdup(s0); + char* p; + int i,count = 1; + if(s0 == NULL || strlen(s) == 0) goto done; + for(p=s;*p;p++) {if(*p == delim) {*p = '\0'; count++;}} + for(i=0,p=s;i0) + nclistpush(list,strdup(p)); + } +done: + return stat; +} diff --git a/libdap2/daputil.h b/libdap2/daputil.h index 836e064176..c7883e758c 100644 --- a/libdap2/daputil.h +++ b/libdap2/daputil.h @@ -72,4 +72,6 @@ extern int dap_badname(char* name); extern char* dap_repairname(char* name); extern char* dap_getselection(NCURI* uri); +extern int dapparamparselist(const char* s0, int delim, NClist* list); + #endif /*DAPUTIL_H*/ diff --git a/libdap2/ncd2dispatch.c b/libdap2/ncd2dispatch.c index b3786071b5..36dc720740 100644 --- a/libdap2/ncd2dispatch.c +++ b/libdap2/ncd2dispatch.c @@ -2207,6 +2207,8 @@ fixzerodims(NCDAPCOMMON* dapcomm) static void applyclientparamcontrols(NCDAPCOMMON* dapcomm) { + const char* value = NULL; + /* clear the flags */ CLRFLAG(dapcomm->controls,NCF_CACHE); CLRFLAG(dapcomm->controls,NCF_SHOWFETCH); @@ -2214,6 +2216,8 @@ applyclientparamcontrols(NCDAPCOMMON* dapcomm) CLRFLAG(dapcomm->controls,NCF_NCDAP); CLRFLAG(dapcomm->controls,NCF_PREFETCH); CLRFLAG(dapcomm->controls,NCF_PREFETCH_EAGER); + CLRFLAG(dapcomm->controls,NCF_ENCODE_PATH); + CLRFLAG(dapcomm->controls,NCF_ENCODE_QUERY); /* Turn on any default on flags */ SETFLAG(dapcomm->controls,DFALT_ON_FLAGS); @@ -2248,6 +2252,30 @@ applyclientparamcontrols(NCDAPCOMMON* dapcomm) else if(dapparamcheck(dapcomm,"nofillmismatch",NULL)) CLRFLAG(dapcomm->controls,NCF_FILLMISMATCH); + if((value=dapparamvalue(dapcomm,"encode")) != NULL) { + int i; + NClist* encode = nclistnew(); + if(dapparamparselist(value,',',encode)) + nclog(NCLOGERR,"Malformed encode parameter: %s",value); + else { + /* First, turn off all the encode flags */ + CLRFLAG(dapcomm->controls,NCF_ENCODE_PATH|NCF_ENCODE_QUERY); + for(i=0;icontrols,NCF_ENCODE_PATH); + else if(strcmp(s,"query")==0) + SETFLAG(dapcomm->controls,NCF_ENCODE_QUERY); + else if(strcmp(s,"all")==0) + SETFLAG(dapcomm->controls,NCF_ENCODE_PATH|NCF_ENCODE_QUERY); + else if(strcmp(s,"none")==0) + CLRFLAG(dapcomm->controls,NCF_ENCODE_PATH|NCF_ENCODE_QUERY); + } + } + nclistfree(encode); + } else { /* Set defaults */ + SETFLAG(dapcomm->controls,NCF_ENCODE_QUERY); + } nclog(NCLOGNOTE,"Caching=%d",FLAGSET(dapcomm->controls,NCF_CACHE)); } diff --git a/libdispatch/ncuri.c b/libdispatch/ncuri.c index 696c1ac1de..6541423836 100644 --- a/libdispatch/ncuri.c +++ b/libdispatch/ncuri.c @@ -629,7 +629,8 @@ ncuribuild(NCURI* duri, const char* prefix, const char* suffix, int flags) { char* newuri = NULL; NCbytes* buf = ncbytesnew(); - const int encode = (flags&NCURIENCODE ? 1 : 0); + const int encodepath = (flags&NCURIENCODEPATH ? 1 : 0); + const int encodequery = (flags&NCURIENCODEQUERY ? 1 : 0); if(prefix != NULL) ncbytescat(buf,prefix); @@ -656,7 +657,7 @@ ncuribuild(NCURI* duri, const char* prefix, const char* suffix, int flags) if((flags & NCURIPATH)) { if(duri->path == NULL) ncbytescat(buf,"/"); - else if(encode) { + else if(encodepath) { char* encoded = ncuriencodeonly(duri->path,pathallow); ncbytescat(buf,encoded); nullfree(encoded); @@ -675,8 +676,13 @@ ncuribuild(NCURI* duri, const char* prefix, const char* suffix, int flags) ensurequerylist(duri); if(duri->query != NULL) { ncbytescat(buf,"?"); - ncbytescat(buf,duri->query); - } + if(encodequery) { + char* encoded = ncuriencodeonly(duri->query,queryallow); + ncbytescat(buf,encoded); + nullfree(encoded); + } else + ncbytescat(buf,duri->query); + } } if(flags & NCURIFRAG) { ensurefraglist(duri); diff --git a/libsrc/putget.m4 b/libsrc/putget.m4 index dcbb91981b..2779480bab 100644 --- a/libsrc/putget.m4 +++ b/libsrc/putget.m4 @@ -644,6 +644,8 @@ putNCvx_$1_$2(NC3_INFO* ncp, const NC_var *varp, void *xp; void *fillp=NULL; + NC_UNUSED(fillp); + if(nelems == 0) return NC_NOERR; @@ -847,7 +849,9 @@ getNCvx_$1_$2(const NC3_INFO* ncp, const NC_var *varp, } ')dnl +#if 0 /*unused*/ GETNCVX(char, char) +#endif GETNCVX(schar, schar) GETNCVX(schar, short) diff --git a/oc2/oc.c b/oc2/oc.c index ed992732df..fb19268d45 100644 --- a/oc2/oc.c +++ b/oc2/oc.c @@ -1804,12 +1804,12 @@ oc_raw_xdrsize(OCobject link, OCobject ddsroot, off_t* xdrsizep) /* Resend a url as a head request to check the Last-Modified time */ OCerror -oc_update_lastmodified_data(OCobject link) +oc_update_lastmodified_data(OCobject link, OCflags flags) { OCstate* state; OCVERIFY(OC_State,link); OCDEREF(OCstate*,state,link); - return OCTHROW(ocupdatelastmodifieddata(state)); + return OCTHROW(ocupdatelastmodifieddata(state,flags)); } long diff --git a/oc2/oc.h b/oc2/oc.h index 9f71455313..eeb40161b5 100644 --- a/oc2/oc.h +++ b/oc2/oc.h @@ -51,9 +51,18 @@ typedef int OCflags; /*!\def OCONDISK Cause oc_fetch to store the retrieved data on disk. */ - #define OCONDISK 1 +/*!\def OCENCODEPATH +Cause oc_fetch to encode path part of a URL +*/ +#define OCENCODEPATH 2 + +/*!\def OCENCODEQUERY +Cause oc_fetch to encode query part of a URL +*/ +#define OCENCODEQUERY 4 + /**************************************************/ /* OCtype */ @@ -583,7 +592,7 @@ EXTERNL OCerror oc_set_curlopt(OClink link, const char* option, void* value); EXTERNL OCerror oc_get_connection(OCobject ocnode, OCobject* linkp); /* Resend a url as a head request to check the Last-Modified time */ -EXTERNL OCerror oc_update_lastmodified_data(OClink); +EXTERNL OCerror oc_update_lastmodified_data(OClink,OCflags); /* Get last known modification time; -1 => data unknown */ EXTERNL long oc_get_lastmodified_data(OClink); diff --git a/oc2/ocinternal.c b/oc2/ocinternal.c index 22bf53cf0d..8c236470bd 100644 --- a/oc2/ocinternal.c +++ b/oc2/ocinternal.c @@ -180,14 +180,14 @@ ocfetch(OCstate* state, const char* constraint, OCdxd kind, OCflags flags, switch (kind) { case OCDAS: - stat = readDAS(state,tree); + stat = readDAS(state,tree,flags); if(stat == OC_NOERR) { tree->text = ncbytesdup(state->packet); if(tree->text == NULL) stat = OC_EDAS; } break; case OCDDS: - stat = readDDS(state,tree); + stat = readDDS(state,tree,flags); if(stat == OC_NOERR) { tree->text = ncbytesdup(state->packet); if(tree->text == NULL) stat = OC_EDDS; @@ -460,12 +460,15 @@ fprintf(stderr,"missing bod: ddslen=%lu bod=%lu\n", } OCerror -ocupdatelastmodifieddata(OCstate* state) +ocupdatelastmodifieddata(OCstate* state, OCflags ocflags) { OCerror status = OC_NOERR; long lastmodified; char* base = NULL; - base = ncuribuild(state->uri,NULL,NULL,NCURIENCODE); + int flags = 0; + if(ocflags & OCENCODEPATH) flags |= NCURIENCODEPATH; + if(ocflags & OCENCODEQUERY) flags |= NCURIENCODEQUERY; + base = ncuribuild(state->uri,NULL,NULL,flags); status = ocfetchlastmodified(state->curl, base, &lastmodified); free(base); if(status == OC_NOERR) { diff --git a/oc2/ocinternal.h b/oc2/ocinternal.h index 58d51fc0d9..be9d4ecad2 100644 --- a/oc2/ocinternal.h +++ b/oc2/ocinternal.h @@ -229,7 +229,7 @@ extern int oc_network_order; extern int oc_invert_xdr_double; extern OCerror ocinternalinitialize(void); -extern OCerror ocupdatelastmodifieddata(OCstate* state); +extern OCerror ocupdatelastmodifieddata(OCstate* state, OCflags); extern OCerror ocset_useragent(OCstate* state, const char* agent); extern OCerror ocset_netrc(OCstate* state, const char* path); diff --git a/oc2/ocread.c b/oc2/ocread.c index 3f3b2dca2a..a96fb7efbe 100644 --- a/oc2/ocread.c +++ b/oc2/ocread.c @@ -29,12 +29,12 @@ #include "ncpathmgr.h" /*Forward*/ -static int readpacket(OCstate* state, NCURI*, NCbytes*, OCdxd, long*); +static int readpacket(OCstate* state, NCURI*, NCbytes*, OCdxd, OCflags, long*); static int readfile(const char* path, const char* suffix, NCbytes* packet); static int readfiletofile(const char* path, const char* suffix, FILE* stream, off_t*); int -readDDS(OCstate* state, OCtree* tree) +readDDS(OCstate* state, OCtree* tree, OCflags flags) { int stat = OC_NOERR; long lastmodified = -1; @@ -44,7 +44,7 @@ readDDS(OCstate* state, OCtree* tree) #ifdef OCDEBUG fprintf(stderr,"readDDS:\n"); #endif - stat = readpacket(state,state->uri,state->packet,OCDDS, + stat = readpacket(state,state->uri,state->packet,OCDDS, flags, &lastmodified); if(stat == OC_NOERR) state->ddslastmodified = lastmodified; @@ -52,7 +52,7 @@ fprintf(stderr,"readDDS:\n"); } int -readDAS(OCstate* state, OCtree* tree) +readDAS(OCstate* state, OCtree* tree, OCflags flags) { int stat = OC_NOERR; @@ -60,7 +60,7 @@ readDAS(OCstate* state, OCtree* tree) #ifdef OCDEBUG fprintf(stderr,"readDAS:\n"); #endif - stat = readpacket(state,state->uri,state->packet,OCDAS,NULL); + stat = readpacket(state,state->uri,state->packet,OCDAS,flags,NULL); return stat; } @@ -86,7 +86,7 @@ ocdxdextension(OCdxd dxd) } static int -readpacket(OCstate* state, NCURI* url,NCbytes* packet,OCdxd dxd,long* lastmodified) +readpacket(OCstate* state, NCURI* url, NCbytes* packet, OCdxd dxd, OCflags ocflags, long* lastmodified) { int stat = OC_NOERR; int fileprotocol = 0; @@ -102,8 +102,9 @@ readpacket(OCstate* state, NCURI* url,NCbytes* packet,OCdxd dxd,long* lastmodifi stat = readfile(fetchurl,suffix,packet); } else { int flags = NCURIBASE; + if(ocflags & OCENCODEPATH)flags |= NCURIENCODEPATH; + if(ocflags & OCENCODEQUERY) flags |= NCURIENCODEQUERY; if(!fileprotocol) flags |= NCURIQUERY; - flags |= NCURIENCODE; fetchurl = ncuribuild(url,NULL,suffix,flags); MEMCHECK(fetchurl,OC_ENOMEM); if(ocdebug > 0) @@ -125,7 +126,7 @@ fprintf(stderr,"readpacket: packet.size=%lu\n", } int -readDATADDS(OCstate* state, OCtree* tree, OCflags flags) +readDATADDS(OCstate* state, OCtree* tree, OCflags ocflags) { int stat = OC_NOERR; long lastmod = -1; @@ -133,9 +134,9 @@ readDATADDS(OCstate* state, OCtree* tree, OCflags flags) #ifdef OCDEBUG fprintf(stderr,"readDATADDS:\n"); #endif - if((flags & OCONDISK) == 0) { + if((ocflags & OCONDISK) == 0) { ncurisetquery(state->uri,tree->constraint); - stat = readpacket(state,state->uri,state->packet,OCDATADDS,&lastmod); + stat = readpacket(state,state->uri,state->packet,OCDATADDS,ocflags,&lastmod); if(stat == OC_NOERR) state->datalastmodified = lastmod; tree->data.datasize = ncbyteslength(state->packet); @@ -151,8 +152,11 @@ fprintf(stderr,"readDATADDS:\n"); stat = readfiletofile(readurl, ".dods", tree->data.file, &tree->data.datasize); } else { int flags = NCURIBASE; + if(ocflags & OCENCODEPATH) + flags |= NCURIENCODEPATH; + if(ocflags & OCENCODEQUERY) + flags |= NCURIENCODEQUERY; if(!fileprotocol) flags |= NCURIQUERY; - flags |= NCURIENCODE; ncurisetquery(url,tree->constraint); readurl = ncuribuild(url,NULL,".dods",flags); MEMCHECK(readurl,OC_ENOMEM); diff --git a/oc2/ocread.h b/oc2/ocread.h index f3b0e5490c..117eb73773 100644 --- a/oc2/ocread.h +++ b/oc2/ocread.h @@ -5,9 +5,9 @@ #define READ_H -extern int readDDS(OCstate*, OCtree*); -extern int readDAS(OCstate*, OCtree*); +extern int readDDS(OCstate*, OCtree*, OCflags); +extern int readDAS(OCstate*, OCtree*, OCflags); -extern int readDATADDS(OCstate*, OCtree*, int inmemory); +extern int readDATADDS(OCstate*, OCtree*, OCflags); #endif /*READ_H*/ From 6d3546b8a089709df2e4cf9d4781768de8e9fe18 Mon Sep 17 00:00:00 2001 From: Dennis Heimbigner Date: Thu, 12 Nov 2020 16:06:01 -0700 Subject: [PATCH 2/2] Add encode= tests --- ncdap_test/CMakeLists.txt | 1 + ncdap_test/Makefile.am | 2 +- ncdap_test/tst_encode.sh | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 ncdap_test/tst_encode.sh diff --git a/ncdap_test/CMakeLists.txt b/ncdap_test/CMakeLists.txt index 469f1136c2..9fe5f2f5f8 100644 --- a/ncdap_test/CMakeLists.txt +++ b/ncdap_test/CMakeLists.txt @@ -40,6 +40,7 @@ IF(ENABLE_TESTS) add_sh_test(ncdap tst_ber) add_sh_test(ncdap tst_remote3) add_sh_test(ncdap tst_zero_len_var) + add_sh_test(ncdap tst_encode) # not yet add_sh_test(ncdap tst_hyrax) add_sh_test(ncdap tst_fillmismatch) IF(ENABLE_DAP_LONG_TESTS) diff --git a/ncdap_test/Makefile.am b/ncdap_test/Makefile.am index 42126b53e0..5f521167f5 100644 --- a/ncdap_test/Makefile.am +++ b/ncdap_test/Makefile.am @@ -45,7 +45,7 @@ endif if ENABLE_DAP_REMOTE_TESTS if BUILD_UTILITIES -TESTS += tst_ber.sh tst_remote3.sh tst_formatx.sh testurl.sh tst_fillmismatch.sh tst_zero_len_var.sh +TESTS += tst_ber.sh tst_remote3.sh tst_formatx.sh testurl.sh tst_fillmismatch.sh tst_zero_len_var.sh tst_encode.sh endif TESTS += test_partvar diff --git a/ncdap_test/tst_encode.sh b/ncdap_test/tst_encode.sh new file mode 100644 index 0000000000..784dbef18b --- /dev/null +++ b/ncdap_test/tst_encode.sh @@ -0,0 +1,14 @@ +#!/bin/sh +# Dennis Heimbigner + +if test "x$srcdir" = x ; then srcdir=`pwd`; fi +. ../test_common.sh + +set -e +echo "" +echo "*** Testing #encode=" mechanism + +${NCDUMP} -h 'http://opendap2.oceanbrowser.net/thredds/dodsC/data/emodnet1-domains/tmp%20test.nc?lon[0:8]#encode=none' +${NCDUMP} -h 'http://iridl.ldeo.columbia.edu/SOURCES/.Indices/.soi/.c8110/.anomaly/T/%28Jan%201979%29/VALUE/dods?anomaly[0]' + +