Что: 24cd89da8ad2d37061f2fd9867ed7e0472fc2900
Когда: 2021-07-19 22:12:34+03:00
Темы: go
go.stargrave.org/paster http://www.git.stargrave.org/?p=paster.git;a=blob;f=README Каждый новобранец на Go наверняка писал какой-нибудь URL-shortener или сервис типа Pastebin. Мой uploader (http://www.git.stargrave.org/?p=uploader.git;a=blob;f=README) почти годится для этого: нужно только HTTP сервером директорию отдавать наружу. Но как-то это всё недостаточно просто. СУБД? Нафиг -- достаточно ФС. Слушать демоном? Не вариант, только daemontools + UCSPI-TCP. Логирование -- аналогично через него. Отдавать paste-ы: внешним демоном (HTTP, Gopher, FTP, whatever). Хранить MIME тип: достаточно "в" расширении файла. И очищать старьё можно просто find-ом по ctime времени в cron. Хранить состояние счётчиков или время? Нафиг -- просто рандом для имени файла: и не перебрать/подобрать имя. HTTP? Тоже нафиг, слишком сложный протокол для такой задачи. Изначально хотел сделать на netstring: 5:hello,. Но потом захотелось чтобы была возможность указать расширение файла. Отправлять два netstring-а? Уже не красиво. Вспомнил про bencode -- один из самых прекрасных протоколов сериализации: супер простой, позволяет сложные структуры хранить, кодирование однообразное (типа ASN.1 DER/CER). Полноценный bencode декодер не использую, ибо даже лень искать есть ли потоковые: ведь мне нужно узнать размер загружаемого файла до того как я начну много читать по сети. Вот и реализовал это всё. Плюс ещё вывод половины SHA512 от загруженных данных (половины достаточно, а SHA256 тормознее на современных системах, считаю что нет ему места для использования, а с SHA вообще связываюсь потому что это же всё рассчитано для небольших файлов). Плюс добавление newline если в .txt/.url файлах его нет в конце (иначе это не настоящие текстовые файлы). А HTTP сервер уже увидев .webp расширение выдаст соответствующий Content-Type и это будет отображено в виде картинки. Отправить файл в paster можно банальным: ( printf "d1:v${size}:" ; cat data ; printf "e" ) | nc paster.example.com 2020 где самое геморройное это узнать длину передаваемого файла: 7cdceadae4be75a1cc450f380e01b667ef5ca7d5. Ну а полноценный скрипт: http://www.git.stargrave.org/?p=paster.git;a=blob;f=contrib/paster и его TLS-capable версия: http://www.git.stargrave.org/?p=paster.git;a=blob;f=contrib/paster-tls Это ещё и первый TLS-сервис что просто ради интереса я поднял уже с stunnel (+UCSPI-TCP): вполне себе работает. А то с этим IRC (недавно обсуждалось насколько он удобен :-) b34c369b5ce18f0c92dd56270201bca19ea8f262) надо же небольшие куски кода как-то share-ить. А ещё снимки экрана бывает: теперь это делается: import png:- | paster png (хотя тут не применялся pngcrush).
Сгенерирован: SGBlog 0.34.0