|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// -*- mode: c++; c-basic-offset:4 -*-
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// This file is part of libdap, A C++ implementation of the OPeNDAP Data
|
|
Packit |
a4aae4 |
// Access Protocol.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Copyright (c) 2002,2003 OPeNDAP, Inc.
|
|
Packit |
a4aae4 |
// Author: James Gallagher <jgallagher@opendap.org>
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// This library is free software; you can redistribute it and/or
|
|
Packit |
a4aae4 |
// modify it under the terms of the GNU Lesser General Public
|
|
Packit |
a4aae4 |
// License as published by the Free Software Foundation; either
|
|
Packit |
a4aae4 |
// version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// This library is distributed in the hope that it will be useful,
|
|
Packit |
a4aae4 |
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
a4aae4 |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
a4aae4 |
// Lesser General Public License for more details.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// You should have received a copy of the GNU Lesser General Public
|
|
Packit |
a4aae4 |
// License along with this library; if not, write to the Free Software
|
|
Packit |
a4aae4 |
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// (c) COPYRIGHT URI/MIT 1997-1999
|
|
Packit |
a4aae4 |
// Please read the full copyright statement in the file COPYRIGHT_URI.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// Authors:
|
|
Packit |
a4aae4 |
// jhrg,jimg James Gallagher <jgallagher@gso.uri.edu>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// This is the source to `getdap'; a simple tool to exercise the Connect
|
|
Packit |
a4aae4 |
// class. It can be used to get naked URLs as well as the DAP2 DAS and DDS
|
|
Packit |
a4aae4 |
// objects. jhrg.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "config.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifdef WIN32
|
|
Packit |
a4aae4 |
#include <io.h>
|
|
Packit |
a4aae4 |
#include <fcntl.h>
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include <cstring>
|
|
Packit |
a4aae4 |
#include <string>
|
|
Packit |
a4aae4 |
#include <sstream>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "GetOpt.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "Sequence.h"
|
|
Packit |
a4aae4 |
#include "Connect.h"
|
|
Packit |
a4aae4 |
#include "Response.h"
|
|
Packit |
a4aae4 |
#include "StdinResponse.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
using std::cerr;
|
|
Packit |
a4aae4 |
using std::endl;
|
|
Packit |
a4aae4 |
using std::flush;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
using namespace libdap ;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
const char *version = CVER " (" DVR " DAP/" DAP_PROTOCOL_VERSION ")";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
extern int libdap::dods_keep_temps; // defined in HTTPResponse.h
|
|
Packit |
a4aae4 |
extern int libdap::www_trace;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void usage(string name)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
cerr << "Usage: " << name << endl;
|
|
Packit |
a4aae4 |
cerr << " [idaDxBzp vVkms][-c <expr>][-m <num>] <url> [<url> ...]" << endl;
|
|
Packit |
a4aae4 |
cerr << " [M vVkms] <file> [<file> ...]" << endl;
|
|
Packit |
a4aae4 |
cerr << endl;
|
|
Packit |
a4aae4 |
cerr << "In the first form of the command, dereference the URL and" << endl;
|
|
Packit |
a4aae4 |
cerr << "perform the requested operations. This includes routing" << endl;
|
|
Packit |
a4aae4 |
cerr << "the returned information through the DAP processing" << endl;
|
|
Packit |
a4aae4 |
cerr << "library (parsing the returned objects, et c.). If none" << endl;
|
|
Packit |
a4aae4 |
cerr << "of a, d, or D are used with a URL, then the DAP library" << endl;
|
|
Packit |
a4aae4 |
cerr << "routines are NOT used and the URLs contents are dumped" << endl;
|
|
Packit |
a4aae4 |
cerr << "to standard output." << endl;
|
|
Packit |
a4aae4 |
cerr << endl;
|
|
Packit |
a4aae4 |
cerr << "In the second form of the command, assume the files are" << endl;
|
|
Packit |
a4aae4 |
cerr << "DataDDS objects (stored in files or read from pipes)" << endl;
|
|
Packit |
a4aae4 |
cerr << "and process them as if -D were given. In this case the" << endl;
|
|
Packit |
a4aae4 |
cerr << "information *must* contain valid MIME header in order" << endl;
|
|
Packit |
a4aae4 |
cerr << "to be processed." << endl;
|
|
Packit |
a4aae4 |
cerr << endl;
|
|
Packit |
a4aae4 |
cerr << "Options:" << endl;
|
|
Packit |
a4aae4 |
cerr << " i: For each URL, get the server version." << endl;
|
|
Packit |
a4aae4 |
cerr << " d: For each URL, get the the DDS." << endl;
|
|
Packit |
a4aae4 |
cerr << " a: For each URL, get the the DAS." << endl;
|
|
Packit |
a4aae4 |
cerr << " D: For each URL, get the the DataDDS." << endl;
|
|
Packit |
a4aae4 |
cerr << " x: For each URL, get the (DAP2) DDX object. Does not get data." << endl;
|
|
Packit |
a4aae4 |
cerr << " B: Build a DDX in getdap using the DDS and DAS." << endl;
|
|
Packit |
a4aae4 |
cerr << " v: Verbose output." << endl;
|
|
Packit |
a4aae4 |
cerr << " V: Version of this client; see 'i' for server version." << endl;
|
|
Packit |
a4aae4 |
cerr << " c: <expr> is a constraint expression. Used with -D/X and -d/r" << endl;
|
|
Packit |
a4aae4 |
cerr << " NB: You can use a `?' for the CE also." << endl;
|
|
Packit |
a4aae4 |
cerr << " k: Keep temporary files created by libdap." << endl;
|
|
Packit |
a4aae4 |
cerr << " m: Request the same URL <num> times." << endl;
|
|
Packit |
a4aae4 |
cerr << " z: Ask the server to compress data." << endl;
|
|
Packit |
a4aae4 |
cerr << " s: Print Sequences using numbered rows." << endl;
|
|
Packit |
a4aae4 |
cerr << " M: Assume data read from a file has no MIME headers" << endl;
|
|
Packit |
a4aae4 |
cerr << " (the default is to assume the headers are present)." << endl;
|
|
Packit |
a4aae4 |
cerr << " p: Set DAP protocol to x.y" << endl;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
bool read_data(FILE * fp)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if (!fp) {
|
|
Packit |
a4aae4 |
fprintf(stderr, "getdap: Whoa!!! Null stream pointer.\n");
|
|
Packit |
a4aae4 |
return false;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
// Changed from a loop that used getc() to one that uses fread(). getc()
|
|
Packit |
a4aae4 |
// worked fine for transfers of text information, but *not* for binary
|
|
Packit |
a4aae4 |
// transfers. fread() will handle both.
|
|
Packit |
a4aae4 |
char c;
|
|
Packit |
a4aae4 |
while (fp && !feof(fp) && fread(&c, 1, 1, fp))
|
|
Packit |
a4aae4 |
printf("%c", c); // stick with stdio
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return true;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
static void print_data(DDS & dds, bool print_rows = false)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
cout << "The data:" << endl;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
for (DDS::Vars_iter i = dds.var_begin(); i != dds.var_end(); i++) {
|
|
Packit |
a4aae4 |
BaseType *v = *i;
|
|
Packit |
a4aae4 |
if (print_rows && (*i)->type() == dods_sequence_c)
|
|
Packit |
a4aae4 |
dynamic_cast < Sequence * >(*i)->print_val_by_rows(cout);
|
|
Packit |
a4aae4 |
else
|
|
Packit |
a4aae4 |
v->print_val(cout);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
cout << endl << flush;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
int main(int argc, char *argv[])
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
GetOpt getopt(argc, argv, "idaDxrXBVvkc:m:zshM?Hp:t");
|
|
Packit |
a4aae4 |
int option_char;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
bool get_das = false;
|
|
Packit |
a4aae4 |
bool get_dds = false;
|
|
Packit |
a4aae4 |
bool get_data = false;
|
|
Packit |
a4aae4 |
bool get_ddx = false;
|
|
Packit |
a4aae4 |
bool build_ddx = false;
|
|
Packit |
a4aae4 |
bool get_version = false;
|
|
Packit |
a4aae4 |
bool cexpr = false;
|
|
Packit |
a4aae4 |
bool verbose = false;
|
|
Packit |
a4aae4 |
bool multi = false;
|
|
Packit |
a4aae4 |
bool accept_deflate = false;
|
|
Packit |
a4aae4 |
bool print_rows = false;
|
|
Packit |
a4aae4 |
bool mime_headers = true;
|
|
Packit |
a4aae4 |
int times = 1;
|
|
Packit |
a4aae4 |
int dap_client_major = 2;
|
|
Packit |
a4aae4 |
int dap_client_minor = 0;
|
|
Packit |
a4aae4 |
string expr = "";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifdef WIN32
|
|
Packit |
a4aae4 |
_setmode(_fileno(stdout), _O_BINARY);
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
while ((option_char = getopt()) != -1)
|
|
Packit |
a4aae4 |
switch (option_char) {
|
|
Packit |
a4aae4 |
case 'd':
|
|
Packit |
a4aae4 |
get_dds = true;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case 'a':
|
|
Packit |
a4aae4 |
get_das = true;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case 'D':
|
|
Packit |
a4aae4 |
get_data = true;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case 'x':
|
|
Packit |
a4aae4 |
get_ddx = true;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case 'V':
|
|
Packit |
a4aae4 |
fprintf(stderr, "getdap version: %s\n", version);
|
|
Packit |
a4aae4 |
exit(0);
|
|
Packit |
a4aae4 |
case 'i':
|
|
Packit |
a4aae4 |
get_version = true;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case 'v':
|
|
Packit |
a4aae4 |
verbose = true;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case 'k':
|
|
Packit |
a4aae4 |
dods_keep_temps = 1;
|
|
Packit |
a4aae4 |
break; // keep_temp is in Connect.cc
|
|
Packit |
a4aae4 |
case 'c':
|
|
Packit |
a4aae4 |
cexpr = true;
|
|
Packit |
a4aae4 |
expr = getopt.optarg;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case 'm':
|
|
Packit |
a4aae4 |
multi = true;
|
|
Packit |
a4aae4 |
times = atoi(getopt.optarg);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case 'B':
|
|
Packit |
a4aae4 |
build_ddx = true;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case 'z':
|
|
Packit |
a4aae4 |
accept_deflate = true;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case 's':
|
|
Packit |
a4aae4 |
print_rows = true;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case 'M':
|
|
Packit |
a4aae4 |
mime_headers = false;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case 'p': {
|
|
Packit |
a4aae4 |
istringstream iss(getopt.optarg);
|
|
Packit |
a4aae4 |
char dot;
|
|
Packit |
a4aae4 |
iss >> dap_client_major;
|
|
Packit |
a4aae4 |
iss >> dot;
|
|
Packit |
a4aae4 |
iss >> dap_client_minor;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
case 't':
|
|
Packit |
a4aae4 |
www_trace = 1;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case 'h':
|
|
Packit |
a4aae4 |
case '?':
|
|
Packit |
a4aae4 |
default:
|
|
Packit |
a4aae4 |
usage(argv[0]);
|
|
Packit |
a4aae4 |
exit(1);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
try {
|
|
Packit |
a4aae4 |
// If after processing all the command line options there is nothing
|
|
Packit |
a4aae4 |
// left (no URL or file) assume that we should read from stdin.
|
|
Packit |
a4aae4 |
for (int i = getopt.optind; i < argc; ++i) {
|
|
Packit |
a4aae4 |
if (verbose)
|
|
Packit |
a4aae4 |
fprintf(stderr, "Fetching: %s\n", argv[i]);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
string name = argv[i];
|
|
Packit |
a4aae4 |
Connect *url = 0;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
url = new Connect(name);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// This overrides the value set in the .dodsrc file.
|
|
Packit |
a4aae4 |
if (accept_deflate)
|
|
Packit |
a4aae4 |
url->set_accept_deflate(accept_deflate);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (dap_client_major > 2)
|
|
Packit |
a4aae4 |
url->set_xdap_protocol(dap_client_major, dap_client_minor);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (url->is_local()) {
|
|
Packit |
a4aae4 |
if (verbose) {
|
|
Packit |
a4aae4 |
fprintf(stderr, "Assuming that the argument %s is a file that contains a response object; decoding.\n", argv[i]);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
Response *r = 0;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
BaseTypeFactory factory;
|
|
Packit |
a4aae4 |
DataDDS dds(&factory);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
try {
|
|
Packit |
a4aae4 |
if (strcmp(argv[i], "-") == 0) {
|
|
Packit |
a4aae4 |
r = new StdinResponse(stdin);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (!r->get_stream())
|
|
Packit |
a4aae4 |
throw Error("Could not open standard input.");
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (mime_headers)
|
|
Packit |
a4aae4 |
url->read_data(dds, r); // The default case
|
|
Packit |
a4aae4 |
else
|
|
Packit |
a4aae4 |
url->read_data_no_mime(dds, r);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else {
|
|
Packit |
a4aae4 |
r = new Response(fopen(argv[i], "r"), 0);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (!r->get_stream())
|
|
Packit |
a4aae4 |
throw Error(string("The input source: ")
|
|
Packit |
a4aae4 |
+ string(argv[i])
|
|
Packit |
a4aae4 |
+ string(" could not be opened"));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
url->read_data_no_mime(dds, r);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch (Error & e) {
|
|
Packit |
a4aae4 |
cerr << e.get_error_message() << endl;
|
|
Packit |
a4aae4 |
delete r;
|
|
Packit |
a4aae4 |
r = 0;
|
|
Packit |
a4aae4 |
delete url;
|
|
Packit |
a4aae4 |
url = 0;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (verbose)
|
|
Packit |
a4aae4 |
fprintf(stderr, "DAP version: %s, Server version: %s\n",
|
|
Packit |
a4aae4 |
url->get_protocol().c_str(),
|
|
Packit |
a4aae4 |
url->get_version().c_str());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
print_data(dds, print_rows);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
else if (get_version) {
|
|
Packit |
a4aae4 |
fprintf(stderr, "DAP version: %s, Server version: %s\n",
|
|
Packit |
a4aae4 |
url->request_protocol().c_str(),
|
|
Packit |
a4aae4 |
url->get_version().c_str());
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
else if (get_das) {
|
|
Packit |
a4aae4 |
for (int j = 0; j < times; ++j) {
|
|
Packit |
a4aae4 |
DAS das;
|
|
Packit |
a4aae4 |
try {
|
|
Packit |
a4aae4 |
url->request_das(das);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch (Error & e) {
|
|
Packit |
a4aae4 |
cerr << e.get_error_message() << endl;
|
|
Packit |
a4aae4 |
delete url;
|
|
Packit |
a4aae4 |
url = 0;
|
|
Packit |
a4aae4 |
continue;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (verbose) {
|
|
Packit |
a4aae4 |
fprintf(stderr, "DAP version: %s, Server version: %s\n",
|
|
Packit |
a4aae4 |
url->get_protocol().c_str(),
|
|
Packit |
a4aae4 |
url->get_version().c_str());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
fprintf(stderr, "DAS:\n");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
das.print(stdout);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
else if (get_dds) {
|
|
Packit |
a4aae4 |
for (int j = 0; j < times; ++j) {
|
|
Packit |
a4aae4 |
BaseTypeFactory factory;
|
|
Packit |
a4aae4 |
DDS dds(&factory);
|
|
Packit |
a4aae4 |
try {
|
|
Packit |
a4aae4 |
url->request_dds(dds, expr);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch (Error & e) {
|
|
Packit |
a4aae4 |
cerr << e.get_error_message() << endl;
|
|
Packit |
a4aae4 |
delete url;
|
|
Packit |
a4aae4 |
url = 0;
|
|
Packit |
a4aae4 |
continue; // Goto the next URL or exit the loop.
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (verbose) {
|
|
Packit |
a4aae4 |
fprintf(stderr, "DAP version: %s, Server version: %s\n",
|
|
Packit |
a4aae4 |
url->get_protocol().c_str(),
|
|
Packit |
a4aae4 |
url->get_version().c_str());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
fprintf(stderr, "DDS:\n");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
dds.print(cout);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
else if (get_ddx) {
|
|
Packit |
a4aae4 |
for (int j = 0; j < times; ++j) {
|
|
Packit |
a4aae4 |
BaseTypeFactory factory;
|
|
Packit |
a4aae4 |
DDS dds(&factory);
|
|
Packit |
a4aae4 |
try {
|
|
Packit |
a4aae4 |
url->request_ddx(dds, expr);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch (Error & e) {
|
|
Packit |
a4aae4 |
cerr << e.get_error_message() << endl;
|
|
Packit |
a4aae4 |
continue; // Goto the next URL or exit the loop.
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (verbose) {
|
|
Packit |
a4aae4 |
fprintf(stderr, "DAP version: %s, Server version: %s\n",
|
|
Packit |
a4aae4 |
url->get_protocol().c_str(),
|
|
Packit |
a4aae4 |
url->get_version().c_str());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
fprintf(stderr, "DDX:\n");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
dds.print_xml(cout, false);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
else if (build_ddx) {
|
|
Packit |
a4aae4 |
for (int j = 0; j < times; ++j) {
|
|
Packit |
a4aae4 |
BaseTypeFactory factory;
|
|
Packit |
a4aae4 |
DDS dds(&factory);
|
|
Packit |
a4aae4 |
try {
|
|
Packit |
a4aae4 |
url->request_dds(dds, expr);
|
|
Packit |
a4aae4 |
DAS das;
|
|
Packit |
a4aae4 |
url->request_das(das);
|
|
Packit |
a4aae4 |
dds.transfer_attributes(&das);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch (Error & e) {
|
|
Packit |
a4aae4 |
cerr << e.get_error_message() << endl;
|
|
Packit |
a4aae4 |
continue; // Goto the next URL or exit the loop.
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (verbose) {
|
|
Packit |
a4aae4 |
fprintf(stderr, "DAP version: %s, Server version: %s\n",
|
|
Packit |
a4aae4 |
url->get_protocol().c_str(),
|
|
Packit |
a4aae4 |
url->get_version().c_str());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
fprintf(stderr, "Client-built DDX:\n");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
dds.print_xml(cout, false);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
else if (get_data) {
|
|
Packit |
a4aae4 |
for (int j = 0; j < times; ++j) {
|
|
Packit |
a4aae4 |
BaseTypeFactory factory;
|
|
Packit |
a4aae4 |
DataDDS dds(&factory);
|
|
Packit |
a4aae4 |
try {
|
|
Packit |
a4aae4 |
DBG(cerr << "URL: " << url->URL(false) << endl);
|
|
Packit |
a4aae4 |
DBG(cerr << "CE: " << expr << endl);
|
|
Packit |
a4aae4 |
url->request_data(dds, expr);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (verbose)
|
|
Packit |
a4aae4 |
fprintf(stderr, "DAP version: %s, Server version: %s\n",
|
|
Packit |
a4aae4 |
url->get_protocol().c_str(),
|
|
Packit |
a4aae4 |
url->get_version().c_str());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
print_data(dds, print_rows);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch (Error & e) {
|
|
Packit |
a4aae4 |
cerr << e.get_error_message() << endl;
|
|
Packit |
a4aae4 |
delete url;
|
|
Packit |
a4aae4 |
url = 0;
|
|
Packit |
a4aae4 |
continue;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else {
|
|
Packit |
a4aae4 |
// if (!get_das && !get_dds && !get_data ...) This code uses
|
|
Packit |
a4aae4 |
// HTTPConnect::fetch_url which cannot be accessed using an
|
|
Packit |
a4aae4 |
// instance of Connect. So some of the options supported by
|
|
Packit |
a4aae4 |
// other URLs won't work here (e.g., the verbose option
|
|
Packit |
a4aae4 |
// doesn't show the server version number).
|
|
Packit |
a4aae4 |
HTTPConnect http(RCReader::instance());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// This overrides the value set in the .dodsrc file.
|
|
Packit |
a4aae4 |
if (accept_deflate)
|
|
Packit |
a4aae4 |
http.set_accept_deflate(accept_deflate);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (dap_client_major > 2)
|
|
Packit |
a4aae4 |
url->set_xdap_protocol(dap_client_major, dap_client_minor);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
string url_string = argv[i];
|
|
Packit |
a4aae4 |
for (int j = 0; j < times; ++j) {
|
|
Packit |
a4aae4 |
try {
|
|
Packit |
a4aae4 |
Response *r = http.fetch_url(url_string);
|
|
Packit |
a4aae4 |
if (!read_data(r->get_stream())) {
|
|
Packit |
a4aae4 |
continue;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
delete r;
|
|
Packit |
a4aae4 |
r = 0;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch (Error & e) {
|
|
Packit |
a4aae4 |
cerr << e.get_error_message() << endl;
|
|
Packit |
a4aae4 |
continue;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
delete url;
|
|
Packit |
a4aae4 |
url = 0;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch (Error &e) {
|
|
Packit |
a4aae4 |
cerr << e.get_error_message() << endl;
|
|
Packit |
a4aae4 |
return 1;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch (exception &e) {
|
|
Packit |
a4aae4 |
cerr << "C++ library exception: " << e.what() << endl;
|
|
Packit |
a4aae4 |
return 1;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return 0;
|
|
Packit |
a4aae4 |
}
|