Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Platform][Android][iOS] Upload file in background. #12074

Merged

Conversation

mesozoic-drones
Copy link
Contributor

@mesozoic-drones mesozoic-drones commented Nov 19, 2019

  • Реализация структуры HttpPayload, содержащей поля для отправки данных по HTTP.
  • Замена отдельных полей в классе HttpUpload на структуру HttpPayload, добавление геттеров для полей структуры.
  • Класс HttpBackgroundUploader с методом-заглушкой Upload() и полем HttpPayload. Метод Upload() должен быть реализован на платформах для отправки файла по HTTP по событию подключения wi-fi, в том числе из бэкграунда.

platform/platform.hpp Outdated Show resolved Hide resolved
@mesozoic-drones mesozoic-drones force-pushed the master-platform-add-dummy-uploadfile branch 2 times, most recently from 5018d31 to 92880eb Compare November 19, 2019 13:12
@mesozoic-drones mesozoic-drones changed the title [Platform] UploadFile() declaration without definition [Platform] UploadFile() method with dummy body. Nov 19, 2019
platform/platform.hpp Outdated Show resolved Hide resolved
Copy link
Contributor

@bykoianko bykoianko left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM after fixes.

@mesozoic-drones mesozoic-drones force-pushed the master-platform-add-dummy-uploadfile branch from 92880eb to b78b373 Compare November 19, 2019 13:23
platform/platform.hpp Outdated Show resolved Hide resolved
@milchakov
Copy link

milchakov commented Nov 19, 2019

Нельзя ли использовать интерфейс HttpUploader с измененной реализацией на платформах? Разделять реализации при помощи инстанцирования разных реализаций одного интерфейса, либо через какой-то спец флажок, переключающий режимы, либо через перегруженный конструктор.

@milchakov
Copy link

Сейчас у нас очень много похожих классов для решения задачи передачи данных HttpRequest, HttpClient, HttpThread. Не хотелось бы чтобы тоже самое получилось и с HttpUploader. Хотелось бы чтобы каким-то образом реализации (или хотя бы интерфейсы) были переиспользованы.

@mesozoic-drones mesozoic-drones force-pushed the master-platform-add-dummy-uploadfile branch from 67e535a to 82f95a8 Compare November 19, 2019 15:01
@mesozoic-drones
Copy link
Contributor Author

@bykoianko @alexzatsepin PTAL
Метод для бэкграундной отправки в классе HttpUploader, по результатам обсуждения с @milchakov и @beloal .

@bykoianko
Copy link
Contributor

Поясните п-та, в чем идея теперь. Как данный интерфейс позволяет выгружать файлы?

@mesozoic-drones
Copy link
Contributor Author

mesozoic-drones commented Nov 20, 2019

Поясните п-та, в чем идея теперь. Как данный интерфейс позволяет выгружать файлы?

На стороне ядра (например, из ArchivalReporter) создается экземпляр HttpUploader и для него через соответствующие сеттеры задаются url, путь к файлу и http-хедеры.

Затем вызывается метод UploadInBackground(). Он возвращает строковый id таска, который будет в бэграунде отправлять файл на стороне платформы. Отправка осуществляется при доступном вай-фае/по событию включения вай-фая.

Применительно к ArhcivalReporter: После отправки файла платформа вызывает статический метод класса ArchivalReporter, передает в него id таска. ArhcivalReporter поднимает соответсвие id - файл, и пробует удалить этот файл.

/// @TODO Add implementation.
/// \note Uses only |m_url|, |m_headers| and |m_filePath|.
/// \returns task id.
std::string UploadInBackground() const { return "dummyTaskId"; }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Обсудили голосом. Решили вынести метод по выгрузке файла в бэкграунде в отдельный интерфейс/класс. Кода под формированию данных для запроса (method,url, param, headers и т.д) вынести также в отдельный класс и включить его в текущий http_uploader и в новый созданный интерфейс для переиспользования.

@mesozoic-drones mesozoic-drones changed the title [Platform] UploadFile() method with dummy body. [Platform][Android][iOS] Upload file in background. Nov 20, 2019
@mesozoic-drones
Copy link
Contributor Author

@bykoianko @beloal @alexzatsepin PTAL

@mesozoic-drones
Copy link
Contributor Author

JTANDROID

@mesozoic-drones
Copy link
Contributor Author

JTIOS

platform/payload.hpp Outdated Show resolved Hide resolved
platform/payload.cpp Outdated Show resolved Hide resolved
Copy link
Contributor

@gmoryes gmoryes left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM after fix

platform/payload.hpp Outdated Show resolved Hide resolved
#include "platform/payload.hpp"
namespace platform
{
class HttpUploaderBackground
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

HttpUploaderBackground перименуй, пожалуйста, в HttpBackgroundUploader или FileBackgroundUploader или просто BackgroundUploader

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

HttpBackgroundUploader.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Спасибо.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Почему HttpBackgroundUploader лучше чем HttpUploaderBackground? я считаю, что предыдущий вариант был лучше. Лучше потому, что на мой взгляд так легче искать файлы и классы. легче искать потому что при сортировке они будут рядом и в случае поиска файла достаточно написать httpupload и будут предолжены оба варианта отправщиков

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я руководствовался только лишь грамматикой английского. Правильно с точки зрения английского background uploader - бэкграунд загрузчик/ или загрузчик работающий в бэкграунде. background в данном случае это прилагательное для uploader. Uploader background - это неверно грамматически. UploaderInBackground это еще норм.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ну при именовании мы зачастую пропускаем предлоги, которые не влияют на читабельность и семантику класса. Чтобы не удлинять лишний раз названия. Также как и не указываем артикли, иначе у нас получилось бы UploaderInTheBackground

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В общем, если удобнее вернуть, как было, я не буду возражать. Но мое мнение, грамматика в любых случаях должна быть правильной (если не пишем предлоги, формировать значит предложение надо без использования предлогов, как я и предложил). Но возникающие неудобства при работе с файлами, поиском, тоже понимаю, поэтому не возражаю к откатке к предыдущему названию.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Холиварить вместо работы про названия классов, переменных, функций, нэймспейсов можно бесконечно. Но не нужно. Переименовываю в изначальный вариант, тему закрываем.

platform/CMakeLists.txt Outdated Show resolved Hide resolved
platform/http_uploader.hpp Outdated Show resolved Hide resolved
platform/http_uploader.hpp Outdated Show resolved Hide resolved
platform/http_uploader_background.hpp Outdated Show resolved Hide resolved
@mesozoic-drones mesozoic-drones force-pushed the master-platform-add-dummy-uploadfile branch from eaec42a to 11bbef9 Compare November 20, 2019 14:58
@milchakov
Copy link

не лучше ли было бы если геттеры и сеттеры были бы у класса payload, а у классов отправителей было бы только по методу setpayload?

@mesozoic-drones
Copy link
Contributor Author

не лучше ли было бы если геттеры и сеттеры были бы у класса payload, а у классов отправителей было бы только по методу setpayload?

HttpPayload - это структура, для нее get/set вообще не нужен.
Договорились на сегодняшнем совещании, что сеттеры старого класса оставляем прежними.

@bykoianko
Copy link
Contributor

JTLINUX

@bykoianko
Copy link
Contributor

По мне по сути ок. Сейчас напишу мелки замечая.

@bykoianko
Copy link
Contributor

На Linux HttpUploader не реализован? Заглушка просто?

@mesozoic-drones
Copy link
Contributor Author

Я, видимо, по-другому понял то, до чего мы договорились. Сейчас геттеры и сеттеры дублируются в двух классах, так почему бы не перенести их в Payload?

Ну мы договорились сделать их в HttpUploader, чтобы не вносить изменения в bookmarks, user, cloud и относящиеся к ним iOS/jni связки. Цель PR - подготовить почву для логирования трэков и сделать это компромиссно-удобно для платформ.

Copy link
Contributor

@bykoianko bykoianko left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@mesozoic-drones
Copy link
Contributor Author

На Linux HttpUploader не реализован? Заглушка просто?

Да, кастомной реализации нет.

@mesozoic-drones mesozoic-drones force-pushed the master-platform-add-dummy-uploadfile branch from c352e75 to 0260b63 Compare November 21, 2019 10:18
@milchakov
Copy link

Я, видимо, по-другому понял то, до чего мы договорились. Сейчас геттеры и сеттеры дублируются в двух классах, так почему бы не перенести их в Payload?

Ну мы договорились сделать их в HttpUploader, чтобы не вносить изменения в bookmarks, user, cloud и относящиеся к ним iOS/jni связки. Цель PR - подготовить почву для логирования трэков и сделать это компромиссно-удобно для платформ.

Это косметические, мелкие изменения, в jni/ios изменения все равно пришлось внести. Вместо вызова сеттеров аплоадера были бы вызваны сеттеры структуры.
Сейчас получается схема: 1)вызывается сеттер аплоадера 2) сеттер аплоадера сетит поле структуры.
Почему бы не сократить до 1 действия?

@mesozoic-drones
Copy link
Contributor Author

Например, потому что мы договорились о том, что у HttpBackgroundUploader будет намеренно отсутствовать часть сеттеров:

  • Таким образом явно задается, какие поля конкретный аплоадер (бэкграундный аплоадер, обычный и тд) использует, а какие - нет.
  • Такая схема удобнее (прозрачнее) для пользователя аплоадера. Хотя, конечно, это приводит к дублированию нескольких методов. Но они тривиальные.
    @milchakov Если считаешь подход с сеттерами в Payload необходимым и блокирующим LGTM, давай сделаю.

@milchakov
Copy link

да, сделай, пожалуйста, сеттеры.
и еще посмотри, пожалуйста, на переписку тут #12074 (comment)

@mesozoic-drones mesozoic-drones force-pushed the master-platform-add-dummy-uploadfile branch from 0260b63 to c3cc8a9 Compare November 21, 2019 13:13
@mesozoic-drones
Copy link
Contributor Author

JTANDROID

1 similar comment
@mesozoic-drones
Copy link
Contributor Author

JTANDROID

@mesozoic-drones mesozoic-drones force-pushed the master-platform-add-dummy-uploadfile branch from 8e0cf09 to fa90d54 Compare November 21, 2019 13:33
@mesozoic-drones
Copy link
Contributor Author

JTALL

@mesozoic-drones
Copy link
Contributor Author


std::string m_method;
std::string m_url;
std::map<std::string, std::string> m_params;
Copy link

@milchakov milchakov Nov 21, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Опционально. Было бы здорово переименовать в multipartParams

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Они используются как обычные http-параметры, не только для мультипарт-аплоада.
Например
request.SetParam("locale", languages::GetCurrentOrig());

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

а, ну ок, просто после вчерашнего разговора у меня было ощущение, что они специфические.

Copy link

@milchakov milchakov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вроде бы обсуждали сеттеры у пэйлоада, тогда возможно было бы как-то в будущем развить тему с ним и добавить его еще в класс HttpClient... Но в целом я ок с таким решением.

@mesozoic-drones
Copy link
Contributor Author

А в чем сложность использовать поля структуры напрямую вместо вызовов set/get? На сложность рефакторинга HttpClient это не должно повлиять.

@milchakov
Copy link

А в чем сложность использовать поля структуры напрямую вместо вызовов set/get? На сложность рефакторинга HttpClient это не должно повлиять.

Например был метод SetParam, пользователь вызывал его с какими-то параметрами и ему не надо было знать как они там устроены, а теперь нужно знать тип поля, хранящие эти параметры и соответствующим образом добавлять. Или, если мы хотим помимо наших прокинутых хедеров выставляеть всегда еще какие-то, например хедер Accept-Encoding, то в методе SetHeaders мы всегда инсертим в контейнер хедеров, тем самым не затираем дефолтные хедеры, а если дать юзеру контейнер, то он может через оператор = добавить новые и затрет дефолтные. Ну, в общем, для целей инкапсуляции.


HttpUploader() = delete;
explicit HttpUploader(HttpPayload const & payload) : m_payload(payload) {}
HttpPayload GetPayload() const { return m_payload; }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

HttpPayload const &?

@milchakov
Copy link

на сложность рефакторинга это не повлияет, просто нужно будет добавить геттеры-сеттеры при рефакторинге

Copy link
Contributor

@bykoianko bykoianko left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM after fixes.

@mesozoic-drones mesozoic-drones force-pushed the master-platform-add-dummy-uploadfile branch from fa90d54 to e3ddc9f Compare November 22, 2019 07:21
@mesozoic-drones
Copy link
Contributor Author

JTALL

@beloal beloal merged commit a12b4b8 into mapsme:master Nov 22, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

6 participants