Job.h 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. * Copyright (c) 2020, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/FileStream.h>
  8. #include <AK/HashMap.h>
  9. #include <AK/Optional.h>
  10. #include <LibCore/NetworkJob.h>
  11. #include <LibCore/TCPSocket.h>
  12. #include <LibHTTP/HttpRequest.h>
  13. #include <LibHTTP/HttpResponse.h>
  14. namespace HTTP {
  15. class Job : public Core::NetworkJob {
  16. public:
  17. explicit Job(const HttpRequest&, OutputStream&);
  18. virtual ~Job() override;
  19. virtual void start() override = 0;
  20. virtual void shutdown() override = 0;
  21. HttpResponse* response() { return static_cast<HttpResponse*>(Core::NetworkJob::response()); }
  22. const HttpResponse* response() const { return static_cast<const HttpResponse*>(Core::NetworkJob::response()); }
  23. protected:
  24. void finish_up();
  25. void on_socket_connected();
  26. void flush_received_buffers();
  27. virtual void register_on_ready_to_read(Function<void()>) = 0;
  28. virtual void register_on_ready_to_write(Function<void()>) = 0;
  29. virtual bool can_read_line() const = 0;
  30. virtual String read_line(size_t) = 0;
  31. virtual bool can_read() const = 0;
  32. virtual ByteBuffer receive(size_t) = 0;
  33. virtual bool eof() const = 0;
  34. virtual bool write(ReadonlyBytes) = 0;
  35. virtual bool is_established() const = 0;
  36. virtual bool should_fail_on_empty_payload() const { return true; }
  37. virtual void read_while_data_available(Function<IterationDecision()> read) { read(); };
  38. virtual void timer_event(Core::TimerEvent&) override;
  39. enum class State {
  40. InStatus,
  41. InHeaders,
  42. InBody,
  43. Trailers,
  44. Finished,
  45. };
  46. HttpRequest m_request;
  47. State m_state { State::InStatus };
  48. int m_code { -1 };
  49. HashMap<String, String, CaseInsensitiveStringTraits> m_headers;
  50. Vector<ByteBuffer, 2> m_received_buffers;
  51. size_t m_buffered_size { 0 };
  52. size_t m_received_size { 0 };
  53. bool m_sent_data { 0 };
  54. Optional<ssize_t> m_current_chunk_remaining_size;
  55. Optional<size_t> m_current_chunk_total_size;
  56. bool m_can_stream_response { true };
  57. bool m_should_read_chunk_ending_line { false };
  58. bool m_has_scheduled_finish { false };
  59. };
  60. }