Repository: mesos Updated Branches: refs/heads/master 0bdd72ad7 -> b39e59183
Added HTTP Delete Method. Review: https://reviews.apache.org/r/36847 Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/b39e5918 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/b39e5918 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/b39e5918 Branch: refs/heads/master Commit: b39e591837b5c2afe0441783e2a082e11a30e2f9 Parents: 0bdd72a Author: Joerg Schad <[email protected]> Authored: Fri Aug 14 12:57:53 2015 +0200 Committer: Bernd Mathiske <[email protected]> Committed: Fri Aug 14 12:57:53 2015 +0200 ---------------------------------------------------------------------- 3rdparty/libprocess/include/process/http.hpp | 30 +++++++++++++++++++++++ 3rdparty/libprocess/src/http.cpp | 26 ++++++++++++++++++++ 3rdparty/libprocess/src/tests/http_tests.cpp | 28 +++++++++++++++++++++ 3 files changed, 84 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/b39e5918/3rdparty/libprocess/include/process/http.hpp ---------------------------------------------------------------------- diff --git a/3rdparty/libprocess/include/process/http.hpp b/3rdparty/libprocess/include/process/http.hpp index b829dad..fbd6cf7 100644 --- a/3rdparty/libprocess/include/process/http.hpp +++ b/3rdparty/libprocess/include/process/http.hpp @@ -710,6 +710,7 @@ std::ostream& operator<<(std::ostream& stream, const URL& url); // TODO(bmahler): Consolidate these functions into a single // http::request function that takes a 'Request' object. +// TODO(joerg84): Make names consistent (see Mesos-3256). // Asynchronously sends an HTTP GET request to the specified URL // and returns the HTTP response of type 'BODY' once the entire @@ -750,6 +751,35 @@ Future<Response> post( const Option<std::string>& contentType = None()); +/** + * Asynchronously sends an HTTP DELETE request to the process with the + * given UPID and returns the HTTP response. + * + * @param url The target url for the request. + * @param headers Optional header for the request. + * @return A future with the HTTP response. + */ +Future<Response> requestDelete( + const URL& url, + const Option<hashmap<std::string, std::string>>& headers = None()); + + +/** + * Asynchronously sends an HTTP DELETE request to the process with the + * given UPID and returns the HTTP response. + * + * @param upid The target process's assigned untyped PID. + * @param path The optional path to be be deleted. If not send the + request is send to the process directly. + * @param headers Optional headers for the request. + * @return A future with the HTTP response. + */ +Future<Response> requestDelete( + const UPID& upid, + const Option<std::string>& path = None(), + const Option<hashmap<std::string, std::string>>& headers = None()); + + namespace streaming { // Asynchronously sends an HTTP GET request to the specified URL http://git-wip-us.apache.org/repos/asf/mesos/blob/b39e5918/3rdparty/libprocess/src/http.cpp ---------------------------------------------------------------------- diff --git a/3rdparty/libprocess/src/http.cpp b/3rdparty/libprocess/src/http.cpp index b70e2fa..660950f 100644 --- a/3rdparty/libprocess/src/http.cpp +++ b/3rdparty/libprocess/src/http.cpp @@ -984,6 +984,32 @@ Future<Response> post( } +Future<Response> requestDelete( + const URL& url, + const Option<hashmap<string, string>>& headers) +{ + return internal::request(url, "DELETE", false, headers, None(), None()); +} + + +Future<Response> requestDelete( + const UPID& upid, + const Option<string>& path, + const Option<hashmap<string, string>>& headers) +{ + URL url("http", net::IP(upid.address.ip), upid.address.port, upid.id); + + if (path.isSome()) { + // TODO(joerg84): Handle 'query' and/or 'fragment' in 'path'. + // This could mean that we either remove these or even fail + // (see MESOS-3163). + url.path = strings::join("/", url.path, path.get()); + } + + return requestDelete(url, headers); +} + + namespace streaming { Future<Response> get( http://git-wip-us.apache.org/repos/asf/mesos/blob/b39e5918/3rdparty/libprocess/src/tests/http_tests.cpp ---------------------------------------------------------------------- diff --git a/3rdparty/libprocess/src/tests/http_tests.cpp b/3rdparty/libprocess/src/tests/http_tests.cpp index 7351fa4..92f914f 100644 --- a/3rdparty/libprocess/src/tests/http_tests.cpp +++ b/3rdparty/libprocess/src/tests/http_tests.cpp @@ -65,6 +65,7 @@ public: MOCK_METHOD1(pipe, Future<http::Response>(const http::Request&)); MOCK_METHOD1(get, Future<http::Response>(const http::Request&)); MOCK_METHOD1(post, Future<http::Response>(const http::Request&)); + MOCK_METHOD1(requestDelete, Future<http::Response>(const http::Request&)); void addRoute(const string& path, const HttpRequestHandler& handler) { @@ -79,6 +80,7 @@ protected: route("/pipe", None(), &HttpProcess::pipe); route("/get", None(), &HttpProcess::get); route("/post", None(), &HttpProcess::post); + route("/delete", None(), &HttpProcess::requestDelete); } Future<http::Response> auth(const http::Request& request) @@ -621,6 +623,32 @@ TEST(HTTPTest, Post) } +http::Response validateDelete(const http::Request& request) +{ + EXPECT_EQ("DELETE", request.method); + EXPECT_THAT(request.path, EndsWith("delete")); + EXPECT_TRUE(request.body.empty()); + EXPECT_TRUE(request.query.empty()); + + return http::OK(); +} + + +TEST(HTTPTest, Delete) +{ + Http http; + + EXPECT_CALL(*http.process, requestDelete(_)) + .WillOnce(Invoke(validateDelete)); + + Future<http::Response> future = + http::requestDelete(http.process->self(), "delete", None()); + + AWAIT_READY(future); + ASSERT_EQ(http::statuses[200], future.get().status); +} + + TEST(HTTPTest, QueryEncodeDecode) { // If we use Type<a, b> directly inside a macro without surrounding
