summaryrefslogtreecommitdiffstats
path: root/lib/libUPnP/Neptune/Source/Apps/NetGet/NetGet.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libUPnP/Neptune/Source/Apps/NetGet/NetGet.cpp')
-rw-r--r--lib/libUPnP/Neptune/Source/Apps/NetGet/NetGet.cpp279
1 files changed, 279 insertions, 0 deletions
diff --git a/lib/libUPnP/Neptune/Source/Apps/NetGet/NetGet.cpp b/lib/libUPnP/Neptune/Source/Apps/NetGet/NetGet.cpp
new file mode 100644
index 0000000..4dc0a31
--- /dev/null
+++ b/lib/libUPnP/Neptune/Source/Apps/NetGet/NetGet.cpp
@@ -0,0 +1,279 @@
+/*****************************************************************
+|
+| Neptune Utilities - Network 'Get' Client
+|
+| (c) 2001-2010 Gilles Boccon-Gibod
+| Author: Gilles Boccon-Gibod (bok@bok.net)
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include <stdio.h>
+
+/*----------------------------------------------------------------------
+| PrintUsageAndExit
++---------------------------------------------------------------------*/
+static void
+PrintUsageAndExit(void)
+{
+ fprintf(stderr,
+ "NetGet [options] <url>\n"
+ "\n"
+ " Options:\n"
+ " --verbose : print verbose information\n"
+ " --no-body-output : do not output the response body\n"
+ " --http-1-1 : use HTTP 1.1\n"
+#if defined(NPT_CONFIG_ENABLE_TLS)
+ " --ssl-client-cert <filename> : load client TLS certificate from <filename> (PKCS12)\n"
+ " --ssl-client-cert-password <password> : optional password for the client cert\n"
+ " --ssl-accept-self-signed-certs : accept self-signed server certificates\n"
+ " --ssl-accept-hostname-mismatch : accept server certificates that don't match\n"
+#endif
+ " --show-proxy : show the proxy that will be used for the connection\n");
+}
+
+/*----------------------------------------------------------------------
+| main
++---------------------------------------------------------------------*/
+int
+main(int argc, char** argv)
+{
+ // check command line
+ if (argc < 2) {
+ PrintUsageAndExit();
+ return 1;
+ }
+
+ // init options
+ bool verbose = false;
+ bool no_body_output = false;
+ bool show_proxy = false;
+ bool url_set = false;
+ bool http_1_1 = false;
+ NPT_HttpUrl url;
+ NPT_HttpClient::Connector* connector = NULL;
+#if defined(NPT_CONFIG_ENABLE_TLS)
+ NPT_TlsContext* tls_context = NULL;
+ const char* tls_cert_filename = NULL;
+ const char* tls_cert_password = NULL;
+ unsigned int tls_options = 0;
+#endif
+
+ // parse command line
+ ++argv;
+ const char* arg;
+ while ((arg = *argv++)) {
+ if (NPT_StringsEqual(arg, "--verbose")) {
+ verbose = true;
+ } else if (NPT_StringsEqual(arg, "--show-proxy")) {
+ show_proxy = true;
+ } else if (NPT_StringsEqual(arg, "--no-body-output")) {
+ no_body_output = true;
+ } else if (NPT_StringsEqual(arg, "--http-1-1")) {
+ http_1_1 = true;
+#if defined(NPT_CONFIG_ENABLE_TLS)
+ } else if (NPT_StringsEqual(arg, "--ssl-client-cert")) {
+ tls_cert_filename = *argv++;
+ if (tls_cert_filename == NULL) {
+ fprintf(stderr, "ERROR: missing argument after --ssl-client-cert option\n");
+ return 1;
+ }
+ } else if (NPT_StringsEqual(arg, "--ssl-client-cert-password")) {
+ tls_cert_password = *argv++;
+ if (tls_cert_password == NULL) {
+ fprintf(stderr, "ERROR: missing argument after --ssl-client-cert-password option\n");
+ return 1;
+ }
+ } else if (NPT_StringsEqual(arg, "--ssl-accept-self-signed-certs")) {
+ tls_options |= NPT_HttpTlsConnector::OPTION_ACCEPT_SELF_SIGNED_CERTS;
+ } else if (NPT_StringsEqual(arg, "--ssl-accept-hostname-mismatch")) {
+ tls_options |= NPT_HttpTlsConnector::OPTION_ACCEPT_HOSTNAME_MISMATCH;
+#endif
+ } else if (!url_set) {
+ NPT_Result result = url.Parse(arg);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "ERROR: failed to parse URL (%d:%s)\n", result, NPT_ResultText(result));
+ return 1;
+ }
+ url_set = true;
+ } else {
+ fprintf(stderr, "ERROR: unexpected argument '%s'\n", arg);
+ return 1;
+ }
+ }
+
+ if (show_proxy) {
+ NPT_HttpProxyAddress proxy;
+ NPT_HttpProxySelector* selector = NPT_HttpProxySelector::GetDefault();
+ if (selector) {
+ NPT_Result result = selector->GetProxyForUrl(url, proxy);
+ if (NPT_FAILED(result) && result != NPT_ERROR_HTTP_NO_PROXY) {
+ fprintf(stderr, "ERROR: proxy selector error (%d:%s)\n", result, NPT_ResultText(result));
+ return 1;
+ }
+ }
+ if (proxy.GetHostName().IsEmpty()) {
+ printf("PROXY: none\n");
+ } else {
+ printf("PROXY: %s:%d\n", proxy.GetHostName().GetChars(), proxy.GetPort());
+ }
+ }
+
+#if defined(NPT_CONFIG_ENABLE_TLS)
+ // load a client cert if needed
+ if (tls_options || tls_cert_filename) {
+ tls_context = new NPT_TlsContext(NPT_TlsContext::OPTION_VERIFY_LATER | NPT_TlsContext::OPTION_ADD_DEFAULT_TRUST_ANCHORS);
+
+ if (tls_cert_filename) {
+ NPT_DataBuffer cert;
+ NPT_Result result = NPT_File::Load(tls_cert_filename, cert);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "ERROR: failed to load client cert from file %s (%d)\n", tls_cert_filename, result);
+ return 1;
+ }
+ result = tls_context->LoadKey(NPT_TLS_KEY_FORMAT_PKCS12, cert.GetData(), cert.GetDataSize(), tls_cert_password);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "ERROR: failed to parse client cert (%d)\n", result);
+ return 1;
+ }
+ }
+
+ connector = new NPT_HttpTlsConnector(*tls_context, tls_options);
+ }
+#endif
+
+ // get the document
+ NPT_HttpRequest request(url, NPT_HTTP_METHOD_GET);
+ NPT_HttpClient client;
+ NPT_HttpResponse* response;
+ if (http_1_1) {
+ request.SetProtocol(NPT_HTTP_PROTOCOL_1_1);
+ }
+ if (connector) {
+ client.SetConnector(connector);
+ }
+
+ NPT_TimeStamp before_request;
+ NPT_System::GetCurrentTimeStamp(before_request);
+
+ NPT_Result result = client.SendRequest(request, response);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "ERROR: SendRequest failed (%d:%s)\n", result, NPT_ResultText(result));
+ return 1;
+ }
+
+ NPT_TimeStamp before_body;
+ NPT_System::GetCurrentTimeStamp(before_body);
+
+ // show the request info
+ if (verbose) {
+ printf("#REQUEST: protocol=%s\n", request.GetProtocol().GetChars());
+
+ // show headers
+ NPT_HttpHeaders& headers = request.GetHeaders();
+ NPT_List<NPT_HttpHeader*>::Iterator header = headers.GetHeaders().GetFirstItem();
+ while (header) {
+ printf("%s: %s\n",
+ (const char*)(*header)->GetName(),
+ (const char*)(*header)->GetValue());
+ ++header;
+ }
+ }
+
+ // show response info
+ if (verbose) {
+ printf("\n#RESPONSE: protocol=%s, code=%d, reason=%s\n",
+ response->GetProtocol().GetChars(),
+ response->GetStatusCode(),
+ response->GetReasonPhrase().GetChars());
+
+ // show headers
+ NPT_HttpHeaders& headers = response->GetHeaders();
+ NPT_List<NPT_HttpHeader*>::Iterator header = headers.GetHeaders().GetFirstItem();
+ while (header) {
+ printf("%s: %s\n",
+ (const char*)(*header)->GetName(),
+ (const char*)(*header)->GetValue());
+ ++header;
+ }
+ }
+
+ // show entity
+ NPT_Size body_size = 0;
+ NPT_HttpEntity* entity = response->GetEntity();
+ if (entity != NULL) {
+ if (verbose) {
+ printf("\n#ENTITY: length=%lld, type=%s, encoding=%s\n",
+ entity->GetContentLength(),
+ entity->GetContentType().GetChars(),
+ entity->GetContentEncoding().GetChars());
+ }
+
+ if (verbose) {
+ NPT_InputStreamReference body_stream;
+ entity->GetInputStream(body_stream);
+ if (!body_stream.IsNull()) {
+ NPT_LargeSize size;
+ body_stream->GetSize(size);
+ printf("Loading body stream (declared: %lld bytes)\n", size);
+ }
+ }
+ NPT_DataBuffer body;
+ result =entity->Load(body);
+ if (NPT_FAILED(result)) {
+ fprintf(stderr, "ERROR: failed to load entity (%d)\n", result);
+ } else {
+ body_size = body.GetDataSize();
+ if (verbose) printf("\n#BODY: loaded %d bytes\n", (int)body_size);
+
+ // dump the body
+ if (!no_body_output) {
+ NPT_OutputStreamReference output;
+ NPT_File standard_out(NPT_FILE_STANDARD_OUTPUT);
+ standard_out.Open(NPT_FILE_OPEN_MODE_WRITE);
+ standard_out.GetOutputStream(output);
+ output->Write(body.GetData(), body.GetDataSize());
+ }
+ }
+ }
+
+ NPT_TimeStamp after_body;
+ NPT_System::GetCurrentTimeStamp(after_body);
+
+ if (verbose) {
+ unsigned int request_latency = (unsigned int)(before_body-before_request).ToMillis();
+ unsigned int body_load_time = (unsigned int)(after_body-before_body).ToMillis();
+ unsigned int total_load_time = (unsigned int)(after_body-before_request).ToMillis();
+ unsigned int body_throughput = 0;
+ if (body_size && body_load_time) {
+ body_throughput = (unsigned int)(((8.0 * (double)body_size)/1000.0)/((double)body_load_time/1000.0));
+ }
+ unsigned int total_throughput = 0;
+ if (body_size && total_load_time) {
+ total_throughput = (unsigned int)(((8.0 * (double)body_size)/1000.0)/((double)total_load_time/1000.0));
+ }
+
+ printf("\n-----------------------------------------------------------\n");
+ printf("TIMING:\n");
+ printf(" Request Latency = %d ms\n", request_latency);
+ printf(" Body Load Time = %d ms\n", body_load_time);
+ printf(" Total Load Time = %d ms\n", total_load_time);
+ printf(" Body Throughput = %d kbps\n", body_throughput);
+ printf(" Total Throughput = %d kbps\n", total_throughput);
+ }
+
+ delete response;
+ delete connector;
+#if defined(NPT_CONFIG_ENABLE_TLS)
+ delete tls_context;
+#endif
+
+ return 0;
+}
+
+
+
+