2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
19 * @file xmltooling/util/CurlURLInputStream.h
21 * Asynchronous use of curl to fetch data from a URL.
24 #if !defined(__xmltooling_curlinstr_h__) && !defined(XMLTOOLING_LITE)
25 #define __xmltooling_curlinstr_h__
27 #include <xmltooling/logging.h>
31 #include <curl/curl.h>
32 #include <xercesc/util/BinInputStream.hpp>
34 namespace xmltooling {
37 * Adapted from Xerces-C as a more advanced input stream implementation
38 * for subsequent use in parsing remote documents.
40 class XMLTOOL_API CurlURLInputStream : public xercesc::BinInputStream
46 * @param url the URL of the resource to fetch
48 CurlURLInputStream(const char* url);
53 * @param url the URL of the resource to fetch
55 CurlURLInputStream(const XMLCh* url);
58 * Constructor taking a DOM element supporting the following content:
62 * <dd>identifies the remote resource</dd>
64 * <dd>true iff name of host should be matched against TLS/SSL certificate</dd>
65 * <dt>TransportOption elements, like so:</dt>
66 * <dd><TransportOption provider="CURL" option="150">0</TransportOption></dd>
69 * @param e DOM to supply configuration
71 CurlURLInputStream(const xercesc::DOMElement* e);
73 ~CurlURLInputStream();
75 #ifdef XMLTOOLING_XERCESC_64BITSAFE
81 return fTotalBytesRead;
84 #ifdef XMLTOOLING_XERCESC_INPUTSTREAM_HAS_CONTENTTYPE
85 const XMLCh* getContentType() const {
90 xsecsize_t readBytes(XMLByte* const toFill, const xsecsize_t maxToRead);
93 CurlURLInputStream(const CurlURLInputStream&);
94 CurlURLInputStream& operator=(const CurlURLInputStream&);
96 // libcurl callbacks for data read/write
97 static size_t staticWriteCallback(char *buffer, size_t size, size_t nitems, void *outstream);
98 size_t writeCallback(char *buffer, size_t size, size_t nitems);
100 void init(const xercesc::DOMElement* e=NULL);
101 bool readMore(int *runningHandles);
103 logging::Category& fLog;
105 std::vector<std::string> fSavedOptions;
110 unsigned long fTotalBytesRead;
112 xsecsize_t fBytesRead;
113 xsecsize_t fBytesToRead;
116 // Overflow buffer for when curl writes more data to us
117 // than we've asked for.
118 XMLByte fBuffer[CURL_MAX_WRITE_SIZE];
119 XMLByte* fBufferHeadPtr;
120 XMLByte* fBufferTailPtr;
124 char fError[CURL_ERROR_SIZE];
128 #endif // __xmltooling_curlinstr_h__