From bba4c3ffe4ccf572d3f73ad3fcf9c0d5fdb857fc Mon Sep 17 00:00:00 2001 From: Will Critchlow Date: Tue, 12 Nov 2019 09:13:10 +0000 Subject: [PATCH 1/6] Allow secondary First should be the specific user agent, and second should be the general user agent whose ruleset the crawler should obey iif there are no specific rules targeting the first user agent --- robots_main.cc | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/robots_main.cc b/robots_main.cc index 0e60f02..a708e19 100644 --- a/robots_main.cc +++ b/robots_main.cc @@ -34,6 +34,7 @@ // #include #include +#include #include "robots.h" @@ -86,13 +87,42 @@ int main(int argc, char** argv) { return 1; } - std::string user_agent = argv[2]; - std::vector user_agents(1, user_agent); + std::string input_useragents = argv[2]; + std::vector useragents; + std::string ua; + std::istringstream ss(input_useragents); + + // if we are given a comma-separated list of user agents, explode into a vector + while(std::getline(ss, ua, ',')) { + useragents.push_back(ua); + } googlebot::RobotsMatcher matcher; std::string url = argv[3]; - bool allowed = matcher.AllowedByRobots(robots_content, &user_agents, url); - std::cout << "user-agent '" << user_agent << "' with URI '" << argv[3] + // if we have multiple user agents, the first is the most specific + std::vector first_ua(1, useragents[0]); + + bool allowed = matcher.AllowedByRobots(robots_content, &first_ua, url); + bool with_specific = matcher.ever_seen_specific_agent(); + + // if we are given multiple user agents, only obey the specific one if there + // are specific rules targeting it + if (useragents.size() > 1) { + std::cout << "1. user-agent '" << first_ua[0] << "': " + << (allowed ? "ALLOWED " : "DISALLOWED ") + << (with_specific ? "with specific rule" : "without specific rule") + << std::endl; + + if (!with_specific) { + std::vector second_ua(1, useragents[1]); + allowed = matcher.AllowedByRobots(robots_content, &second_ua, url); + + std::cout << "2. user-agent '" << second_ua[0] << "': " + << (allowed ? "ALLOWED" : "DISALLOWED") << std::endl; + } + } + + std::cout << "user-agent '" << input_useragents << "' with URI '" << argv[3] << "': " << (allowed ? "ALLOWED" : "DISALLOWED") << std::endl; if (robots_content.empty()) { std::cout << "notice: robots file is empty so all user-agents are allowed" From 77c46a30c75794dae114790eebfdf13c0374ddf4 Mon Sep 17 00:00:00 2001 From: Will Critchlow Date: Tue, 12 Nov 2019 10:52:27 +0000 Subject: [PATCH 2/6] Move user agent tuple functionality to core Expose tuple functionality in the interface to robots and call from the wrapper if two user agents passed in the string comma-separated. Add test cases. --- robots.cc | 18 ++++++++++++++++++ robots.h | 9 +++++++++ robots_main.cc | 26 +++++++------------------- robots_test.cc | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 80 insertions(+), 19 deletions(-) diff --git a/robots.cc b/robots.cc index bdbccea..1d87493 100644 --- a/robots.cc +++ b/robots.cc @@ -495,6 +495,24 @@ bool RobotsMatcher::AllowedByRobots(absl::string_view robots_body, return !disallow(); } +bool RobotsMatcher::AllowedByRobotsTuple(absl::string_view robots_body, + const std::vector* user_agents, + const std::string& url) { + std::vector first_ua; + first_ua.push_back(user_agents->at(0)); + + bool allowed = AllowedByRobots(robots_body, &first_ua, url); + bool with_specific = ever_seen_specific_agent(); + + if (!with_specific) { + std::vector second_ua; + second_ua.push_back(user_agents->at(1)); + allowed = AllowedByRobots(robots_body, &second_ua, url); + } + + return allowed; +} + bool RobotsMatcher::OneAgentAllowedByRobots(absl::string_view robots_txt, const std::string& user_agent, const std::string& url) { diff --git a/robots.h b/robots.h index adccef5..baf6ca5 100644 --- a/robots.h +++ b/robots.h @@ -117,6 +117,15 @@ class RobotsMatcher : protected RobotsParseHandler { const std::vector* user_agents, const std::string& url); + // Returns true iff 'url' is allowed to be fetched by the first member + // of the "user_agents" vector according to a specific ruleset, or if there + // is no specific ruleset for that user agent, iff 'url' is allowed to be fetched + // by the second member under any ruleset. 'url' must be %-encoded according to + // RFC3986. + bool AllowedByRobotsTuple(absl::string_view robots_body, + const std::vector* user_agents, + const std::string& url); + // Do robots check for 'url' when there is only one user agent. 'url' must // be %-encoded according to RFC3986. bool OneAgentAllowedByRobots(absl::string_view robots_txt, diff --git a/robots_main.cc b/robots_main.cc index a708e19..e2609c4 100644 --- a/robots_main.cc +++ b/robots_main.cc @@ -99,27 +99,15 @@ int main(int argc, char** argv) { googlebot::RobotsMatcher matcher; std::string url = argv[3]; - // if we have multiple user agents, the first is the most specific - std::vector first_ua(1, useragents[0]); + bool allowed; - bool allowed = matcher.AllowedByRobots(robots_content, &first_ua, url); - bool with_specific = matcher.ever_seen_specific_agent(); + if (useragents.size() == 2){ + // if we have multiple user agents, the first is the most specific + std::vector ua_tuple = {useragents[0], useragents[1]}; - // if we are given multiple user agents, only obey the specific one if there - // are specific rules targeting it - if (useragents.size() > 1) { - std::cout << "1. user-agent '" << first_ua[0] << "': " - << (allowed ? "ALLOWED " : "DISALLOWED ") - << (with_specific ? "with specific rule" : "without specific rule") - << std::endl; - - if (!with_specific) { - std::vector second_ua(1, useragents[1]); - allowed = matcher.AllowedByRobots(robots_content, &second_ua, url); - - std::cout << "2. user-agent '" << second_ua[0] << "': " - << (allowed ? "ALLOWED" : "DISALLOWED") << std::endl; - } + allowed = matcher.AllowedByRobotsTuple(robots_content, &ua_tuple, url); + } else { + allowed = matcher.AllowedByRobots(robots_content, &useragents, url); } std::cout << "user-agent '" << input_useragents << "' with URI '" << argv[3] diff --git a/robots_test.cc b/robots_test.cc index 369efcd..9aa4f57 100644 --- a/robots_test.cc +++ b/robots_test.cc @@ -18,6 +18,7 @@ #include "robots.h" #include +#include #include "gtest/gtest.h" #include "absl/strings/str_cat.h" @@ -33,6 +34,12 @@ bool IsUserAgentAllowed(const absl::string_view robotstxt, return matcher.OneAgentAllowedByRobots(robotstxt, useragent, url); } +bool AllowedByRobotsTuple(const absl::string_view robotstxt, + const std::vector* useragent, const std::string& url) { + RobotsMatcher matcher; + return matcher.AllowedByRobotsTuple(robotstxt, useragent, url); +} + // Google-specific: system test. TEST(RobotsUnittest, GoogleOnly_SystemTest) { const absl::string_view robotstxt = @@ -123,6 +130,45 @@ TEST(RobotsUnittest, ID_LineSyntax_Groups) { EXPECT_FALSE(IsUserAgentAllowed(robotstxt, "BazBot", url_foo)); } +// Test based on the documentation at +// https://developers.google.com/search/reference/robots_txt#order-of-precedence-for-user-agents +// "Only one group is valid for a particular crawler" +// "The group followed is group 1. Only the most specific group is followed, all others are ignored" +TEST(RobotsUnittest, ID_Multiple_Useragents) { + const absl::string_view robotstxt = + "user-agent: googlebot-news\n" + "Disallow: /bar/\n" + "\n" + "user-agent: *\n" + "Disallow: /baz/\n" + "\n\n" + "user-agent: googlebot\n" + "Disallow: /foo/\n"; + + const std::string url_foo = "http://foo.bar/foo/"; + const std::string url_bar = "http://foo.bar/bar/"; + const std::string url_baz = "http://foo.bar/baz/"; + const std::string url_qux = "http://foo.bar/qux/"; + + std::vector ua_tuple; + ua_tuple.push_back("googlebot-news"); + ua_tuple.push_back("googlebot"); + + EXPECT_TRUE(AllowedByRobotsTuple(robotstxt, &ua_tuple, url_foo)); + EXPECT_FALSE(AllowedByRobotsTuple(robotstxt, &ua_tuple, url_bar)); + EXPECT_TRUE(AllowedByRobotsTuple(robotstxt, &ua_tuple, url_baz)); + EXPECT_TRUE(AllowedByRobotsTuple(robotstxt, &ua_tuple, url_qux)); + + std::vector ua_tuple_no_specific; + ua_tuple_no_specific.push_back("googlebot-image"); + ua_tuple_no_specific.push_back("googlebot"); + + EXPECT_FALSE(AllowedByRobotsTuple(robotstxt, &ua_tuple_no_specific, url_foo)); + EXPECT_TRUE(AllowedByRobotsTuple(robotstxt, &ua_tuple_no_specific, url_bar)); + EXPECT_TRUE(AllowedByRobotsTuple(robotstxt, &ua_tuple_no_specific, url_baz)); + EXPECT_TRUE(AllowedByRobotsTuple(robotstxt, &ua_tuple_no_specific, url_qux)); +} + // REP lines are case insensitive. See REP I-D section "Protocol Definition". // https://tools.ietf.org/html/draft-koster-rep#section-2.1 TEST(RobotsUnittest, ID_REPLineNamesCaseInsensitive) { From 2a35f6f8e459109af2b362af81b3b02e57d947d6 Mon Sep 17 00:00:00 2001 From: Will Critchlow Date: Tue, 12 Nov 2019 12:03:23 +0000 Subject: [PATCH 3/6] Update comments and documentation --- README.md | 17 ++++++++++++++++- robots_main.cc | 18 +++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6b8d052..354d3ed 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,8 @@ The library is released open-source to help developers build tools that better reflect Google's robots.txt parsing and matching. For webmasters, we included a small binary in the project that allows testing a -single URL and user-agent against a robots.txt. +single URL and user-agent against a robots.txt, or a pair of user-agents in a +hierarchy much as `googlebot-image` and other sub-Googlebots work. ## Building the library @@ -74,6 +75,20 @@ bazel-robots$ bazel run robots_main -- ~/local/path/to/robots.txt YourBot https: user-agent 'YourBot' with url 'https://example.com/url' allowed: YES ``` +##### Usage + +Basic usage (testing a URL with a single user-agent) takes an argument of the +user-agent: + +`bazel-robots$ bazel run robots_main -- ~/local/path/to/robots.txt YourBot https://example.com/url` + +To test against a sub-Googlebot such as `googlebot-image` which obeys **specific** +rulesets targeting that user-agent, or falls back to a second (`googlebot`) +user-agent if there are no **specific** rulesets targeting the main +user-agent, pass a comma-separated pair with the specific user-agent first: + +`bazel-robots$ bazel run robots_main -- ~/local/path/to/robots.txt googlebot-image,googlebot https://example.com/url` + #### Building with CMake [CMake](https://cmake.org) is the community-supported build system for the diff --git a/robots_main.cc b/robots_main.cc index e2609c4..362b63d 100644 --- a/robots_main.cc +++ b/robots_main.cc @@ -19,7 +19,7 @@ // Simple binary to assess whether a URL is accessible to a user-agent according // to records found in a local robots.txt file, based on Google's robots.txt // parsing and matching algorithms. -// Usage: +// Usage (single user-agent): // robots_main // Arguments: // local_path_to_robotstxt: local path to a file containing robots.txt records. @@ -32,6 +32,22 @@ // Returns: Prints a sentence with verdict about whether 'user_agent' is allowed // to access 'url' based on records in 'local_path_to_robotstxt'. // +// Usage (pair of user-agents): +// robots_main +// Arguments: +// local_path_to_robotstxt: local path to a file containing robots.txt records. +// For example: /home/users/username/robots.txt +// comma_separated_user_agent_pair: pair of user-agents (most specific first) +// For example: googlebot-image,googlebot +// url: a url to be matched against records in the robots.txt. The URL must be +// %-encoded according to RFC3986. +// For example: https://example.com/accessible/url.html +// Returns: Prints a sentence with verdict about whether the first user-agent +// is allowed or disallowed to access 'url' based on *specific* records +// targeting that user-agent in 'local_path_to_robotstxt'. If there are no +// specific rules targeting that user-agent, it falls back to the second +// user-agent. +// #include #include #include From 12c3de885f9bdc387278106ad8c4dd8a98be41b3 Mon Sep 17 00:00:00 2001 From: Will Critchlow Date: Tue, 12 Nov 2019 13:19:31 +0000 Subject: [PATCH 4/6] Fix cpplint errors --- robots.cc | 2 +- robots.h | 8 ++++---- robots_main.cc | 19 ++++++++++--------- robots_test.cc | 8 +++++--- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/robots.cc b/robots.cc index 1d87493..9176544 100644 --- a/robots.cc +++ b/robots.cc @@ -21,7 +21,7 @@ // with Google-specific optimizations detailed at // https://developers.google.com/search/reference/robots_txt -#include "robots.h" +#include "./robots.h" #include diff --git a/robots.h b/robots.h index baf6ca5..04bc5bc 100644 --- a/robots.h +++ b/robots.h @@ -118,10 +118,10 @@ class RobotsMatcher : protected RobotsParseHandler { const std::string& url); // Returns true iff 'url' is allowed to be fetched by the first member - // of the "user_agents" vector according to a specific ruleset, or if there - // is no specific ruleset for that user agent, iff 'url' is allowed to be fetched - // by the second member under any ruleset. 'url' must be %-encoded according to - // RFC3986. + // of the "user_agents" vector according to a specific ruleset, or if there + // is no specific ruleset for that user agent, iff 'url' is allowed to be + // fetched by the second member under any ruleset. 'url' must be %-encoded + // according to RFC3986. bool AllowedByRobotsTuple(absl::string_view robots_body, const std::vector* user_agents, const std::string& url); diff --git a/robots_main.cc b/robots_main.cc index 362b63d..7ab81f6 100644 --- a/robots_main.cc +++ b/robots_main.cc @@ -33,18 +33,18 @@ // to access 'url' based on records in 'local_path_to_robotstxt'. // // Usage (pair of user-agents): -// robots_main +// robots_main // Arguments: // local_path_to_robotstxt: local path to a file containing robots.txt records. // For example: /home/users/username/robots.txt -// comma_separated_user_agent_pair: pair of user-agents (most specific first) +// comma_sep_user_agent_pair: pair of user-agents (most specific first) // For example: googlebot-image,googlebot // url: a url to be matched against records in the robots.txt. The URL must be // %-encoded according to RFC3986. // For example: https://example.com/accessible/url.html // Returns: Prints a sentence with verdict about whether the first user-agent -// is allowed or disallowed to access 'url' based on *specific* records -// targeting that user-agent in 'local_path_to_robotstxt'. If there are no +// is allowed or disallowed to access 'url' based on *specific* records +// targeting that user-agent in 'local_path_to_robotstxt'. If there are no // specific rules targeting that user-agent, it falls back to the second // user-agent. // @@ -52,7 +52,7 @@ #include #include -#include "robots.h" +#include "./robots.h" bool LoadFile(const std::string& filename, std::string* result) { std::ifstream file(filename, std::ios::in | std::ios::binary | std::ios::ate); @@ -107,9 +107,10 @@ int main(int argc, char** argv) { std::vector useragents; std::string ua; std::istringstream ss(input_useragents); - - // if we are given a comma-separated list of user agents, explode into a vector - while(std::getline(ss, ua, ',')) { + + // if we are given a comma-separated list of user agents, explode into a + // vector + while (std::getline(ss, ua, ',')) { useragents.push_back(ua); } googlebot::RobotsMatcher matcher; @@ -117,7 +118,7 @@ int main(int argc, char** argv) { bool allowed; - if (useragents.size() == 2){ + if (useragents.size() == 2) { // if we have multiple user agents, the first is the most specific std::vector ua_tuple = {useragents[0], useragents[1]}; diff --git a/robots_test.cc b/robots_test.cc index 9aa4f57..46a68fc 100644 --- a/robots_test.cc +++ b/robots_test.cc @@ -15,7 +15,7 @@ // This file tests the robots.txt parsing and matching code found in robots.cc // against the current Robots Exclusion Protocol (REP) internet draft (I-D). // https://tools.ietf.org/html/draft-koster-rep -#include "robots.h" +#include "./robots.h" #include #include @@ -35,7 +35,8 @@ bool IsUserAgentAllowed(const absl::string_view robotstxt, } bool AllowedByRobotsTuple(const absl::string_view robotstxt, - const std::vector* useragent, const std::string& url) { + const std::vector* useragent, + const std::string& url) { RobotsMatcher matcher; return matcher.AllowedByRobotsTuple(robotstxt, useragent, url); } @@ -133,7 +134,8 @@ TEST(RobotsUnittest, ID_LineSyntax_Groups) { // Test based on the documentation at // https://developers.google.com/search/reference/robots_txt#order-of-precedence-for-user-agents // "Only one group is valid for a particular crawler" -// "The group followed is group 1. Only the most specific group is followed, all others are ignored" +// "The group followed is group 1. Only the most specific group is followed, +// all others are ignored" TEST(RobotsUnittest, ID_Multiple_Useragents) { const absl::string_view robotstxt = "user-agent: googlebot-news\n" From a8806c1e24dfdaddfdf886c4859a7e903a5fe9f1 Mon Sep 17 00:00:00 2001 From: Will Critchlow Date: Thu, 14 Nov 2019 13:42:05 +0000 Subject: [PATCH 5/6] Ignore bazel build directories One of the ways listed in the open source project for compiling and testing the project is using bazel - which creates directories that should be ignored by git as we never want to check them in --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 42fb7d4..63bddfc 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ c-build/* +bazel-* \ No newline at end of file From 244134667653d4b8265273fbf877b6b4fd7eb2c1 Mon Sep 17 00:00:00 2001 From: Will Critchlow Date: Thu, 14 Nov 2019 14:03:53 +0000 Subject: [PATCH 6/6] Add OS X compiled executable --- robots-OSX-x86_64 | Bin 0 -> 111460 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 robots-OSX-x86_64 diff --git a/robots-OSX-x86_64 b/robots-OSX-x86_64 new file mode 100755 index 0000000000000000000000000000000000000000..707e87bf82fb3047ca0315dd748a5bfbe883f42a GIT binary patch literal 111460 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 literal 0 HcmV?d00001