[О блоге] [наверх] [пред] [2021-07-19 22:12:34+03:00] [24cd89da8ad2d37061f2fd9867ed7e0472fc2900]
Темы: [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).

    [оставить комментарий]