NetworkJob.h 1.9 KB

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