Fix parsing of url

Fix kiwix/kiwix-tools#193
This commit is contained in:
Matthieu Gautier 2018-05-14 17:41:05 +02:00
parent 433a47c3fe
commit c0b1c6013e
3 changed files with 88 additions and 18 deletions

View File

@ -411,30 +411,26 @@ bool _parseUrl(const string& url, char* ns, string& title)
unsigned int urlLength = url.size(); unsigned int urlLength = url.size();
unsigned int offset = 0; unsigned int offset = 0;
/* Ignore the '/' */ /* Ignore the first '/' */
while ((offset < urlLength) && (url[offset] == '/')) { if (url[offset] == '/')
offset++; offset++;
}
if (url[offset] == '/' || offset >= urlLength)
return false;
/* Get namespace */ /* Get namespace */
while ((offset < urlLength) && (url[offset] != '/')) { *ns = url[offset++];
*ns = url[offset];
offset++; if (url[offset] != '/' || offset >= urlLength)
} return false;
/* Ignore the '/' */
while ((offset < urlLength) && (url[offset] == '/')) {
offset++; offset++;
}
if ( offset >= urlLength)
return false;
/* Get content title */ /* Get content title */
unsigned int titleOffset = offset; title = url.substr(offset, urlLength - offset);
while (offset < urlLength) {
offset++;
}
/* unescape title */
title = url.substr(titleOffset, offset - titleOffset);
return true; return true;
} }

View File

@ -1,6 +1,7 @@
tests = [ tests = [
'parseUrl'
] ]

73
test/parseUrl.cpp Normal file
View File

@ -0,0 +1,73 @@
/*
* Copyright (C) 2013 Tommi Maekitalo
*
* This program 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.
*
* This program is distributed in the hope that it will be useful, but
* is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
* NON-INFRINGEMENT. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#include "gtest/gtest.h"
#include <string>
namespace kiwix {
bool _parseUrl(const std::string& url, char* ns, std::string& title);
};
using namespace kiwix;
namespace
{
TEST(ParseUrlTest, invalid)
{
char ns;
std::string title;
ASSERT_FALSE(_parseUrl("", &ns, title));
ASSERT_FALSE(_parseUrl("A", &ns, title));
ASSERT_FALSE(_parseUrl("/", &ns, title));
ASSERT_FALSE(_parseUrl("//", &ns, title));
ASSERT_FALSE(_parseUrl("/A", &ns, title));
ASSERT_FALSE(_parseUrl("/A/", &ns, title));
ASSERT_FALSE(_parseUrl("/AB", &ns, title));
ASSERT_FALSE(_parseUrl("//A/title", &ns, title));
}
TEST(ParseUrlTest, valid)
{
char ns;
std::string title;
ASSERT_TRUE(_parseUrl("A/title", &ns, title));
ASSERT_EQ(ns, 'A');
ASSERT_EQ(title, "title");
ASSERT_TRUE(_parseUrl("/A/title", &ns, title));
ASSERT_EQ(ns, 'A');
ASSERT_EQ(title, "title");
ASSERT_TRUE(_parseUrl("A//title", &ns, title));
ASSERT_EQ(ns, 'A');
ASSERT_EQ(title, "/title");
ASSERT_TRUE(_parseUrl("/A//title", &ns, title));
ASSERT_EQ(ns, 'A');
ASSERT_EQ(title, "/title");
}
};
int main(int argc, char** argv)
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}