1//
2// download.cpp
3//
4// This sample demonstrates the URIStreamOpener class.
5//
6// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
7// and Contributors.
8//
9// SPDX-License-Identifier: BSL-1.0
10//
11
12
13#include "Poco/URIStreamOpener.h"
14#include "Poco/StreamCopier.h"
15#include "Poco/Path.h"
16#include "Poco/URI.h"
17#include "Poco/SharedPtr.h"
18#include "Poco/Exception.h"
19#include "Poco/Net/HTTPStreamFactory.h"
20#include "Poco/Net/HTTPSStreamFactory.h"
21#include "Poco/Net/FTPStreamFactory.h"
22#include "Poco/Net/SSLManager.h"
23#include "Poco/Net/KeyConsoleHandler.h"
24#include "Poco/Net/ConsoleCertificateHandler.h"
25#include <memory>
26#include <iostream>
27
28
29using Poco::URIStreamOpener;
30using Poco::StreamCopier;
31using Poco::Path;
32using Poco::URI;
33using Poco::SharedPtr;
34using Poco::Exception;
35using Poco::Net::HTTPStreamFactory;
36using Poco::Net::HTTPSStreamFactory;
37using Poco::Net::FTPStreamFactory;
38using Poco::Net::SSLManager;
39using Poco::Net::Context;
40using Poco::Net::KeyConsoleHandler;
41using Poco::Net::PrivateKeyPassphraseHandler;
42using Poco::Net::InvalidCertificateHandler;
43using Poco::Net::ConsoleCertificateHandler;
44
45
46class SSLInitializer
47{
48public:
49 SSLInitializer()
50 {
51 Poco::Net::initializeSSL();
52 }
53
54 ~SSLInitializer()
55 {
56 Poco::Net::uninitializeSSL();
57 }
58};
59
60
61int main(int argc, char** argv)
62{
63 SSLInitializer sslInitializer;
64 HTTPStreamFactory::registerFactory();
65 HTTPSStreamFactory::registerFactory();
66 FTPStreamFactory::registerFactory();
67
68 if (argc != 2)
69 {
70 Path p(argv[0]);
71 std::cerr << "usage: " << p.getBaseName() << " <uri>" << std::endl;
72 std::cerr << " Download <uri> to standard output." << std::endl;
73 std::cerr << " Works with http, https, ftp and file URIs." << std::endl;
74 return 1;
75 }
76
77 // Note: we must create the passphrase handler prior Context
78 SharedPtr<InvalidCertificateHandler> ptrCert = new ConsoleCertificateHandler(false); // ask the user via console
79 Context::Ptr ptrContext = new Context(Context::CLIENT_USE, "", "", "rootcert.pem", Context::VERIFY_RELAXED, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
80 SSLManager::instance().initializeClient(0, ptrCert, ptrContext);
81
82 try
83 {
84 URI uri(argv[1]);
85 std::unique_ptr<std::istream> pStr(URIStreamOpener::defaultOpener().open(uri));
86 StreamCopier::copyStream(*pStr.get(), std::cout);
87 }
88 catch (Exception& exc)
89 {
90 std::cerr << exc.displayText() << std::endl;
91 return 1;
92 }
93
94 return 0;
95}
96