From 621be4257aba57a16f00d056f41161ddc4176c6a Mon Sep 17 00:00:00 2001 From: "Zane U. Ji" Date: Mon, 19 Nov 2018 00:34:22 +0800 Subject: [PATCH] Set the User-Agent HTTP header so we can download XML files from www.w3.org https://sourceforge.net/p/xml-copy-editor/discussion/475215/thread/223a81b85b/ Xerces-C has to be patched https://github.com/apache/xerces-c/pull/1 --- src/wrapxerces.cpp | 7 +++++ src/xercesnetaccessor.cpp | 62 +++++++++++++++++++++++++++++++++++++++ src/xercesnetaccessor.h | 42 ++++++++++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 src/xercesnetaccessor.cpp create mode 100644 src/xercesnetaccessor.h diff --git a/src/wrapxerces.cpp b/src/wrapxerces.cpp index bc6aa7d..b7a50d2 100644 --- a/src/wrapxerces.cpp +++ b/src/wrapxerces.cpp @@ -20,6 +20,7 @@ #include "wrapxerces.h" #include "pathresolver.h" +#include "xercesnetaccessor.h" #include #include @@ -46,10 +47,16 @@ void WrapXerces::Init ( bool enableNetAccess ) throw() Initializer () { XMLPlatformUtils::Initialize(); + mOriginalNetAccessor = XMLPlatformUtils::fgNetAccessor; + if ( mOriginalNetAccessor != NULL ) + { + mOriginalNetAccessor = new XercesNetAccessor ( mOriginalNetAccessor ); + } } ~Initializer() { + delete mOriginalNetAccessor; XMLPlatformUtils::Terminate(); } } dummy; diff --git a/src/xercesnetaccessor.cpp b/src/xercesnetaccessor.cpp new file mode 100644 index 0000000..f762d52 --- /dev/null +++ b/src/xercesnetaccessor.cpp @@ -0,0 +1,62 @@ +/* + * Copyright 2018 Zane U. Ji. + * + * This file is part of Xml Copy Editor. + * + * Xml Copy Editor is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * Xml Copy Editor is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Xml Copy Editor; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "xercesnetaccessor.h" +#include "xmlcopyeditorcopy.h" + +#include +#include +#include + +const static char USER_AGENT[] = "User-Agent:"; + +XercesNetAccessor::XercesNetAccessor ( XMLNetAccessor *netAccessor ) + : mNetAccessor ( netAccessor ) +{ +} + +const XMLCh *XercesNetAccessor::getId() const +{ + return mNetAccessor->getId(); +} + +BinInputStream *XercesNetAccessor::makeNew ( + const XMLURL &urlSrc, + const XMLNetHTTPInfo *httpInfo /* = 0 */ +) { + + XMLNetHTTPInfo info; + if ( httpInfo != NULL ) + { + info = *httpInfo; + } + std::string headers ( info.fHeaders, info.fHeadersLen ); + if ( headers.find ( USER_AGENT ) == std::string::npos ) + { + headers.append ( USER_AGENT ); + headers.append ( " xmlcopyeditor/" ); + headers.append ( wxString ( ABOUT_VERSION ).utf8_str() ); + headers.append ( "\r\n" ); + info.fHeaders = headers.c_str(); + info.fHeadersLen = headers.length(); + } + + return mNetAccessor->makeNew ( urlSrc, &info ); +} diff --git a/src/xercesnetaccessor.h b/src/xercesnetaccessor.h new file mode 100644 index 0000000..d45ac2f --- /dev/null +++ b/src/xercesnetaccessor.h @@ -0,0 +1,42 @@ +/* + * Copyright 2018 Zane U. Ji. + * + * This file is part of Xml Copy Editor. + * + * Xml Copy Editor is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * Xml Copy Editor is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Xml Copy Editor; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef XERCESNETACCESSOR_H_ +#define XERCESNETACCESSOR_H_ + +#include + +using namespace xercesc; + +class XercesNetAccessor : public XMLNetAccessor +{ +public: + XercesNetAccessor ( XMLNetAccessor *netAccesor ); + + virtual const XMLCh *getId() const; + + virtual BinInputStream *makeNew ( const XMLURL &urlSrc, + const XMLNetHTTPInfo *httpInfo = 0); + +protected: + XMLNetAccessor *mNetAccessor; +}; + +#endif /* XERCESNETACCESSOR_H_ */