NetworkJob.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2022, the SerenityOS developers.
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #pragma once
  8. #include <AK/Function.h>
  9. #include <AK/Stream.h>
  10. #include <LibCore/EventReceiver.h>
  11. #include <LibCore/Forward.h>
  12. #include <LibHTTP/HeaderMap.h>
  13. namespace Core {
  14. class NetworkJob : public EventReceiver {
  15. C_OBJECT_ABSTRACT(NetworkJob)
  16. public:
  17. enum class Error {
  18. None,
  19. ConnectionFailed,
  20. TransmissionFailed,
  21. ProtocolFailed,
  22. Cancelled,
  23. };
  24. virtual ~NetworkJob() override;
  25. // Could fire twice, after Headers and after Trailers!
  26. Function<void(HTTP::HeaderMap const& response_headers, Optional<u32> response_code)> on_headers_received;
  27. Function<void(bool success)> on_finish;
  28. Function<void(Optional<u64>, u64)> on_progress;
  29. bool is_cancelled() const { return m_error == Error::Cancelled; }
  30. bool has_error() const { return m_error != Error::None; }
  31. Error error() const { return m_error; }
  32. NetworkResponse* response() { return m_response.ptr(); }
  33. NetworkResponse const* response() const { return m_response.ptr(); }
  34. enum class ShutdownMode {
  35. DetachFromSocket,
  36. CloseSocket,
  37. };
  38. virtual void start(Core::BufferedSocketBase&) = 0;
  39. virtual void shutdown(ShutdownMode) = 0;
  40. virtual void fail(Error error) { did_fail(error); }
  41. void cancel()
  42. {
  43. shutdown(ShutdownMode::DetachFromSocket);
  44. m_error = Error::Cancelled;
  45. }
  46. protected:
  47. NetworkJob(Stream&);
  48. void did_finish(NonnullRefPtr<NetworkResponse>&&);
  49. void did_fail(Error);
  50. void did_progress(Optional<u64> total_size, u64 downloaded);
  51. ErrorOr<size_t> do_write(ReadonlyBytes bytes) { return m_output_stream.write_some(bytes); }
  52. private:
  53. RefPtr<NetworkResponse> m_response;
  54. Stream& m_output_stream;
  55. Error m_error { Error::None };
  56. };
  57. char const* to_string(NetworkJob::Error);
  58. }
  59. template<>
  60. struct AK::Formatter<Core::NetworkJob> : Formatter<Core::EventReceiver> {
  61. };