123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494 |
- // Licensed to the Apache Software Foundation (ASF) under one
- // or more contributor license agreements. See the NOTICE file
- // distributed with this work for additional information
- // regarding copyright ownership. The ASF licenses this file
- // to you under the Apache License, Version 2.0 (the
- // "License"); you may not use this file except in compliance
- // with the License. You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing,
- // software distributed under the License is distributed on an
- // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- // KIND, either express or implied. See the License for the
- // specific language governing permissions and limitations
- // under the License.
- #include <gtest/gtest.h>
- #include "brpc/uri.h"
- TEST(URITest, everything) {
- brpc::URI uri;
- std::string uri_str = " foobar://user:passwd@www.baidu.com:80/s?wd=uri#frag ";
- ASSERT_EQ(0, uri.SetHttpURL(uri_str));
- ASSERT_EQ("foobar", uri.scheme());
- ASSERT_EQ(80, uri.port());
- ASSERT_EQ("www.baidu.com", uri.host());
- ASSERT_EQ("/s", uri.path());
- ASSERT_EQ("user:passwd", uri.user_info());
- ASSERT_EQ("frag", uri.fragment());
- ASSERT_TRUE(uri.GetQuery("wd"));
- ASSERT_EQ(*uri.GetQuery("wd"), "uri");
- ASSERT_FALSE(uri.GetQuery("nonkey"));
- std::string scheme;
- std::string host_out;
- int port_out = -1;
- brpc::ParseURL(uri_str.c_str(), &scheme, &host_out, &port_out);
- ASSERT_EQ("foobar", scheme);
- ASSERT_EQ("www.baidu.com", host_out);
- ASSERT_EQ(80, port_out);
- }
- TEST(URITest, only_host) {
- brpc::URI uri;
- ASSERT_EQ(0, uri.SetHttpURL(" foo1://www.baidu1.com?wd=uri2&nonkey=22 "));
- ASSERT_EQ("foo1", uri.scheme());
- ASSERT_EQ(-1, uri.port());
- ASSERT_EQ("www.baidu1.com", uri.host());
- ASSERT_EQ("", uri.path());
- ASSERT_EQ("", uri.user_info());
- ASSERT_EQ("", uri.fragment());
- ASSERT_EQ(2u, uri.QueryCount());
- ASSERT_TRUE(uri.GetQuery("wd"));
- ASSERT_EQ(*uri.GetQuery("wd"), "uri2");
- ASSERT_TRUE(uri.GetQuery("nonkey"));
- ASSERT_EQ(*uri.GetQuery("nonkey"), "22");
- ASSERT_EQ(0, uri.SetHttpURL("foo2://www.baidu2.com:1234?wd=uri2&nonkey=22 "));
- ASSERT_EQ("foo2", uri.scheme());
- ASSERT_EQ(1234, uri.port());
- ASSERT_EQ("www.baidu2.com", uri.host());
- ASSERT_EQ("", uri.path());
- ASSERT_EQ("", uri.user_info());
- ASSERT_EQ("", uri.fragment());
- ASSERT_EQ(2u, uri.QueryCount());
- ASSERT_TRUE(uri.GetQuery("wd"));
- ASSERT_EQ(*uri.GetQuery("wd"), "uri2");
- ASSERT_TRUE(uri.GetQuery("nonkey"));
- ASSERT_EQ(*uri.GetQuery("nonkey"), "22");
- ASSERT_EQ(0, uri.SetHttpURL(" www.baidu3.com:4321 "));
- ASSERT_EQ("", uri.scheme());
- ASSERT_EQ(4321, uri.port());
- ASSERT_EQ("www.baidu3.com", uri.host());
- ASSERT_EQ("", uri.path());
- ASSERT_EQ("", uri.user_info());
- ASSERT_EQ("", uri.fragment());
- ASSERT_EQ(0u, uri.QueryCount());
-
- ASSERT_EQ(0, uri.SetHttpURL(" www.baidu4.com "));
- ASSERT_EQ("", uri.scheme());
- ASSERT_EQ(-1, uri.port());
- ASSERT_EQ("www.baidu4.com", uri.host());
- ASSERT_EQ("", uri.path());
- ASSERT_EQ("", uri.user_info());
- ASSERT_EQ("", uri.fragment());
- ASSERT_EQ(0u, uri.QueryCount());
- }
- TEST(URITest, no_scheme) {
- brpc::URI uri;
- ASSERT_EQ(0, uri.SetHttpURL(" user:passwd2@www.baidu1.com/s?wd=uri2&nonkey=22#frag "));
- ASSERT_EQ("", uri.scheme());
- ASSERT_EQ(-1, uri.port());
- ASSERT_EQ("www.baidu1.com", uri.host());
- ASSERT_EQ("/s", uri.path());
- ASSERT_EQ("user:passwd2", uri.user_info());
- ASSERT_EQ("frag", uri.fragment());
- ASSERT_TRUE(uri.GetQuery("wd"));
- ASSERT_EQ(*uri.GetQuery("wd"), "uri2");
- ASSERT_TRUE(uri.GetQuery("nonkey"));
- ASSERT_EQ(*uri.GetQuery("nonkey"), "22");
- }
- TEST(URITest, no_scheme_and_user_info) {
- brpc::URI uri;
- ASSERT_EQ(0, uri.SetHttpURL(" www.baidu2.com/s?wd=uri2&nonkey=22#frag "));
- ASSERT_EQ("", uri.scheme());
- ASSERT_EQ(-1, uri.port());
- ASSERT_EQ("www.baidu2.com", uri.host());
- ASSERT_EQ("/s", uri.path());
- ASSERT_EQ("", uri.user_info());
- ASSERT_EQ("frag", uri.fragment());
- ASSERT_TRUE(uri.GetQuery("wd"));
- ASSERT_EQ(*uri.GetQuery("wd"), "uri2");
- ASSERT_TRUE(uri.GetQuery("nonkey"));
- ASSERT_EQ(*uri.GetQuery("nonkey"), "22");
- }
- TEST(URITest, no_host) {
- brpc::URI uri;
- ASSERT_EQ(0, uri.SetHttpURL(" /sb?wd=uri3#frag2 ")) << uri.status();
- ASSERT_EQ("", uri.scheme());
- ASSERT_EQ(-1, uri.port());
- ASSERT_EQ("", uri.host());
- ASSERT_EQ("/sb", uri.path());
- ASSERT_EQ("", uri.user_info());
- ASSERT_EQ("frag2", uri.fragment());
- ASSERT_TRUE(uri.GetQuery("wd"));
- ASSERT_EQ(*uri.GetQuery("wd"), "uri3");
- ASSERT_FALSE(uri.GetQuery("nonkey"));
- // set_path should do as its name says.
- uri.set_path("/x/y/z/");
- ASSERT_EQ("", uri.scheme());
- ASSERT_EQ(-1, uri.port());
- ASSERT_EQ("", uri.host());
- ASSERT_EQ("/x/y/z/", uri.path());
- ASSERT_EQ("", uri.user_info());
- ASSERT_EQ("frag2", uri.fragment());
- ASSERT_TRUE(uri.GetQuery("wd"));
- ASSERT_EQ(*uri.GetQuery("wd"), "uri3");
- ASSERT_FALSE(uri.GetQuery("nonkey"));
- }
- TEST(URITest, consecutive_ampersand) {
- brpc::URI uri;
- uri._query = "&key1=value1&&key3=value3";
- ASSERT_TRUE(uri.GetQuery("key1"));
- ASSERT_TRUE(uri.GetQuery("key3"));
- ASSERT_FALSE(uri.GetQuery("key2"));
- ASSERT_EQ("value1", *uri.GetQuery("key1"));
- ASSERT_EQ("value3", *uri.GetQuery("key3"));
- }
- TEST(URITest, only_equality) {
- brpc::URI uri;
- uri._query = "key1=&&key2&&=&key3=value3";
- ASSERT_TRUE(uri.GetQuery("key1"));
- ASSERT_EQ("", *uri.GetQuery("key1"));
- ASSERT_TRUE(uri.GetQuery("key2"));
- ASSERT_EQ("", *uri.GetQuery("key2"));
- ASSERT_TRUE(uri.GetQuery("key3"));
- ASSERT_EQ("value3", *uri.GetQuery("key3"));
- }
- TEST(URITest, set_query) {
- brpc::URI uri;
- uri._query = "key1=&&key2&&=&key3=value3";
- ASSERT_TRUE(uri.GetQuery("key1"));
- ASSERT_TRUE(uri.GetQuery("key3"));
- ASSERT_EQ("value3", *uri.GetQuery("key3"));
- ASSERT_TRUE(uri.GetQuery("key2"));
- // overwrite value
- uri.SetQuery("key3", "value4");
- ASSERT_EQ("value4", *uri.GetQuery("key3"));
- uri.SetQuery("key2", "value2");
- ASSERT_TRUE(uri.GetQuery("key2"));
- ASSERT_EQ("value2", *uri.GetQuery("key2"));
- }
- TEST(URITest, set_h2_path) {
- brpc::URI uri;
- uri.SetH2Path("/dir?key1=&&key2&&=&key3=value3");
- ASSERT_EQ("/dir", uri.path());
- ASSERT_TRUE(uri.GetQuery("key1"));
- ASSERT_TRUE(uri.GetQuery("key2"));
- ASSERT_TRUE(uri.GetQuery("key3"));
- ASSERT_EQ("value3", *uri.GetQuery("key3"));
- uri.SetH2Path("dir?key1=&&key2&&=&key3=value3");
- ASSERT_EQ("dir", uri.path());
- ASSERT_TRUE(uri.GetQuery("key1"));
- ASSERT_TRUE(uri.GetQuery("key2"));
- ASSERT_TRUE(uri.GetQuery("key3"));
- ASSERT_EQ("value3", *uri.GetQuery("key3"));
- uri.SetH2Path("/dir?key1=&&key2&&=&key3=value3#frag1");
- ASSERT_EQ("/dir", uri.path());
- ASSERT_TRUE(uri.GetQuery("key1"));
- ASSERT_TRUE(uri.GetQuery("key2"));
- ASSERT_TRUE(uri.GetQuery("key3"));
- ASSERT_EQ("value3", *uri.GetQuery("key3"));
- ASSERT_EQ("frag1", uri.fragment());
- }
- TEST(URITest, generate_h2_path) {
- brpc::URI uri;
- const std::string ref1 = "/dir?key1=&&key2&&=&key3=value3";
- uri.SetH2Path(ref1);
- ASSERT_EQ("/dir", uri.path());
- ASSERT_EQ(3u, uri.QueryCount());
- ASSERT_TRUE(uri.GetQuery("key1"));
- ASSERT_TRUE(uri.GetQuery("key2"));
- ASSERT_TRUE(uri.GetQuery("key3"));
- ASSERT_EQ("value3", *uri.GetQuery("key3"));
- std::string path1;
- uri.GenerateH2Path(&path1);
- ASSERT_EQ(ref1, path1);
- uri.SetQuery("key3", "value3.3");
- ASSERT_EQ(3u, uri.QueryCount());
- ASSERT_EQ(1u, uri.RemoveQuery("key1"));
- ASSERT_EQ(2u, uri.QueryCount());
- ASSERT_EQ("key2&key3=value3.3", uri.query());
- uri.GenerateH2Path(&path1);
- ASSERT_EQ("/dir?key2&key3=value3.3", path1);
- const std::string ref2 = "/dir2?key1=&&key2&&=&key3=value3#frag2";
- uri.SetH2Path(ref2);
- ASSERT_EQ("/dir2", uri.path());
- ASSERT_TRUE(uri.GetQuery("key1"));
- ASSERT_TRUE(uri.GetQuery("key2"));
- ASSERT_TRUE(uri.GetQuery("key3"));
- ASSERT_EQ("value3", *uri.GetQuery("key3"));
- ASSERT_EQ("frag2", uri.fragment());
- std::string path2;
- uri.GenerateH2Path(&path2);
- ASSERT_EQ(ref2, path2);
- const std::string ref3 = "/dir3#frag3";
- uri.SetH2Path(ref3);
- ASSERT_EQ("/dir3", uri.path());
- ASSERT_EQ("frag3", uri.fragment());
- std::string path3;
- uri.GenerateH2Path(&path3);
- ASSERT_EQ(ref3, path3);
- const std::string ref4 = "/dir4";
- uri.SetH2Path(ref4);
- ASSERT_EQ("/dir4", uri.path());
- std::string path4;
- uri.GenerateH2Path(&path4);
- ASSERT_EQ(ref4, path4);
- }
- TEST(URITest, only_one_key) {
- brpc::URI uri;
- uri._query = "key1";
- ASSERT_TRUE(uri.GetQuery("key1"));
- ASSERT_EQ("", *uri.GetQuery("key1"));
- }
- TEST(URITest, empty_host) {
- brpc::URI uri;
- ASSERT_EQ(0, uri.SetHttpURL("http://"));
- ASSERT_EQ("", uri.host());
- ASSERT_EQ("", uri.path());
- }
- TEST(URITest, invalid_spaces) {
- brpc::URI uri;
- ASSERT_EQ(-1, uri.SetHttpURL("foo bar://user:passwd@www.baidu.com:80/s?wd=uri#frag"));
- ASSERT_STREQ("Invalid space in url", uri.status().error_cstr());
- ASSERT_EQ(-1, uri.SetHttpURL("foobar://us er:passwd@www.baidu.com:80/s?wd=uri#frag"));
- ASSERT_STREQ("Invalid space in url", uri.status().error_cstr());
- ASSERT_EQ(-1, uri.SetHttpURL("foobar://user:pass wd@www.baidu.com:80/s?wd=uri#frag"));
- ASSERT_STREQ("Invalid space in url", uri.status().error_cstr());
- ASSERT_EQ(-1, uri.SetHttpURL("foobar://user:passwd@www. baidu.com:80/s?wd=uri#frag"));
- ASSERT_STREQ("Invalid space in url", uri.status().error_cstr());
- ASSERT_EQ(-1, uri.SetHttpURL("foobar://user:passwd@www.baidu.com:80/ s?wd=uri#frag"));
- ASSERT_STREQ("Invalid space in path", uri.status().error_cstr());
- ASSERT_EQ(-1, uri.SetHttpURL("foobar://user:passwd@www.baidu.com:80/s ?wd=uri#frag"));
- ASSERT_STREQ("Invalid space in path", uri.status().error_cstr());
- ASSERT_EQ(-1, uri.SetHttpURL("foobar://user:passwd@www.baidu.com:80/s? wd=uri#frag"));
- ASSERT_STREQ("Invalid space in query", uri.status().error_cstr());
- ASSERT_EQ(-1, uri.SetHttpURL("foobar://user:passwd@www.baidu.com:80/s?w d=uri#frag"));
- ASSERT_STREQ("Invalid space in query", uri.status().error_cstr());
- ASSERT_EQ(-1, uri.SetHttpURL("foobar://user:passwd@www.baidu.com:80/s?wd=uri #frag"));
- ASSERT_STREQ("Invalid space in query", uri.status().error_cstr());
- ASSERT_EQ(-1, uri.SetHttpURL("foobar://user:passwd@www.baidu.com:80/s?wd=uri# frag"));
- ASSERT_STREQ("Invalid space in fragment", uri.status().error_cstr());
- ASSERT_EQ(-1, uri.SetHttpURL("foobar://user:passwd@www.baidu.com:80/s?wd=uri#fr ag"));
- ASSERT_STREQ("Invalid space in fragment", uri.status().error_cstr());
- }
- TEST(URITest, invalid_query) {
- brpc::URI uri;
- ASSERT_EQ(0, uri.SetHttpURL("http://a.b.c/?a-b-c:def"));
- ASSERT_EQ("a-b-c:def", uri.query());
- }
- TEST(URITest, print_url) {
- brpc::URI uri;
- const std::string url1 = "http://user:passwd@a.b.c/?d=c&a=b&e=f#frg1";
- ASSERT_EQ(0, uri.SetHttpURL(url1));
- std::ostringstream oss;
- uri.Print(oss);
- ASSERT_EQ("http://a.b.c/?d=c&a=b&e=f#frg1", oss.str());
- oss.str("");
- uri.PrintWithoutHost(oss);
- ASSERT_EQ("/?d=c&a=b&e=f#frg1", oss.str());
- const std::string url2 = "http://a.b.c/?d=c&a=b&e=f#frg1";
- ASSERT_EQ(0, uri.SetHttpURL(url2));
- oss.str("");
- uri.Print(oss);
- ASSERT_EQ(url2, oss.str());
- oss.str("");
- uri.PrintWithoutHost(oss);
- ASSERT_EQ("/?d=c&a=b&e=f#frg1", oss.str());
- uri.SetQuery("e", "f2");
- uri.SetQuery("f", "g");
- ASSERT_EQ((size_t)1, uri.RemoveQuery("a"));
- oss.str("");
- uri.Print(oss);
- ASSERT_EQ("http://a.b.c/?d=c&e=f2&f=g#frg1", oss.str());
- oss.str("");
- uri.PrintWithoutHost(oss);
- ASSERT_EQ("/?d=c&e=f2&f=g#frg1", oss.str());
- }
- TEST(URITest, copy_and_assign) {
- brpc::URI uri;
- const std::string url = "http://user:passwd@a.b.c/?d=c&a=b&e=f#frg1";
- ASSERT_EQ(0, uri.SetHttpURL(url));
- brpc::URI uri2 = uri;
- }
- TEST(URITest, query_remover_sanity) {
- std::string query = "key1=value1&key2=value2&key3=value3";
- brpc::QueryRemover qr(&query);
- ASSERT_TRUE(qr);
- ASSERT_EQ(qr.key(), "key1");
- ASSERT_EQ(qr.value(), "value1");
- ++qr;
- ASSERT_EQ(qr.key(), "key2");
- ASSERT_EQ(qr.value(), "value2");
- ++qr;
- ASSERT_EQ(qr.key(), "key3");
- ASSERT_EQ(qr.value(), "value3");
- ++qr;
- ASSERT_FALSE(qr);
- }
- TEST(URITest, query_remover_remove_current_key_and_value) {
- std::string query = "key1=value1&key2=value2&key3=value3";
- brpc::QueryRemover qr(&query);
- ASSERT_TRUE(qr);
- qr.remove_current_key_and_value();
- ASSERT_EQ(qr.modified_query(), "key2=value2&key3=value3");
- qr.remove_current_key_and_value(); /* expected to have not effect */
- qr.remove_current_key_and_value(); /* expected to have not effect */
- ++qr;
- ASSERT_TRUE(qr);
- qr.remove_current_key_and_value();
- ASSERT_EQ(qr.modified_query(), "key3=value3");
- ++qr;
- ASSERT_TRUE(qr);
- qr.remove_current_key_and_value();
- ASSERT_EQ(qr.modified_query(), "");
- ++qr;
- ASSERT_FALSE(qr);
- }
- TEST(URITest, query_remover_random_remove) {
- std::string query = "key1=value1&key2=value2&key3=value3&key4=value4"
- "&key5=value5&key6=value6";
- brpc::QueryRemover qr(&query);
- ASSERT_TRUE(qr);
- ++qr;
- ++qr;
- ASSERT_TRUE(qr);
- qr.remove_current_key_and_value();
- ++qr;
- ++qr;
- qr.remove_current_key_and_value();
- ASSERT_EQ(qr.modified_query(), "key1=value1&key2=value2&key4=value4&key6=value6");
- }
- TEST(URITest, query_remover_onekey_remove) {
- std::string query = "key1=value1&key2=value2&key3=value3&key4=value4"
- "&key5=value5&key6=value6";
- brpc::QueryRemover qr(&query);
- ASSERT_TRUE(qr);
- ++qr;
- ++qr;
- ++qr;
- qr.remove_current_key_and_value();
- ++qr;
- ++qr;
- ASSERT_TRUE(qr);
- ++qr;
- ASSERT_FALSE(qr);
- ++qr;
- ++qr;
- ASSERT_EQ(qr.modified_query(), "key1=value1&key2=value2&key3=value3&key5=value5&key6=value6");
- }
- TEST(URITest, query_remover_consecutive_ampersand) {
- std::string query = "key1=value1&&&key2=value2&key3=value3&&";
- brpc::QueryRemover qr(&query);
- ASSERT_TRUE(qr);
- qr.remove_current_key_and_value();
- ASSERT_EQ(qr.modified_query(), "key2=value2&key3=value3&&");
- ++qr;
- qr.remove_current_key_and_value();
- ASSERT_EQ(qr.modified_query(), "key3=value3&&");
- qr++;
- qr.remove_current_key_and_value();
- ASSERT_EQ(qr.modified_query(), "");
- ++qr;
- ASSERT_FALSE(qr);
- }
- TEST(URITest, query_remover_only_equality) {
- std::string query ="key1=&&key2&=&key3=value3";
- brpc::QueryRemover qr(&query);
- ASSERT_TRUE(qr);
- ASSERT_EQ(qr.key(), "key1");
- ASSERT_EQ(qr.value(), "");
- ++qr;
- ASSERT_EQ(qr.key(), "key2");
- ASSERT_EQ(qr.value(), "");
- ++qr;
- ASSERT_EQ(qr.key(), "");
- ASSERT_EQ(qr.value(), "");
- qr.remove_current_key_and_value();
- ++qr;
- ASSERT_EQ(qr.key(), "key3");
- ASSERT_EQ(qr.value(), "value3");
- ++qr;
- ASSERT_FALSE(qr);
- ASSERT_EQ(qr.modified_query(), "key1=&&key2&key3=value3");
- }
- TEST(URITest, query_remover_only_one_key) {
- std::string query = "key1";
- brpc::QueryRemover qr(&query);
- ASSERT_TRUE(qr);
- ASSERT_EQ(qr.key(), "key1");
- ASSERT_EQ(qr.value(), "");
- qr.remove_current_key_and_value();
- ++qr;
- ASSERT_FALSE(qr);
- ASSERT_EQ(qr.modified_query(), "");
- }
- TEST(URITest, query_remover_no_modify) {
- std::string query = "key1=value1&key2=value2&key3=value3";
- brpc::QueryRemover qr(&query);
- ASSERT_TRUE(qr);
- ASSERT_EQ(qr.key(), "key1");
- ASSERT_EQ(qr.value(), "value1");
- ++qr;
- ++qr;
- ++qr;
- ASSERT_FALSE(qr);
- ASSERT_EQ(qr.modified_query(), query);
- }
- TEST(URITest, query_remover_key_value_not_changed_after_modified_query) {
- std::string query = "key1=value1&key2=value2&key3=value3";
- brpc::QueryRemover qr(&query);
- ASSERT_TRUE(qr);
- ++qr;
- ASSERT_EQ(qr.key(), "key2");
- ASSERT_EQ(qr.value(), "value2");
- qr.remove_current_key_and_value();
- std::string new_query = qr.modified_query();
- ASSERT_EQ(new_query, "key1=value1&key3=value3");
- ASSERT_EQ(qr.key(), "key2");
- ASSERT_EQ(qr.value(), "value2");
- }
- TEST(URITest, valid_character) {
- brpc::URI uri;
- ASSERT_EQ(0, uri.SetHttpURL("www.baidu2.com':/?#[]@!$&()*+,;=-._~%"));
- }
|