From 97ad053bffe0fe5d8862578bae4e7492592b5702 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 9 Feb 2006 03:09:36 +0000 Subject: [PATCH] more standard (although less RFC-conformant) treatment of file: URIs (patch 1415189) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37403 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/latex/wx/uri.tex | 6 ++++++ src/common/uri.cpp | 7 +++++++ tests/uris/uris.cpp | 22 ++++++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/docs/latex/wx/uri.tex b/docs/latex/wx/uri.tex index f0a63fca32..60f5e86994 100644 --- a/docs/latex/wx/uri.tex +++ b/docs/latex/wx/uri.tex @@ -75,6 +75,12 @@ if(myuri.HasScheme()) protocol = myuri.GetScheme(); \end{verbatim} +\membersection{Deviations from the RFC}\label{deviationsfromrfc} + +Note that on URIs with a "file" scheme wxURI does not +parse the userinfo, server, or port portion. This is to keep +compatability with wxFileSystem, the old wxURL, and older url specifications. + \membersection{wxURI::wxURI}\label{wxuriwxuri} \func{}{wxURI}{\void} diff --git a/src/common/uri.cpp b/src/common/uri.cpp index c195d13729..ccc0149a4b 100644 --- a/src/common/uri.cpp +++ b/src/common/uri.cpp @@ -432,11 +432,18 @@ const wxChar* wxURI::ParseAuthority(const wxChar* uri) // authority = [ userinfo "@" ] host [ ":" port ] if (*uri == wxT('/') && *(uri+1) == wxT('/')) { + //skip past the two slashes uri += 2; + // ############# DEVIATION FROM RFC ######################### + // Don't parse the server component for file URIs + if(m_scheme != wxT("file")) + { + //normal way uri = ParseUserInfo(uri); uri = ParseServer(uri); return ParsePort(uri); + } } return uri; diff --git a/tests/uris/uris.cpp b/tests/uris/uris.cpp index ec59baf1ed..1d05f04541 100644 --- a/tests/uris/uris.cpp +++ b/tests/uris/uris.cpp @@ -49,6 +49,7 @@ private: CPPUNIT_TEST( Assignment ); CPPUNIT_TEST( Comparison ); CPPUNIT_TEST( Unescaping ); + CPPUNIT_TEST( FileScheme ); #if TEST_URL CPPUNIT_TEST( URLCompat ); #if wxUSE_PROTOCOL_HTTP @@ -68,6 +69,7 @@ private: void Assignment(); void Comparison(); void Unescaping(); + void FileScheme(); #if TEST_URL void URLCompat(); @@ -299,6 +301,26 @@ void URITestCase::Unescaping() CPPUNIT_ASSERT(works2.IsSameAs(broken2)); } + +void URITestCase::FileScheme() +{ + //file:// variety (NOT CONFORMANT TO THE RFC) + CPPUNIT_ASSERT(wxURI(wxString(wxT("file://e:/wxcode/script1.xml"))).GetPath() + == wxT("e:/wxcode/script1.xml") ); + + //file:/// variety + CPPUNIT_ASSERT(wxURI(wxString(wxT("file:///e:/wxcode/script1.xml"))).GetPath() + == wxT("/e:/wxcode/script1.xml") ); + + //file:/ variety + CPPUNIT_ASSERT(wxURI(wxString(wxT("file:/e:/wxcode/script1.xml"))).GetPath() + == wxT("/e:/wxcode/script1.xml") ); + + //file: variety + CPPUNIT_ASSERT(wxURI(wxString(wxT("file:e:/wxcode/script1.xml"))).GetPath() + == wxT("e:/wxcode/script1.xml") ); +} + #if TEST_URL const wxChar* pszProblemUrls[] = { wxT("http://www.csdn.net"), -- 2.47.2