Client.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /*
  2. * Copyright (c) 2022, Florent Castelli <florent.castelli@gmail.com>
  3. * Copyright (c) 2022, Linus Groh <linusg@serenityos.org>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #pragma once
  8. #include <AK/NonnullOwnPtrVector.h>
  9. #include <LibCore/Object.h>
  10. #include <LibCore/Stream.h>
  11. #include <LibHTTP/Forward.h>
  12. #include <LibHTTP/HttpRequest.h>
  13. #include <WebDriver/HttpError.h>
  14. #include <WebDriver/Session.h>
  15. namespace WebDriver {
  16. class Client final : public Core::Object {
  17. C_OBJECT(Client);
  18. public:
  19. void start();
  20. void close_session(unsigned session_id);
  21. private:
  22. Client(NonnullOwnPtr<Core::Stream::BufferedTCPSocket>, Core::Object* parent);
  23. ErrorOr<JsonValue> read_body_as_json(HTTP::HttpRequest const&);
  24. ErrorOr<bool> handle_request(HTTP::HttpRequest const&, JsonValue const& body);
  25. ErrorOr<void> send_response(StringView content, HTTP::HttpRequest const&);
  26. ErrorOr<void> send_error_response(HttpError const& error, HTTP::HttpRequest const&);
  27. void die();
  28. void log_response(unsigned code, HTTP::HttpRequest const&);
  29. using RouteHandler = ErrorOr<JsonValue, HttpError> (Client::*)(Vector<StringView> const&, JsonValue const&);
  30. struct Route {
  31. HTTP::HttpRequest::Method method;
  32. Vector<String> path;
  33. RouteHandler handler;
  34. };
  35. struct RoutingResult {
  36. RouteHandler handler;
  37. Vector<StringView> parameters;
  38. };
  39. ErrorOr<RoutingResult, HttpError> match_route(HTTP::HttpRequest::Method method, String const& resource);
  40. ErrorOr<JsonValue, HttpError> handle_new_session(Vector<StringView> const&, JsonValue const& payload);
  41. ErrorOr<JsonValue, HttpError> handle_delete_session(Vector<StringView> const&, JsonValue const& payload);
  42. ErrorOr<JsonValue, HttpError> handle_get_status(Vector<StringView> const&, JsonValue const& payload);
  43. ErrorOr<JsonValue, HttpError> handle_get_timeouts(Vector<StringView> const&, JsonValue const& payload);
  44. ErrorOr<JsonValue, HttpError> handle_set_timeouts(Vector<StringView> const&, JsonValue const& payload);
  45. ErrorOr<JsonValue, HttpError> handle_navigate_to(Vector<StringView> const&, JsonValue const& payload);
  46. ErrorOr<JsonValue, HttpError> handle_get_current_url(Vector<StringView> const&, JsonValue const& payload);
  47. ErrorOr<JsonValue, HttpError> handle_back(Vector<StringView> const&, JsonValue const& payload);
  48. ErrorOr<JsonValue, HttpError> handle_forward(Vector<StringView> const&, JsonValue const& payload);
  49. ErrorOr<JsonValue, HttpError> handle_refresh(Vector<StringView> const&, JsonValue const& payload);
  50. ErrorOr<JsonValue, HttpError> handle_get_title(Vector<StringView> const&, JsonValue const& payload);
  51. ErrorOr<JsonValue, HttpError> handle_get_window_handle(Vector<StringView> const&, JsonValue const& payload);
  52. ErrorOr<JsonValue, HttpError> handle_close_window(Vector<StringView> const&, JsonValue const& payload);
  53. ErrorOr<JsonValue, HttpError> handle_find_element(Vector<StringView> const&, JsonValue const& payload);
  54. ErrorOr<JsonValue, HttpError> handle_find_elements(Vector<StringView> const&, JsonValue const& payload);
  55. ErrorOr<JsonValue, HttpError> handle_find_element_from_element(Vector<StringView> const&, JsonValue const& payload);
  56. ErrorOr<JsonValue, HttpError> handle_find_elements_from_element(Vector<StringView> const&, JsonValue const& payload);
  57. ErrorOr<JsonValue, HttpError> handle_get_element_attribute(Vector<StringView> const&, JsonValue const& payload);
  58. ErrorOr<JsonValue, HttpError> handle_get_all_cookies(Vector<StringView> const&, JsonValue const& payload);
  59. ErrorOr<JsonValue, HttpError> handle_get_named_cookie(Vector<StringView> const&, JsonValue const& payload);
  60. ErrorOr<JsonValue, HttpError> handle_add_cookie(Vector<StringView> const&, JsonValue const& payload);
  61. ErrorOr<JsonValue, HttpError> handle_delete_cookie(Vector<StringView> const&, JsonValue const& payload);
  62. ErrorOr<JsonValue, HttpError> handle_delete_all_cookies(Vector<StringView> const&, JsonValue const& payload);
  63. ErrorOr<Session*, HttpError> find_session_with_id(StringView session_id);
  64. JsonValue make_json_value(JsonValue const&);
  65. template<typename T>
  66. static ErrorOr<T, HttpError> unwrap_result(ErrorOr<T, Variant<HttpError, Error>> result)
  67. {
  68. if (result.is_error()) {
  69. Variant<HttpError, Error> error = result.release_error();
  70. if (error.has<HttpError>())
  71. return error.get<HttpError>();
  72. return HttpError { 500, "unsupported operation", error.get<Error>().string_literal() };
  73. }
  74. return result.release_value();
  75. }
  76. static ErrorOr<void, HttpError> unwrap_result(ErrorOr<void, Variant<HttpError, Error>> result)
  77. {
  78. if (result.is_error()) {
  79. Variant<HttpError, Error> error = result.release_error();
  80. if (error.has<HttpError>())
  81. return error.get<HttpError>();
  82. return HttpError { 500, "unsupported operation", error.get<Error>().string_literal() };
  83. }
  84. return {};
  85. }
  86. NonnullOwnPtr<Core::Stream::BufferedTCPSocket> m_socket;
  87. static Vector<Route> s_routes;
  88. String m_prefix = "/";
  89. static NonnullOwnPtrVector<Session> s_sessions;
  90. static Atomic<unsigned> s_next_session_id;
  91. };
  92. }