Job.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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(HttpRequest&&, OutputStream&);
  18. virtual ~Job() override;
  19. virtual void start(NonnullRefPtr<Core::Socket>) override = 0;
  20. virtual void shutdown(ShutdownMode) 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<String> m_set_cookie_headers;
  51. Vector<ByteBuffer, 2> m_received_buffers;
  52. size_t m_buffered_size { 0 };
  53. size_t m_received_size { 0 };
  54. bool m_sent_data { 0 };
  55. Optional<u32> m_content_length;
  56. Optional<ssize_t> m_current_chunk_remaining_size;
  57. Optional<size_t> m_current_chunk_total_size;
  58. bool m_can_stream_response { true };
  59. bool m_should_read_chunk_ending_line { false };
  60. bool m_has_scheduled_finish { false };
  61. };
  62. }