Job.h 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /*
  2. * Copyright (c) 2020-2022, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Optional.h>
  8. #include <LibCore/NetworkJob.h>
  9. #include <LibCore/Socket.h>
  10. #include <LibGemini/GeminiRequest.h>
  11. #include <LibGemini/GeminiResponse.h>
  12. namespace Gemini {
  13. class Job : public Core::NetworkJob {
  14. C_OBJECT(Job);
  15. public:
  16. explicit Job(GeminiRequest const&, Stream&);
  17. virtual ~Job() override = default;
  18. virtual void start(Core::BufferedSocketBase&) override;
  19. virtual void shutdown(ShutdownMode) override;
  20. GeminiResponse* response() { return static_cast<GeminiResponse*>(Core::NetworkJob::response()); }
  21. GeminiResponse const* response() const { return static_cast<GeminiResponse const*>(Core::NetworkJob::response()); }
  22. const URL& url() const { return m_request.url(); }
  23. Core::Socket const* socket() const { return m_socket; }
  24. ErrorOr<size_t> response_length() const;
  25. protected:
  26. void finish_up();
  27. void on_socket_connected();
  28. void flush_received_buffers();
  29. void register_on_ready_to_read(Function<void()>);
  30. bool can_read_line() const;
  31. ErrorOr<String> read_line(size_t);
  32. bool can_read() const;
  33. ErrorOr<ByteBuffer> receive(size_t);
  34. bool write(ReadonlyBytes);
  35. enum class State {
  36. InStatus,
  37. InBody,
  38. Finished,
  39. Failed,
  40. };
  41. GeminiRequest m_request;
  42. State m_state { State::InStatus };
  43. int m_status { -1 };
  44. ByteString m_meta;
  45. Vector<ByteBuffer, 2> m_received_buffers;
  46. size_t m_received_size { 0 };
  47. size_t m_buffered_size { 0 };
  48. Core::BufferedSocketBase* m_socket { nullptr };
  49. };
  50. }