попробуйте открыть файл, прочитать его лениво и послать через Scotty.raw. теоретически файловая система не удалит содержимое, пока файл открыт
dstFile <- liftIO $ BL.readFile dstFilePath S.raw dstFile Да, так работает, спасибо.
тут, правда, открывается проблема slow loris, но это совсем другая история
На данном этапе для меня это не важно😊
raw :: MonadIO m => BL.ByteString -> ActionT m () raw = modifyResponse . setContent . ContentBuilder . fromLazyByteString file :: MonadIO m => FilePath -> ActionT m () file = modifyResponse . setContent . ContentFile Как по этим сигнатурам понять что в одном случае запоминается имя файла, а само чтение происходит позже, а в другом случае файл читается "сразу"?
ленивая строка — это про сути поток данных, связанный с каким-то ресурсом. а по сигнатуре FilePath ничего не поймёшь, надо в код смотреть. конкретно в этот код я заглядывал, чтения не вижу. дальше не смотрел, предполагаю, чтение после пользовательского хэндла идёт
по-хорошему это должно быть написано в документации. надо им баг отправить
Напиши ради упражнения через S.stream, это железобетонный вариант
ну там по сути дело только в открытом файле, ленивая байстрока не отличается
Не, там будет правильно вложенный скоуп
ты процедуру передаёшь дальше, а файл удаляешь до чтения. что в этом правильного?
параметр S.stream
я пока не понял, чем это лучше ленивой строки
S.stream $ \send flush -> do mapM_ (send . BB.fromByteString) (BL.toChunks dstFileContent) flush Я написал, но тоже не понимаю чем это лучше.
В таком виде это действительно ничем не лучше. Потому что главный вопрос побега из-под брэкета не адресован
Обсуждают сегодня