NetworkJob.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. namespace Core {
  13. class NetworkJob : public EventReceiver {
  14. C_OBJECT_ABSTRACT(NetworkJob)
  15. public:
  16. enum class Error {
  17. None,
  18. ConnectionFailed,
  19. TransmissionFailed,
  20. ProtocolFailed,
  21. Cancelled,
  22. };
  23. virtual ~NetworkJob() override = default;
  24. // Could fire twice, after Headers and after Trailers!
  25. Function<void(HashMap<ByteString, ByteString, CaseInsensitiveStringTraits> const& response_headers, Optional<u32> response_code)> on_headers_received;
  26. Function<void(bool success)> on_finish;
  27. Function<void(Optional<u64>, u64)> on_progress;
  28. bool is_cancelled() const { return m_error == Error::Cancelled; }
  29. bool has_error() const { return m_error != Error::None; }
  30. Error error() const { return m_error; }
  31. NetworkResponse* response() { return m_response.ptr(); }
  32. NetworkResponse const* response() const { return m_response.ptr(); }
  33. enum class ShutdownMode {
  34. DetachFromSocket,
  35. CloseSocket,
  36. };
  37. virtual void start(Core::BufferedSocketBase&) = 0;
  38. virtual void shutdown(ShutdownMode) = 0;
  39. virtual void fail(Error error) { did_fail(error); }
  40. void cancel()
  41. {
  42. shutdown(ShutdownMode::DetachFromSocket);
  43. m_error = Error::Cancelled;
  44. }
  45. protected:
  46. NetworkJob(Stream&);
  47. void did_finish(NonnullRefPtr<NetworkResponse>&&);
  48. void did_fail(Error);
  49. void did_progress(Optional<u64> total_size, u64 downloaded);
  50. ErrorOr<size_t> do_write(ReadonlyBytes bytes) { return m_output_stream.write_some(bytes); }
  51. private:
  52. RefPtr<NetworkResponse> m_response;
  53. Stream& m_output_stream;
  54. Error m_error { Error::None };
  55. };
  56. char const* to_string(NetworkJob::Error);
  57. }
  58. template<>
  59. struct AK::Formatter<Core::NetworkJob> : Formatter<Core::EventReceiver> {
  60. };