From 24ca04e7aa0d6c910956522fec1ecc75edffc648 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 7 Jun 2005 12:17:33 +0000 Subject: [PATCH] fix for fixing of escape sequences (patch 1213416) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@34567 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/uri.cpp | 59 +++++++++++++++++++++++++++++++++++++-------- tests/uris/uris.cpp | 26 +++++++++++++++++++- 2 files changed, 74 insertions(+), 11 deletions(-) diff --git a/src/common/uri.cpp b/src/common/uri.cpp index 7fdac5d033..5c5a643ba1 100644 --- a/src/common/uri.cpp +++ b/src/common/uri.cpp @@ -150,10 +150,7 @@ bool wxURI::IsEscape(const wxChar*& uri) { // pct-encoded = "%" HEXDIG HEXDIG if(*uri == wxT('%') && IsHex(*(uri+1)) && IsHex(*(uri+2))) - { - uri += 3; return true; - } else return false; } @@ -460,9 +457,15 @@ const wxChar* wxURI::ParseUserInfo(const wxChar* uri) // userinfo = *( unreserved / pct-encoded / sub-delims / ":" ) while(*uri && *uri != wxT('@') && *uri != wxT('/') && *uri != wxT('#') && *uri != wxT('?')) { - if(IsUnreserved(*uri) || IsEscape(uri) || + if(IsUnreserved(*uri) || IsSubDelim(*uri) || *uri == wxT(':')) m_userinfo += *uri++; + else if (IsEscape(uri)) + { + m_userinfo += *uri++; + m_userinfo += *uri++; + m_userinfo += *uri++; + } else Escape(m_userinfo, *uri++); } @@ -540,8 +543,14 @@ const wxChar* wxURI::ParseServer(const wxChar* uri) // reg-name = *( unreserved / pct-encoded / sub-delims ) while(*uri && *uri != wxT('/') && *uri != wxT(':') && *uri != wxT('#') && *uri != wxT('?')) { - if(IsUnreserved(*uri) || IsEscape(uri) || IsSubDelim(*uri)) + if(IsUnreserved(*uri) || IsSubDelim(*uri)) + m_server += *uri++; + else if (IsEscape(uri)) + { m_server += *uri++; + m_server += *uri++; + m_server += *uri++; + } else Escape(m_server, *uri++); } @@ -610,9 +619,15 @@ const wxChar* wxURI::ParsePath(const wxChar* uri, bool bReference, bool bNormali while(*uri && *uri != wxT('#') && *uri != wxT('?')) { - if( IsUnreserved(*uri) || IsSubDelim(*uri) || IsEscape(uri) || + if( IsUnreserved(*uri) || IsSubDelim(*uri) || *uri == wxT(':') || *uri == wxT('@') || *uri == wxT('/')) m_path += *uri++; + else if (IsEscape(uri)) + { + m_path += *uri++; + m_path += *uri++; + m_path += *uri++; + } else Escape(m_path, *uri++); } @@ -636,9 +651,15 @@ const wxChar* wxURI::ParsePath(const wxChar* uri, bool bReference, bool bNormali //no colon allowed while(*uri && *uri != wxT('#') && *uri != wxT('?')) { - if(IsUnreserved(*uri) || IsSubDelim(*uri) || IsEscape(uri) || + if(IsUnreserved(*uri) || IsSubDelim(*uri) || *uri == wxT('@') || *uri == wxT('/')) m_path += *uri++; + else if (IsEscape(uri)) + { + m_path += *uri++; + m_path += *uri++; + m_path += *uri++; + } else Escape(m_path, *uri++); } @@ -647,9 +668,15 @@ const wxChar* wxURI::ParsePath(const wxChar* uri, bool bReference, bool bNormali { while(*uri && *uri != wxT('#') && *uri != wxT('?')) { - if(IsUnreserved(*uri) || IsSubDelim(*uri) || IsEscape(uri) || + if(IsUnreserved(*uri) || IsSubDelim(*uri) || *uri == wxT(':') || *uri == wxT('@') || *uri == wxT('/')) m_path += *uri++; + else if (IsEscape(uri)) + { + m_path += *uri++; + m_path += *uri++; + m_path += *uri++; + } else Escape(m_path, *uri++); } @@ -686,9 +713,15 @@ const wxChar* wxURI::ParseQuery(const wxChar* uri) ++uri; while(*uri && *uri != wxT('#')) { - if (IsUnreserved(*uri) || IsSubDelim(*uri) || IsEscape(uri) || + if (IsUnreserved(*uri) || IsSubDelim(*uri) || *uri == wxT(':') || *uri == wxT('@') || *uri == wxT('/') || *uri == wxT('?')) m_query += *uri++; + else if (IsEscape(uri)) + { + m_query += *uri++; + m_query += *uri++; + m_query += *uri++; + } else Escape(m_query, *uri++); } @@ -711,9 +744,15 @@ const wxChar* wxURI::ParseFragment(const wxChar* uri) ++uri; while(*uri) { - if (IsUnreserved(*uri) || IsSubDelim(*uri) || IsEscape(uri) || + if (IsUnreserved(*uri) || IsSubDelim(*uri) || *uri == wxT(':') || *uri == wxT('@') || *uri == wxT('/') || *uri == wxT('?')) m_fragment += *uri++; + else if (IsEscape(uri)) + { + m_fragment += *uri++; + m_fragment += *uri++; + m_fragment += *uri++; + } else Escape(m_fragment, *uri++); } diff --git a/tests/uris/uris.cpp b/tests/uris/uris.cpp index 959c3e2928..4067550da7 100644 --- a/tests/uris/uris.cpp +++ b/tests/uris/uris.cpp @@ -48,6 +48,7 @@ private: CPPUNIT_TEST( BackwardsResolving ); CPPUNIT_TEST( Assignment ); CPPUNIT_TEST( Comparison ); + CPPUNIT_TEST( Unescaping ); #if TEST_URL CPPUNIT_TEST( URLCompat ); #if wxUSE_PROTOCOL_HTTP @@ -66,6 +67,7 @@ private: void BackwardsResolving(); void Assignment(); void Comparison(); + void Unescaping(); #if TEST_URL void URLCompat(); @@ -278,9 +280,30 @@ void URITestCase::Comparison() CPPUNIT_ASSERT(wxURI(wxT("http://mysite.com")) == wxURI(wxT("http://mysite.com"))); } +void URITestCase::Unescaping() +{ + wxString orig = wxT("http://test.com/of/file%3A%2F%2FC%3A%5Curi%5C") + wxT("escaping%5Cthat%5Cseems%5Cbroken%5Csadly%5B1%5D.rss"); + + wxString works= wxURI(orig).BuildUnescapedURI(); + + CPPUNIT_ASSERT(orig.IsSameAs(works) == false); + + wxString orig2 = wxT("http://test.com/of/file%3A%2F%") + wxT("2FC%3A%5Curi%5Cescaping%5Cthat%5Cseems%") + wxT("5Cbroken%5Csadly%5B1%5D.rss"); + + wxString works2 = wxURI::Unescape(orig2); + wxString broken2 = wxURI(orig2).BuildUnescapedURI(); + + CPPUNIT_ASSERT(works2.IsSameAs(broken2)); + +} + #if TEST_URL #include "wx/url.h" +#include "wx/file.h" void URITestCase::URLCompat() { @@ -327,5 +350,6 @@ void URITestCase::URLProxy() url.SetProxy(wxT("pserv:3122")); } #endif // wxUSE_PROTOCOL_HTTP -#endif + +#endif // TEST_URL -- 2.47.2