Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Значит, перед отправкой нужно сканировать весь файл на предмет того, не встретится ли в нём boundary, и, если встретилось, генерировать новое boundary и снова проверять? Или обычно проверяют задним числом, когда сервер уже получил обрезанный файл?
В то время, когда космические корабли бороздят Большой театр, когда выходят новые версии TLS с новыми протоколами шифрования и подписи, формы для отправки файлов собираются таким алхимическим способом???
Ну например хранить в каждой ноде глубину поддерева и идти от корня в самую мелкую сторону. Там ты найдёшь одну из кратчайших последовательностей, которых в файле нет.
Шифрование и подписи тоже держатся на вероятности... Да и тот же git.
Более того, вся электроника построена на вероятности. Метастабильность при передаче данных между разными частотными доменами убрать никак нельзя, можно только загнать вероятность в угол и делать вид, что всё заебись... И что один случай за миллиарды лет никто не заметит.
Я как-то имплементировал эдакий «Base250»: кодирование произвольных байтиков набором из 250 возможных значений. Сделал царское кодирование: декодер читает байты, пока не встретится FF; следующий за FF байт — «специальный»: три его нижних бита определяют индекс в массиве «запрещённых» байт, а пять верхних — расстояние до следующего специального байта. В декодированном потоке специальный байт заменяется на запрещённый, индекс которого указан в нижних битах специального. В результате в идеальном случае (в исходном потоке запрещённые байты находятся на расстоянии не более ≈30) мы получаем оверхед ровно в 1 байт!
Дык если ты можешь передавать расстояние, то у тебя стрим достаточно стабилен и не ему не нужны все эти специальные символы. Так что и тупые чанки по 255 байт с длиной в первом байте сойдут. И ёбли на порядок меньше 🙂
Да, так совпало, что он гарантированно получается разрешённым. Суть в том, что надо максимально компактно передать стрим бинарных данных через среду, в которой несколько байт к передаче запрещены (\x00, например).
Ну кстати прикольно получается. В стриме с рандомом один из 8 запрещённых символов будет выпадать с матожиданием как раз в 32 байта... А в непожатом будет дохуя нулей и всегда будет за что зацепиться.
Спасибо, очень элегантная штука. У меня ещё была проблема в очень сильной ограниченности размера — одно сообщение должно было умещаться в 150 символов, поэтому каждый байтик метаданных существенно увеличивал оверхед.
> шутка
> 150 символов
Ну вот смотри 150 символов по log2(250) бит это 1194 с лишним бита аля 149 байт (если округлить вниз). Куда плотнее то? И это на любых данных, тут не будет никаких ограничений на "нули не реже 30".
А если какой-нибудь флажок включается очень редко, то зачем мне тратить на false целый бит, если достаточно небольшой части бита (true при этом займёт несколько бит, но и хер с ним)?
> в нижних битах
> не более 30
Но ведь запрещённых символов 6, а не 8? Поэтому из 7.96 бит мы потратим 2.58 и у нас останется 5.38 бит чтобы записать расстояние от 0 до 40!
Для этого достаточно заюзать (dist * 6) + code вместо (dist << 3) | code. Ну и ремапнуть полученное число от 0 до 245 в разрешённые символы по табличке.
Вообще говоря нет, ты теряешь 1 байт на каждом разрыве цепочки, а это не так уж редко, как бы не 1/2 на каждом спецсимволе... Надо считать, в общем. Но лень.
«ЗЩЫЕ-запросы» бывают с «аппликация/х-шшш-форм-урленкодед» и с «мультипарт/форм-дата». Первый вариант браузеры собирают для <форм метод="пост">, когда не нужно передавать файлы (когда передаются только текстовые поля и галочки), второй вариант браузеры собирают, когда нужно передавать файлы (когда присутствует поле <инпут тупе="филе">).
Питушок, засунь своё goвно туда, откуда взял. Его изобрели питухи анскильные, не осилившие в кресты (а кресты в свою очередь, не осилившие сишку).
Так что, питух, пожалуйста, не надо.
Покажи лучше что ты реально сам сделал.
Есть какой-то «boost::http», но его дока в текстовом виде весит 250 килобайт и написана в лучших традициях крестового Стандарта. Короткие туториалы по нему не гуглятся (видимо, кроме создателей его так никто и не осилил), только красивые решения в таком духе:
class A{};
const A& operator, (const A& a, const char* s)
{
std::cout << s;
return a;
}
Забавные чудеса крестотипизации: cтоит проебать один const и оператор применяется только первый раз, но всё успешно конпелируется, ведь запятая работает со всеми типами, и я долго не мог понять в чем дело.
Тогда почему он вообще применяется, если я написал "A a", а не "const A a"?
> Как во время конпеляции выдать внятное сообщение об ошибке?
static_assert(false, "Konpelyaciya upadet na etoi stroke");
static_assert(sizeof(int) == 4); // С C++17 можно пропустить сообщение об ошибке
Для этого надо, чтобы сервер поддерживал POST-запросы большого размера (по-умолчанию большинство серверов поддерживают 2 GB). Адекватное решение — пересылать файл по частям через «JavaScript».
> POST-запросы большого размера
Вообще странно, что в том же PHP сначала сервак полностью закачивает файл и только потом скрипт получает управление и решает, что делать с этим файлом (или вообще выбрасывает нахуй, лол).
А я чего спросил, не повезло попасть на кровавый ъ-прайз, там коллега жаловался, что сервак работает именно вот так, как я выше написал. А они там гоняют достаточно толстые жисоны по несколько десятков мегабайт.
BEKTOPHblu_nETyX # 0
TEH3OPHblu_nemyx # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
bormand # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
bormand # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
В то время, когда космические корабли бороздят Большой театр, когда выходят новые версии TLS с новыми протоколами шифрования и подписи, формы для отправки файлов собираются таким алхимическим способом???
gost # 0 ⇈
guest # 0 ⇈
а как ее сгенерировать?
bormand # 0 ⇈
bormand # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
Например, содержимое файла ABC. Если мы возьмём в качестве границы ABCA, то получим: Встретив второй раз ABCA, парсер решит, что это конец. А если добавим любой другой символ, то облома не будет:
gost # 0 ⇈
bormand # 0 ⇈
Более того, вся электроника построена на вероятности. Метастабильность при передаче данных между разными частотными доменами убрать никак нельзя, можно только загнать вероятность в угол и делать вид, что всё заебись... И что один случай за миллиарды лет никто не заметит.
guest # 0 ⇈
Например банк развалится, если все разом заберут оттуда бабло.
Гугл ляжет, если все в мире в одну секунду решат что-то погуглить
bormand # 0 ⇈
guest # 0 ⇈
Какова вероятность что генератор случайных чисел сгенерирует Войну и Мир?
Desktop # 0 ⇈
guest # 0 ⇈
bormand # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
bormand # 0 ⇈
guest # 0 ⇈
gost # 0 ⇈
bormand # 0 ⇈
bormand # 0 ⇈
gost # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
gost # 0 ⇈
bormand # 0 ⇈
bormand # 0 ⇈
gost # 0 ⇈
bormand # 0 ⇈
https://en.wikipedia.org/wiki/Range_encoding
gost # 0 ⇈
bormand # 0 ⇈
bormand # 0 ⇈
> 150 символов
Ну вот смотри 150 символов по log2(250) бит это 1194 с лишним бита аля 149 байт (если округлить вниз). Куда плотнее то? И это на любых данных, тут не будет никаких ограничений на "нули не реже 30".
gost # 0 ⇈
bormand # 0 ⇈
Напротив, арифметическое кодирование сбрасывает оковы битоёбства!
Зачем, к примеру, тратить на число от 0 до 5 целых три бита, если достаточно 2.59?
bormand # 0 ⇈
Долой неделимость битов!
bormand # 0 ⇈
А если не округлять, то 149 байт и целых 2 бита, в которые ты сможешь положить что-то полезное!
bormand # 0 ⇈
Даже не 2, а 2.87!
bormand # 0 ⇈
bormand # 0 ⇈
bormand # 0 ⇈
> не более 30
Но ведь запрещённых символов 6, а не 8? Поэтому из 7.96 бит мы потратим 2.58 и у нас останется 5.38 бит чтобы записать расстояние от 0 до 40!
Для этого достаточно заюзать (dist * 6) + code вместо (dist << 3) | code. Ну и ремапнуть полученное число от 0 до 245 в разрешённые символы по табличке.
gost # 0 ⇈
bormand # 0 ⇈
Skarn # 0 ⇈
BOKCEJIbHblu_nemyx # 0 ⇈
Какой анскилл )))
BOKCEJIbHblu_nemyx # 0 ⇈
pike
щука, пика, копье, пик, наконечник, острие
guest # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
guest # 0
TEH3OPHblu_nemyx # 0 ⇈
gost # 0 ⇈
Какая обработка исключений )))
bormand # 0 ⇈
Bear -> bearer -> bearest.
gost # 0 ⇈
PEKYPCuBHblu__nemyx # 0 ⇈
guest # 0 ⇈
Поэтому я за «PHP».
3.14159265 # 0 ⇈
bormand # 0 ⇈
superhackkiller197 # 0 ⇈
Так что, питух, пожалуйста, не надо.
Покажи лучше что ты реально сам сделал.
guest # 0 ⇈
guest # 0 ⇈
3.14159265 # 0 ⇈
>restc_cpp
В кресты-бусты до сих пор не завезли удобных апи с быдлерами?
gost # 0 ⇈
Багор, как есть багор!
BEKTOPHblu_nETyX # 0 ⇈
gost # 0 ⇈
BEKTOPHblu_nETyX # 0 ⇈
Забавные чудеса крестотипизации: cтоит проебать один const и оператор применяется только первый раз, но всё успешно конпелируется, ведь запятая работает со всеми типами, и я долго не мог понять в чем дело.
Тогда почему он вообще применяется, если я написал "A a", а не "const A a"?
guest # 0 ⇈
guest # 0 ⇈
BEKTOPHblu_nETyX # 0 ⇈
bormand # 0 ⇈
Монадок захотелось?
BEKTOPHblu_nETyX # 0 ⇈
guest # 0 ⇈
BEKTOPHblu_nETyX # 0 ⇈
gost # 0 ⇈
static_assert(false, "Konpelyaciya upadet na etoi stroke");
static_assert(sizeof(int) == 4); // С C++17 можно пропустить сообщение об ошибке
bormand # 0 ⇈
Fluent интерфейс же.
3.14159265 # 0 ⇈
Зато низкоуровнево.
TEH3OPHblu_nemyx # 0 ⇈
3.14159265 # 0 ⇈
Очевидно что высокоопитумальный код http-клиента будет завязан на конкретную Царь-машину и совершенно непортируем куда-либо ещё.
PS. Да и в целом, http — для анскилябр заедушных, не по-царски это. В нём много перепитушни анскильной.
bormand # 0 ⇈
Сначала подумал, что речь о Curve25519.
guest # 0 ⇈
3.14159265 # 0 ⇈
bormand # 0 ⇈
Прямо в порты же.
DyKaJluC # 0 ⇈
RMS # 0 ⇈
DyKaJluC # 0 ⇈
guest # 0 ⇈
guest # 0 ⇈
guest # 0 ⇈
https://www.boost.org/doc/libs/1_66_0/libs/beast/example/http/client/sync/http_client_sync.cpp
guest # 0 ⇈
типа ты такой хотел скачать страничку, а получил козу?
TEH3OPHblu_nemyx # 0
https://curl.haxx.se/libcurl/c/multi-post.html
BEKTOPHblu_nETyX # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
gost # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
OCETuHCKuu_nemyx # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
TEH3OPHblu_nemyx # 0
gost # 0 ⇈
bormand # 0 ⇈
Вообще странно, что в том же PHP сначала сервак полностью закачивает файл и только потом скрипт получает управление и решает, что делать с этим файлом (или вообще выбрасывает нахуй, лол).
guest # 0 ⇈
bormand # 0 ⇈
3.14159265 # 0 ⇈
И клиент (java.net.URLConnection) и сервлеты (https://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html).
Spring только даёт обёртки: restClient (не слишком удобный) и инъекцию этих requestов в аннотированные методы.
Впрочем всё это и разные jersey умеют.
Desktop # 0 ⇈
bormand # 0 ⇈
bormand # 0 ⇈
Desktop # 0 ⇈
Уметь видимо умеют, отправляют ли надо смотреть в каждом конкретном случае
bormand # 0 ⇈
Desktop # 0 ⇈
bormand # 0 ⇈
Desktop # 0 ⇈
- Холмс, но зачем?!
bormand # 0 ⇈
Desktop # 0 ⇈
А я чего спросил, не повезло попасть на кровавый ъ-прайз, там коллега жаловался, что сервак работает именно вот так, как я выше написал. А они там гоняют достаточно толстые жисоны по несколько десятков мегабайт.
bormand # 0 ⇈
Desktop # 0 ⇈
bormand # 0 ⇈
Desktop # 0 ⇈
Ksyrx # 0