Эта версия включает следующие обновления пакетов:
rocket
0.5.1
rocket_db_pools
0.2.0
rocket_dyn_templates
0.2.0
rocket_ws
0.1.1
rocket
0.5.1
Следующие типы char
и std::ops::Range
теперь реализуют FromForm
:
char
Range<T: FromForm>
с полями start
и end
RangeFrom<T: FromForm>
с полем start
RangeTo<T: FromForm>
с полем end
RangeToInclusive<T: FromForm>
с полем end
[T; N]
, Vec<T>
и [u8]
теперь могут передаваться в uri!
.
Гайд теперь включает раздел развертывание.
Реализация FromForm
теперь правильно записывает ошибки, связанные с целыми формами.
Реализация FromForm
может использоваться в коде, выданном макросами macro_rules!
.
(фикс #2668 через 52de9a) TempFile
теперь гарантирует его очистку перед сохранением.
rocket_db_pools
0.2.0
Расширения SQLite теперь поддерживаются в sqlx_sqlite
.
Используйте опцию конфигурации базы данных extensions
для указания расширений:
[default.databases.db_name]
url = "db.sqlite"
# Эта опция поддерживается только драйвером `sqlx_sqlite`.
extensions = ["memvfs", "rot13"]
(разрыв) deadpool
был обновлен до 0.13
.
(разрыв) Структура Config
имеет новое поле extensions
.
rocket_dyn_templates
0.2.0
Поддержка шаблонов minijinja
2.0
была введена.
Шаблоны с расширением .j2
признаются и отображаются с помощью Minijinja. * (разрыв) handlebars
был обновлен до 5.1
.
rocket_ws
0.1.1
Введен метод [WebSocket::accept_key()
].
tungstenite
был обновлен до 0.21
.
rust-version
для всех пакетов был обновлен до 1.64
.
Это отражает правильный MSRV, необходимый для сборки rocket
0.5.0
.
Файлы лицензий теперь присутствуют во всех опубликованных пакетах.
async
/await
.rocket_ws
].rocket_db_pools
].сертификатов
].h2
ALPN.json
, msgpack
и uuid
rocket_contrib
[функций в основной код].Shield
]: безопасные и приватные заголовки для всех ответов.uri!
. * [API для перенаправления соединений запроса] с поддержкой сырого I/O с клиентом.
serde
для встроенных защитников и типов.#[launch]
и
#[rocket::main]
.#[catch(default)]
, которые обрабатывают любой код состояния.TempFile
для защиты данных и формы для автоматического загрузки в временный файл.Capped<T>
] для защиты данных и формы, который позволяет обнаруживать обрезание из-за ограничений данных.uri!
.References
].<param...
).>`), которые соответствуют нулю сегментам.local_cache!
] для хранения данных запроса локально для значений, не имеющих уникального типа.CookieJar
] без ограничений "один за другим".2. mebibytes()
.#[derive(Responder)]
.чат
] приложение. ## Поддержка стабильной версии RustВ результате поддержки стабильной версии Rust (версия 2021 и далее), необходимость в использовании атрибутов crates #![feature(..)]
для Rocket больше не требуется. Полный канонический пример с одним маршрутом hello
выглядит следующим образом:#[macro_use] extern crate rocket;
#[get("/<name>/<age>")]
fn hello(name: &str, age: u8) -> String {
format!("Привет, {}-летний человек по имени {}!", age, name)
}
#[launch]
fn rocket() -> _ {
rocket::build().mount("/hello", routes![hello])
}
diff
.- #![feature(proc_macro_hygiene, decl_macro)]
-
#[macro_use] extern crate rocket;
#[get("/<name>/<age>")]
- fn hello(name: String, age: u8) -> String {
+ fn hello(name: &str, age: u8) -> String {
format!("Привет, {}-летний человек по имени {}!", age, name)
}
- fn main() {
- rocket::ignite().mount("/hello", routes![hello]).launch();
- }
+ #[launch]
+ fn rocket() -> _ {
+ rocket::build().mount("/hello", routes![hello])
+ }
Этот выпуск включает множество разрушительных изменений. Для руководства по миграции из версии v0.4 в версию v0.5 см. [руководство по миграции v0.4 до v0.5]. Самые значительные изменения приведены ниже.
sleep()
, Mutex
, RwLock
и т. д.) может препятствовать работе сервера и следует избегать, заменив его асинхронной версией или выполняя в рабочем потоке. Это следствие кооперативного многозадачивания async
в Rust. Подробнее см. новую раздел руководства.ROCKET_ENV
теперь называется ROCKET_PROFILE
. При запуске приложения выводится предупреждение, если используется старое имя.debug
, а не dev
.release
, а не prod
.ROCKET_LOG
теперь называется ROCKET_LOG_LEVEL
. При запуске приложения выводится предупреждение, если используется старое имя.ROCKET_ADDRESS
принимает только IP-адреса, больше не разрешает доменные имена типа localhost
.ROCKET_CLI_COLORS
принимает булевые значения true
, false
вместо строковых значений "on"
, "off"
.debug
, включены секреты без настройки ключа secret_key
.template_dir
) приводит к ошибке при запуске. * Вызов метода [FileServer::new()
] немедленно завершается ошибкой, если указанный каталог не существует.
-12
до -1
. Изменения обратной совместимости возможны только при использовании маршрутов, созданных автоматически. Маршруты с отрицательными рангами могут столкнуться с конфликтом или будут обрабатываться в другом порядке.:
, правильно распознаются как недействительные и отвергаются.Segments
теперь возвращает процент-декодированные &str
.Form
]. Для прежнего поведения используйте гвард Strict
.Option<T>
теперь по умолчанию возвращает None
, а не значение по умолчанию для T
.413 Payload Too Large
.Accept
.true
: строка запроса ? f
эквивалентна ? f=true
.Created<R>
] больше не отправляет заголовок ETag
автоматически, если R: Hash
.Для отправки заголовка используйте метод [Created::tagged_body
].FileServer
переходит на другое действие, когда файл не найден вместо ошибки 404 Not Found
.Shield
] включен по умолчанию. Вам может потребоваться отключить или изменить политики, если ваше приложение зависит от обычно небезопасных браузерных функций или если вы хотите выбрать другие политики, отличные от значений по умолчанию.get()
для объекта [CookieJar
] больше не возвращают куки, добавленные во время обработки запроса. Смотрите CookieJar
#pending.Hash
для типов данных MediaType
и ContentType
больше не учитывают параметры типа медиа.FromForm
для Vec
и Map
правильно поддерживают ленивую обработку.[
и ]
теперь допустимы в путях URI.[
и ]
больше не закодированы функцией uri!
.Secure
для всех кук, передаваемых через TLS, установлен по умолчанию.SameSite
по умолчанию равным Lax
.MediaType::JavaScript
] теперь имеет значение text/javascript
.rocket_contrib
устарел, а его функциональность была перемещена в другие крейты rocket
.[Руководство по переходу от устаревшего вклада] предоставляет пошаговое руководство по миграции. Основные изменения следующие:
rocket_contrib
, были объединены с основным крейтом rocket
:
json
, msgpack
и uuid
теперь являются [функциями rocket
].rocket_contrib::json
был перемещён в rocket::serde::json
.rocket_contrib::msgpack
был перемещён в rocket::serde::msgpack
.rocket_contrib::uuid
был перемещён в rocket::serde::uuid
.rocket_contrib::helmet
был перемещён в rocket::shield
. [Shield
] включен по умолчанию.rocket_contrib::serve
был перемещён в rocket::fs
, StaticFiles
— в [rocket::fs::FileServer
].Uuid
и JsonValue
.Shield
, которые больше не поддерживаются браузерами.rocket_contrib
предоставляются отдельными крейтами:
rocket_contrib::templates
используется [rocket_dyn_templates
].rocket_contrib::databases
используются [rocket_sync_db_pools
] и [rocket_db_pools
].rocket
.rocket_contrib::databases::DbError
стал rocket_sync_db_pools::Error
.redis
, mongodb
и mysql
, которые имеют аналогичные асинхронные драйверы.#[database]
генерирует метод [async fn run()
] вместо реализации Deref
.### ОбщееЕсли у вас есть вопросы или нужна помощь, обратитесь к нашей dokumentacii или свяжитесь с нами по электронной почте info@example.com.
Для установки используйте следующую команду:
pip install package_name
При возникновении ошибки Error 404
проверьте правильность адреса.
Для запуска приложения выполните команду:
python app.py
Если возникают проблемы с подключением к базе данных, убедитесь, что ваш сервер доступен по адресу 192.168.1.1
.
Для тестирования используйте следующий скрипт:
pytest -v
Если вы видите сообщение Warning
, проверьте конфигурацию вашего проекта.
Для получения более подробной информации о функциях программы прочитайте раздел функциональности.
Если вы столкнулись с проблемой timeout
, увеличьте время ожидания запроса до 30
секунд.
Для изменения настроек используйте файл config.ini
. Например, чтобы изменить порт, найдите строку "port = 8080"
и замените значение 8080
на желаемый номер порта.
Если вы получаете сообщение Connection refused
, убедитесь, что ваш сервер работает и доступен по адресу http://localhost:8080
.
Для автоматизации процесса сборки используйте скрипт build.sh
. Для запуска этого скрипта выполните команду:
./build.sh
Если вы сталкиваетесь с ошибкой Permission denied
, убедитесь, что у вас достаточно прав доступа к директории /var/www/html
.
Для просмотра логов используйте команду:
tail -f /var/log/app.log
Если вы видите сообщение File not found
, проверьте наличие файла по указанному пути.
Для очистки кэша используйте команду:
rm -rf /path/to/cache/*
Если вы столкнулись с проблемой Memory leak
, попробуйте использовать профилировщик памяти, такой как Valgrind
.
Для анализа производительности используйте инструменты, такие как Profiler
.
Если вы видите сообщение Internal server error
, проверьте журналы сервера для получения дополнительной информации.
Для восстановления системы используйте скрипт restore.sh
. Для запуска этого скрипта выполните команду:
./restore.sh
Если вы столкнулись с проблемой Disk full
, освободите место на диске, выполнив команду:
sudo rm -rf /tmp/*
Для мониторинга состояния системы используйте инструменты, такие как Nagios
.
Если вы видите сообщение Service unavailable
, убедитесь, что все службы работают корректно.
Для управления пользователями используйте команду:
adduser username
Если вы столкнулись с проблемой Access denied
, убедитесь, что у вас есть необходимые права доступа.
Для удаления пользователя используйте команду:
deluser username
Если вы видите сообщение Operation timed out
, увеличьте время ожидания операции до 60
секунд.
Для перезапуска сервиса используйте команду:
service service_name restart
Если вы столкнулись с проблемой Socket closed
, убедитесь, что соединение установлено правильно.
Для просмотра статуса сервиса используйте команду:
service service_name status
Если вы видите сообщение Process terminated
, убедитесь, что процесс завершен корректно.
Для просмотра истории команд используйте команду:
history
Если вы столкнулись с проблемой Command not found
, убедитесь, что команда установлена и доступна.
Для просмотра текущих настроек используйте команду:
cat config.ini
Если вы видите сообщение Configuration file missing
, создайте новый файл конфигурации и добавьте необходимые параметры.
Для просмотра списка всех пользователей используйте команду:
getent passwd | cut -d: -f1
Если вы столкнулись с проблемой User does not exist
, убедитесь, что пользователь существует и добавлен в систему.
Для просмотра списка всех групп используйте команду:
getent group | cut -d: -f1
Если вы видите сообщение Group does not exist
, убедитесь, что группа существует и добавлена в систему.
Для просмотра списка всех процессов используйте команду:
ps aux
Если вы столкнулись с проблемой No processes running
, убедитесь, что все процессы запущены корректно.
Для просмотра списка всех сетевых соединений используйте команду:
netstat -tuln
Если вы видите сообщение No network connections
, убедитесь, что все сетевые соединения установлены корректно.
Для просмотра списка всех открытых портов используйте команду:
ss -tnl
Если вы столкнулись с проблемой Port already in use
, убедитесь, что порты свободны и не используются другими процессами.
Для просмотра списка всех файловых систем используйте команду:
df -h
Если вы видите сообщение Disk space low
, убедитесь, что на диске достаточно места для работы системы.
Для просмотра списка всех устройств используйте команду:
lsblk
Если вы столкнулись с проблемой Device not found
, убедитесь, что устройства подключены и доступны.
Для просмотра списка всех модулей ядра используйте команду:
lsmod
Если вы видите сообщение Module not loaded
, убедитесь, что модуль ядра загружен и активирован.
Для просмотра списка всех загрузочных записей используйте команду:
ls /boot/
Если вы столкнулись с проблемой Bootloader configuration incorrect
, убедитесь, что конфигурация загрузочного меню корректна.
Для просмотра списка всех служб используйте команду:
systemctl list-units --type=service
Если вы видите сообщение Service not active
, убедитесь, что служба активна и работает корректно.
Для просмотра списка всех задач используйте команду:
top
Если вы столкнулись с проблемой Task not running
, убедитесь, что задача запущена и выполняется корректно.
Для просмотра списка всех событий журнала используйте команду:
journalctl -xe
Если вы видите сообщение Log event not recorded
, убедитесь, что события журнала корректно записываются и хранятся.
Для просмотра списка всех ошибок используйте команду:
grep ERROR /var/log/app.log
Если вы столкнулись с проблемой Error not logged
, убедитесь, что ошибки корректно регистрируются и записываются в журнал.
Для просмотра списка всех предупреждений используйте команду:
grep WARNING /var/log/app.log
Если вы видите сообщение Warning not recorded
, убедитесь, что предупреждения корректно записываются и хранятся в журнале.
Для просмотра списка всех информационных сообщений используйте команду:
grep INFO /var/log/app.log
Если вы столкнулись с проблемой Info message not logged
, убедитесь, что информационные сообщения корректно записываются и хранятся в журнале.
Для просмотра списка всех успешных операций используйте команду:
grep SUCCESS /var/log/app.log
Если вы видите сообщение Success message not recorded
, убедитесь, что успешные операции корректно записываются и хранятся в журнале.
Для просмотра списка всех ошибок использования используйте команду:
grep USAGE_ERROR /var/log/app.log
Если вы столкнулись с проблемой Usage error not logged
, убедитесь, что ошибки использования корректно записываются и хранятся в журнале.
Для просмотра списка всех ошибок парсера используйте команду:
grep PARSER_ERROR /var/log/app.log
Если вы видите сообщение Parser error not recorded
, убедитесь, что ошибки парсера корректно записываются и хранятся в журнале.
Для просмотра списка всех ошибок компиляции используйте команду:
grep COMPILE_ERROR /var/log/app.log
Если вы столкнулись с проблемой Compile error not logged
, убедитесь, что ошибки компиляции корректно записываются и хранятся в журнале.
Для просмотра списка всех ошибок выполнения используйте команду:
grep RUNTIME_ERROR /var/log/app.log
Если вы видите сообщение Runtime error not recorded
, убедитесь, что ошибки выполнения корректно записываются и хранятся в журнале.
Для просмотра списка всех ошибок сети используйте команду:
grep NETWORK_ERROR /var/log/app.log
Если вы столкнулись с проблемой Network error not logged
, убедитесь, что ошибки сети корректно записываются и хранятся в журнале.
Для просмотра списка всех ошибок ввода-вывода используйте команду:
grep IO_ERROR /var/log/app.log
Если вы видите сообщение IO error not recorded
, убедитесь, что ошибки ввода-вывода корректно записываются и хранятся в журнале.
Для просмотра списка всех ошибок памяти используйте команду:
grep MEMORY_ERROR /var/log/app.log
Если вы столкнулись с проблемой Memory error not logged
, убедитесь, что ошибки памяти корректно записываются и хранятся в журнале.
Для просмотра списка всех ошибСледующие разрывы совместимости применяются широко и могут вызвать ошибки компиляции.
Ракета
] теперь является универсальным над маркером состояния:
- API работают с Rocket<Строительство>
, Rocket<Запуск>
, Rocket<Орбитальный>
, или Rocket<P: Phase>
в зависимости от необходимости.
- Маркер состояния статически обеспечивает переходы между состояниями в порядке Строительство
, Запуск
, Орбитальный
.
- rocket::ignition()
теперь это [rocket::build()
] и возвращает Rocket<Строительство>
.
- [Rocket::ignition()
] переходит в состояние Запуск
. Это происходит автоматически при запуске, если необходимо.
- Запуск завершает конфигурацию, выполняет ignition
навесы и проверяет [сентинелы].
- [Rocket::launch()
] переходит в состояние Орбитальный
и начинает сервер.
- Методы, такие как [Request::rocket()
], которые относятся к живому экземпляру Rocket, возвращают &Rocket<Орбитальный>
.
async
:
attach
заменены на ignition
навесы. В отличие от attach
навесов, которые выполнялись сразу после привязки, ignition
навесы выполняются при переходе в состояние Запуск
.launch
заменены на liftoff
навесы. Liftoff
навесы всегда выполняются, даже в локальных клиентах, после того как сервер начал прослушивание и известен конкретный порт.ROCKET_ENV
заменён на ROCKET_PROFILE
.ROCKET_LOG
заменён на ROCKET_LOG_LEVEL
.dev
, stage
и prod
не имеют специального значения.debug
и release
являются стандартными профилями для режимов сборки debug
и release
.default
указывает стандартные значения для всех профилей.global
имеет наивысший приоритет, за ним следует выбранный профиль, а затем default
.LoggingLevel
в [LogLevel
].Error
].workers
на usize
вместо u16
.keep_alive
: он отключается с 0
, а не с false
или off
.secrets
(для закрытых cookies) по умолчанию.Figment
.ConfigBuilder
: все поля в структуре [Config
] стали публичными с конструкторами для каждого поля.async
:
FromRequest
], [Fairing
], [catcher::Handler
], [route::Handler
], и [FromData
] используют #[async_trait]
.NamedFile::open
] теперь является асинхронной функцией.Request::local_cache_async()
] для использования в асинхронных гвардах запросов. - Несобственные (unsized
) тела ответов типа Response
должны реализовывать интерфейс [AsyncRead
] вместо Read
.sized
) тела ответов типа Response
должны реализовывать интерфейс [AsyncSeek
] вместо Seek
.local
разделён на два: [rocket::local::asynchronous
] и
[rocket::local::blocking
].Try
для [Outcome
], которая позволяла использовать оператор ?
с объектами типа Outcome
. Рекомендованной заменой являются макрос rocket::outcome::try_outcome!
и различные комбинаторные функции для Outcome
.Responder
для типа данных Result<T, E>
доступна только если оба T
и E
реализуют Responder
. Новый тип отклика Debug
заменил Result<T: Responder, E: Debug>
.!
, теперь используют тип [std::convert::Infallible
].IntoOutcome
] был переработан для замены методов, удалённых в Outcome
.
IntoOutcome::into_outcome()
теперь называется or_error()
.IntoOutcome
реализуется для всех псевдонимов типа Outcome
.Outcome::forward()
требует указания статусного кода.Outcome::from()
и Outcome::from_or_forward()
были удалены.Rocket::register()
] теперь принимает базовый путь для области действия catcher'ов как первый аргумент.ErrorKind::Collision
переименован в ErrorKind::Collisions
.tls
. * Методы [MediaType::with_params()
] и [ContentType::with_params()
] теперь являются конструкторами.Raw
.content::Plain
теперь называется content::RawText
.content::Custom<T>
был удален в пользу пары значений [(ContentType, T)
].CookieJar::get_private_pending()
был удален в пользу метода CookieJar::get_pending()
.local_cache!
принимает меньше типов. Вместо него следует использовать макрос local_cache_once!
.Rocket::launch()
позволяет восстановлению Rocket
после завершения работы, возвращая экземпляр после остановки.ErrorKind::Runtime
был удален; добавлено значение [ErrorKind::Shutdown
].Outcome::Failure
было переименовано в [Outcome::Error
].#[route(GET, path = ". . . ")]
путь теперь называется uri
: #[route(GET, uri = ". . . ")]
./<p...>
) теперь совпадают с нулём или более сегментами./<a>/<p...>
) теперь конфликтует с (/<a>
), требует указания rank
для разрешения.rocket::catcher
].rocket::route
].rocket::http::uri::fmt
].T
больше не преобразуется в Option<T>
или Result<T, _>
для параметров запроса в uri!
.uri!
требует использования обёрнутого значения или _
.&RawStr
больше не реализует FromParam
: используйте &str
вместо.FromParam
.RawStr::url_decode()
и RawStr::url_decode_lossy()
выделяют память при необходимости, возвращают Cow
.RawStr::from_str()
заменено на RawStr::new()
.Origin::segments()
заменено на Origin.path().segments()
.Origin::path()
и Origin::query()
теперь возвращают &RawStr
вместо &str
.Route::name
теперь Option<Cow<'static, str>>>
.Route::set_uri
заменено на метод [Route::map_base()
].Route::uri
теперь имеет тип [RouteUri
].Route::base
удалено в пользу Route.uri().base()
.Forward
] теперь ассоциированы со статусом. * Коды состояний использовались при работе встроенных защитников, когда они передают управление:
FromParam
теперь передаются как 422.&Host
, &Accept
, &ContentType
, IpAddr
и SocketAddr
все передаются с кодом состояния 500.### Данные и формыData
имеет параметризованный срок службы: Data<'r>
.Data::open()
] теперь обязательно требует указания лимита данных.FromDataSimple
. Вместо него используйте [FromData
] и [local_cache!
] или [local_cache_once!
].DataStream
] теперь требуют указания лимитов и возвращают типы [Capped<T>
].rocket::request
в [rocket::form
].FromQuery
. Динамические параметры запроса (#[get("/?<param>")]
) теперь используются с помощью [FromForm
].FromFormValue
на [FromFormField
]. Все T: FromFormField
реализуют FromForm
.FromFormField
].#[form(field = ...)]
в #[field(name = ...)]
.Status
.Cookies
в [CookieJar
]. Его методы принимают &self
.Переименовано Flash.name
в Flash.kind
, Flash.msg
в Flash.message
.
Заменено Request::get_param()
на Request::param()
.
Заменено Request::get_segments()
на Request::segments()
.
Заменено Request::get_query_value()
на Request::query_value()
.
Заменено Segments::into_path_buf()
на Segments::to_path_buf()
.
Заменены Segments
и QuerySegments
на [Segments<Path>
и Segments<Query>
].
Конструкторы типа [Flash
] теперь принимают Into<String>
вместо AsRef<str>
.
Тип защищенного состояния State<'_, T>
теперь &State<T>
.
Удалён жизненный цикл из типа [FromRequest
]: FromRequest<'r>
.
Удалён жизненный цикл из типа [FlashMessage
]: FlashMessage<'_>
.
Удалены все переэкспорты типа State
, кроме [rocket::State
].### Ответчики
Перемещено NamedFile
в rocket::fs::NamedFile
Заменено Content
на content::Custom
Методы Response::body
и Response::body_mut
теперь независимы от ошибок
Переименовано ResponseBuilder
в Builder
Удалены прямые методы чтения тела ответа. Используйте методы на r.body_mut()
вместо этого
Удалены неточные типы и варианты "разделенного тела"
Удалена реализация Responder
для Response
. Предпочтите специализированные ответчики с помощью #[derive(Responder)]
Удалён неиспользуемый фразовый статус из Status
Типы ответчиков в [response::status
] были унифицированы до формы Status<R>(R)
Кроме новых возможностей и изменений, Rocket получил следующие улучшения:### Общее
FromForm
, макросах #[route]
и uri!
.#[field(name = uncased(...))]
.#[field(default = expr())]
.#[field]
на полях структур.Config::ident
для конфигурирования или удаления глобального заголовка Server
.Rocket::figment()
] и [Rocket::catchers()
].LocalRequest::json()
и LocalResponse::json()
.LocalRequest::msgpack()
и LocalResponse::msgpack()
.use m::route; routes![route]
вместо необходимости использовать routes![m::route]
.a/b/c
падает до a/b
, затем до a
.LocalRequest::inner_mut()
]. Объект LocalRequest
реализует DerefMut
для Request
.Config
для всех имён параметров конфигурации.ErrorKind::Config
, представляющий ошибки конфигурации во время выполнения.rocket::fairing::Result
, возвращаемый методом Fairing::on_ignite()
.Rocket::mount()
теперь принимает базовое значение любого типа, который реализует TryInto<Origin<'_>>
.
500
.Error
: теперь он не вызывает исключение, если уже произошло исключение.Reference
и Asterisk
.UriDisplayQuery
].UriDisplayQuery
теперь распознаёт атрибут #[field]
для переименования полей.Client
принимают TryInto<Origin>
, что позволяет использовать uri!()
напрямую.Rocket
теперь помечен как #[must_use]
.http2
.rocket::execute()
] для выполнения будущего launch()
Rocket.context!
] в библиотеку rocket_dyn_templates
для временного контекста шаблонов.time
экспортируется из корневого модуля.[сырых идентификаторов]: raw_identifiers.md
по умолчанию значения полей формы: default_form_field_values.md
Config::ident
: Config_ident.md
[Rocket::figment()
]: Rocket_figment.md
[Rocket::catchers()
]: Rocket_catchers.md
LocalRequest::json()
: LocalRequest_json.md
LocalResponse::json()
: LocalResponse_json.md
LocalRequest::msgpack()
: LocalRequest_msgpack.md
LocalResponse::msgpack()
: LocalResponse_msgpack.md
[UriDisplayQuery
]: UriDisplayQuery.md
[Reference
]: Reference.md
[Asterisk
]: Asterisk.md
[UriDisplayQuery
]: UriDisplayQuery.md
[rocket::execute()
]: rocket_execute.md
[context!
]: context_macro.md
[rocket_dyn_templates
]: rocket_dyn_templates.md
[Error
]: Error_class.mdFromForm
, Responder
и UriDisplay
полностью поддерживают шаблоны.serde
.Shield
] теперь включает includeSubdomains
.write!
, если stdout
пропал, что предотвращает панику.Client::terminate()
] для выполнения грациозного завершения работы при тестировании.async
runtime, а не процесс.local_cache_once!
] для локального хранения данных запроса.Rocket<Build>
, теперь помечаются как #[must_use]
, а не все Rocket<P>
.FromForm
] derive.FromForm
собирает все возникающие ошибки.rocket_sync_db_pools
] теперь грациозно завершаются работу. * Добавлена функция [Metadata::render()
] в [rocket_dyn_templates
] для прямого рендера шаблонов.
cookie
теперь правильно условно активируется.rocket_sync_db_pools
, была исправлена.max_blocking
] для управления количеством блокирующих потоков.ip_header
] "real IP".pool()
] был добавлен модулем [rocket_sync_db_pools
] для автоматически создаваемых пулов.&[u8]
.TempFile::open()
] для потока данных TempFile
.LocalRequest::identity()
].Error::pretty_print()
] для красивого вывода ошибок, аналогично Rocket.String
как параметр маршрута. * Информация о происхождении конфигурации регистрируется в журнал уровне debug
.Outcome
теперь включает соответствующий код состояния.Span::mixed_site()
, чтобы уменьшить случайные предупреждения clippy
. ### HTTP * Добавлена поддержка HTTP/2, включенная по умолчанию через фичу http2
пакета.const
для MediaType
.RawStrBuf
— владеющий RawStr
.RawStr
.RawStr::percent_encode()
и RawStr::strip()
.Host
и &Host
.RawStr::percent_encode_bytes()
.NODELAY
включен по умолчанию для всех соединений.Добавлен AVIF: image/avif
.
Добавлен EventStream
: text/event-stream
.
Добавлен Markdown
: text/markdown
.
Добавлен MP3
: audio/mpeg
.
Добавлен CBZ
: application/vnd.comicbook+zip
, расширение файла .cbz
.
Добавлен CBR
: application/vnd.comicbook-rar
, расширение файла .cbr
.
Добавлен RAR
: application/vnd.rar
, расширение файла .rar
.
Добавлен EPUB
: application/epub+zip
, расширение файла .epub
.
Добавлен OPF
: application/oebps-package+xml
, расширение файла .opf
.
Добавлен XHTML
: application/xhtml+xml
, расширение файла .xhtml
.
Добавлен Text
как псевдоним для медиа-типа Plain
.
Добавлен Bytes
как псевдоним для медиа-типа Binary
.
Добавлен .mjs
как известное расширение для JavaScript.
Добавлены расширения .exe
, .iso
, .dmg
.### Запрос
Добавлена поддержка всех символов UTF-8 в путях маршрутов.
Добавлена поддержка закодированного %3A
в значениях адресов сокетов или IP в FromFormValue
.
Добавлен метод Request::rocket()
для доступа к активному экземпляру Rocket
.
Теперь Request::uri()
возвращает &Origin<'r>
вместо &Origin<'_>
.
Методы Request::accept()
, Request::content_type()
отражают изменения в Accept
, Content-Type
.
Json<T>
, MsgPack<T>
принимают T: Deserialize
, а не только T: DeserializeOwned
.
Подключения SQLite в rocket_sync_db_pools
используют лучшие по умолчанию параметры.
По умолчанию количество рабочих потоков для синхронных пулов баз данных составляет workers * 4
.
Добавлен метод Request::host()
для получения запрошенного хоста клиентом.
Добавлен метод [Template::try_custom()
] для гибкой кастомизации движка шаблонов.
Ручные регистрации шаблонов теперь могут быть отрендерены с помощью Template::render()
.
Добавлена поддержка заголовка X-DNS-Prefetch-Control
в Shield
.
Добавлена поддержка вручную задаваемых значений expires
для приватных cookies.
Добавлена поддержка типовых generics и пользовательских ограничений generics к
#[derive(Responder)]
.
Заголовок Server
устанавливается только если он ещё не был установлен.
Точные заголовки Content-Length
отправляются даже для частично прочтённых Body
.
[Redirect
] теперь принимает TryFrom<Reference>
, что позволяет использовать фрагменты.
Clone
для State
.Copy
и Clone
для fairing::Info
.Debug
для Rocket
и Client
.Default
для Status
(возвращает Status::Ok
).PartialEq
, Eq
, Hash
, PartialOrd
и Ord
для Status
.Eq
, Hash
и PartialEq<&str>
для Origin
.PartialEq<Cow<'_, RawStr>>>
для RawStr
.std::error::Error
для Error
.Deref
и DerefMut
для LocalRequest
(к Request
).DerefMut
для Form
, LenientForm
.From<T>
для Json<T>
, MsgPack<T>
.TryFrom<String>
и TryFrom<&str>
для Origin
.TryFrom<Uri>
для каждого из конкретных вариантов URI.FromRequest
для &Config
.FromRequest
для IpAddr
.FromParam
для PathBuf
.FromParam
, FromData
и FromForm
для &str
.FromForm
для Json<T>
, MsgPack<T>
.FromFormField
для Cow
и Capped<Cow>>
.Responder
для tokio::fs::File
.Responder
для (ContentType, R)
, где R: Responder
.Responder
для (Status, R)
, где R: Responder
, что переопределяет статус R
.Responder
для std::io::Error
(поведение аналогично Debug<std::io::Error>
).Responder
для Either<T, E>
, эквивалентно Result<T, E>
.Serialize
для Flash
.Serialize
, Deserialize
, UriDisplay
и FromUriParam
для uuid::Uuid
.Serialize
и Deserialize
для RawStr
. * Реализованы трейты Serialize
и Deserialize
для всех типов URI.Responder
для Arc<T>
, Box<T>
, где T: Responder
.Serialize
и Deserialize
для [Method]
.Eq
для [MediaType]
и [ContentType]
.Responder
для Box<T: Responder + Sized>
.FromForm
для Arc<T>
.Fairing
для Arc<dyn Fairing>
.Serialize
и Deserialize
для Status
.### Изменения зависимостейserde
была введена (1.0
).futures
была введена (0.3
).binascii
была введена (0.1
).ref-cast
была введена (1.0
).atomic
была введена (0.5
).parking_lot
была введена (0.11
).ubyte
была введена (0.10
).figment
была введена (0.10
).rand
была введена (0.8
).either
была введена (1.0
).pin-project-lite
была введена (0.2
).indexmap
была введена (2.0
).tempfile
была введена (3.0
).async-trait
была введена (0.1
).async-stream
была введена (0.3
).multer
была введена (2.0
).tokio
была введена (1.6.1
).tokio-util
была введена (0.6
).tokio-stream
была введена (0.1.6
).bytes
была введена (1.0
).normpath
была введена (1
).state
была обновлена до версии 0.6
.rmp-serde
была обновлена до версии 0.15
.uuid
была обновлена до версии 0.8
.tera
была обновлена до версии 1.10
.postgres
была обновлена до версии 0.19
.rusqlite
была обновлена до версии 0.25
.r2d2_sqlite
была обновлена до версии 0.18
.time
была обновлена до версии 0.3
.handlebars
была обновлена до версии 4.0
.memcache
была обновлена до версии 0.16
. * Библиотека rustls
была обновлена до версии 0.21
.
tokio-rustls
была обновлена до версии 0.24
.syn
была обновлена до версии 2
.diesel
была обновлена до версии 2.0
.sqlx
была обновлена до версии 0.7
.notify
была обновлена до версии 6
.criterion
была обновлена до версии 0.4
.cookie
была обновлена до версии 0.18
.yansi
была обновлена до версии 1.0
.atty
была удалена. ## ИнфраструктураВ проект были внесены следующие изменения в его инфраструктуру: * Теперь Rocket использует редакцию 2021 года Rust.use
-инструкции.criterion
и наборы данных, выделенные из реальных проектов.Cargo.toml
.+
(например, +stable
) в скрипте test.sh
для передачи cargo
.cargo
в скрипте test.sh
.resolver = 2
.[Предопределенные значения]: https://api.rocket.rs/v0.5/rocket/trait.Sentinel.html[`local_cache! ]: https://api.rocket.rs/v0.5/rocket/request/macro.local_cache.html [
local_cache_once! ]: https://api.rocket.rs/v0.5/rocket/request/macro.local_cache_once.html [
CookieJar]: https://api.rocket.rs/v0.5/rocket/http/struct.CookieJar.html [асинхронные потоки]: https://rocket.rs/v0.5/guide/responses/#async-streams [Server-Sent Events]: https://api.rocket.rs/v0.5/rocket/response/stream/struct.EventStream.html [
fs::relative! ]: https://api.rocket.rs/v0.5/rocket/fs/macro.relative.html [уведомление]: https://api.rocket.rs/v0.5/rocket/structure.Shutdown.html [
Rocket]: https://api.rocket.rs/v0.5/rocket/struct.Rocket.html [
rocket::build()]: https://api.rocket.rs/v0.5/rocket/struct.Rocket.html#method.build [
Rocket::ignite()]: https://api.rocket.rs/v0.5/rocket/struct.Rocket.html#method.ignite [
Rocket::launch()]: https://api.rocket.rs/v0.5/rocket/struct.Rocket.html#method.launch [
Request::rocket()]: https://api.rocket.rs/v0.5/rocket/request/struct.Request.html#method.rocket [Fairings]: https://rocket.rs/v0.5/guide/fairings/ [configuration system]: https://rocket.rs/v0.5/guide/configuration/ [
Poolable]: https://api.rocket.rs/v0.5/rocket_sync_db_pools/trait.Poolable.html [
Config]: https://api.rocket.rs/v0.5/rocket/struct.Config.html [
Error]: https://api.rocket.rs/v0.5/rocket/struct.Error.html [
LogLevel]: https://api.rocket.rs/v0.5/rocket/config/enum.LogLevel.html [
Rocket::register()]: https://api.rocket.rs/v0.5/rocket/struct.Rocket.html#method.register [
NamedFile::open]: https://api.rocket.rs/v0.5/rocket/fs/struct.NamedFile.html#method.open [
Request::local_cache_async()]: https://api.rocket.rs/v0.5/rocket/request/struct.Request.html#method.local_cache_async [
FromRequest]: https://api.rocket.rs/v0.5/rocket/request/trait.FromRequest.html [
Fairing]: https://api.rocket.rs/v0.5/rocket/fairing/trait.Fairing.html [
catcher::Handler]: https://api.rocket.rs/v0.5/rocket/catcher/trait.Handler.html [
route::Handler]: https://api.rocket.rs/v0.5/rocket/route/trait.Handler.html [
FromData]: https://api.rocket.rs/v0.5/rocket/data/trait.FromData.html [
AsyncRead]: https://docs.rs/tokio/1/tokio/io/trait.AsyncRead.html [
AsyncSeek]: https://docs.rs/tokio/1/tokio/io/trait.AsyncSeek.html[
rocket::local::асинхронный]: https://api.rocket.rs/v0.5/rocket/local/asynchronous/index.html [
rocket::local::блокирующий]: https://api.rocket.rs/v0.5/rocket/local/blocking/index.html [
Outcome]: https://api.rocket.rs/v0.5/rocket/outcome/enum.Outcome.html [
rocket::outcome::попробовать_результа!]: https://api.rocket.rs/v0.5/rocket/outcome/macro.try_outcome.html [
Result<T, E>реализует
Ответчик]: https://api.rocket.rs/v0.5/rocket/response/trait.Responder.html#provided-implementations [
Debug]: https://api.rocket.rs/v0.5/rocket/response/struct.Debug.html [
std::convert::Непригодный]: https://doc.rust-lang.org/std/convert/enum.Infallible.html [
ErrorKind::Коллизии]: https://api.rocket.rs/v0.5/rocket/error/enum.ErrorKind.html#variant.Collisions [
rocket::http::uri::fmt]: https://api.rocket.rs/v0.5/rocket/http/uri/fmt/index.html [
Data::открыть()]: https://api.rocket.rs/v0.5/rocket/data/struct.Data.html#method.open [
DataStream]: https://api.rocket.rs/v0.5/rocket/data/struct.DataStream.html [
rocket::форма]: https://api.rocket.rs/v0.5/rocket/form/index.html [
FromFormField]: https://api.rocket.rs/v0.5/rocket/form/trait.FromFormField.html [
FromForm]: https://api.rocket.rs/v0.5/rocket/form/trait.FromForm.html [
FlashMessage]: https://api.rocket.rs/v0.5/rocket/request/type.FlashMessage.html [
Flash]: https://api.rocket.rs/v0.5/rocket/response/struct.Flash.html [
rocket::Состояние]: https://api.rocket.rs/v0.5/rocket/struct.State.html [
Segmentsи
Segments]: https://api.rocket.rs/v0.5/rocket/http/uri/struct.Segments.html [
Route::map_base()]: https://api.rocket.rs/v0.5/rocket/route/struct.Route.html#method.map_base [
uuid поддержка]: https://api.rocket.rs/v0.5/rocket/serde/uuid/index.html [
json]: https://api.rocket.rs/v0.5/rocket/serde/json/index.html [
msgpack]: https://api.rocket.rs/v0.5/rocket/serde/msgpack/index.html [
rocket::serde::json::json!]: https://api.rocket.rs/v0.5/rocket/serde/json/macro.json.html [
rocket::shield::Щит]: https://api.rocket.rs/v0.5/rocket/shield/struct.Shield.html [
rocket::fs::Файловый_сервер]: https://api.rocket.rs/v0.5/rocket/fs/struct.FileServer.html [
rocket_dyn_templates]: https://api.rocket.rs/v0.5/rocket/dyn/templates/index.htmlrs/v0. 5/rocket_dyn_templates/index.html [
rocket_sync_db_pools]: https://api.rocket.rs/v0. 5/rocket_sync_db_pools/index.html [multitasking]: https://rocket.rs/v0. 5/guide/overview/#multitasking [
Created]: https://api.rocket.rs/v0. 5/rocket/response/status/struct.Created.html [
Created::tagged_body]: https://api.rocket.rs/v0. 5/rocket/response/status/struct.Created.html#method.tagged_body [raw identifiers]: https://doc.rust-lang.org/1.51.0/book/appendix-01-keywords.html#raw-identifiers [
Rocket::config()]: https://api.rocket.rs/v0. 5/rocket/struct.Rocket.html#method.config [
Rocket::figment()]: https://api.rocket.rs/v0. 5/rocket/struct.Rocket.html#method.figment [
Rocket::state()]: https://api.rocket.rs/v0. 5/rocket/struct.Rocket.html#method.state [
Rocket::catchers()]: https://api.rocket.rs/v0. 5/rocket/struct.Rocket.html#method.catchers [
LocalRequest::inner_mut()]: https://api.rocket.rs/v0. 5/rocket/local/blocking/struct.LocalRequest.html#method.inner_mut [
RawStrBuf]: https://api.rocket.rs/v0. 5/rocket/http/struct.RawStrBuf.html [
RawStr]: https://api.rocket.rs/v0. 5/rocket/http/struct.RawStr.html [
RawStr::percent_encode()]: https://api.rocket.rs/v0. 5/rocket/http/struct.RawStr.html#method.percent_encode [
RawStr::percent_encode_bytes()]: https://api.rocket.rs/v0. 5/rocket/http/struct.RawStr.html#method.percent_encode_bytes [
RawStr::strip()]: https://api.rocket.rs/v0. 5/rocket/http/struct.RawStr.html#method.strip_prefix [
rocket::catcher]: https://api.rocket.rs/v0. 5/rocket/catcher/index.html [
rocket::route]: https://api.rocket.rs/v0. 5/rocket/route/index.html [
Segments::prefix_of()]: https://api.rocket.rs/v0. 5/rocket/http/uri/struct.Segments.html#method.prefix_of [
Template::try_custom()]: https://api.rocket.rs/v0. 5/rocket_dyn_templates/struct.Template.html#method.try_custom [
Template::custom]: https://api.rocket.rs/v0. 5/rocket_dyn_templates/struct.Template.html#method.custom [
FileServer::new()]: https://api.rocket.rs/v0. 5/rocket/fs/struct.FileServer.html#method.new [
content]: https://api.rocket.rs/v0. 5/rocket/response/content/index.html [
rocket_db_pools]: https://api.rocket.rs/v0. 5/rocket_db_pools/index.html [mutual TLS]: https://rocket.rs/v0. 5/guide/configuration/#mutual-tls [
Certificate]: https://api.rocket.rs/v0. 5/rocket/acme/struct.Certificate.html5/rocket/mtls/struct. Certificate. html [
MediaType::with_params()]: https://api. rocket. rs/v0. 5/rocket/http/struct. MediaType. html#method. with_params [
ContentType::with_params()]: https://api. rocket. rs/v0. 5/rocket/http/struct. ContentType. html#method. with_params [
Host]: https://api. rocket. rs/v0. 5/rocket/http/uri/struct. Host. html [
&Host]: https://api. rocket. rs/v0. 5/rocket/http/uri/struct. Host. html [
Request::host()]: https://api. rocket. rs/v0. 5/rocket/request/struct. Request. html#method. host [
context! ]: https://api. rocket. rs/v0. 5/rocket_dyn_templates/macro. context. html [
MediaType]: https://api. rocket. rs/v0. 5/rocket/http/struct. MediaType. html [
ContentType]: https://api. rocket. rs/v0. 5/rocket/http/struct. ContentType. html [
Method]: https://api. rocket. rs/v0. 5/rocket/http/enum. Method. html [(ContentType, T)]: https://api. rocket. rs/v0. 5/rocket/response/content/index. html#использование [v0. 4 до v0. 5 миграционный гайд]: https://rocket. rs/v0. 5/guide/upgrading/ [гайд по отключению contrib]: https://rocket. rs/v0. 5/guide/upgrading/#отключение-contrib [часто задаваемые вопросы]: https://rocket. rs/v0. 5/guide/faq/ [Rocket::launch()]: https://api. rocket. rs/v0. 5/rocket/struct. Rocket. html#метод. launch [ErrorKind::Shutdown]: https://api. rocket. rs/v0. 5/rocket/error/enum. ErrorKind. html#вариант. Shutdown [шлюзы для завершения работы]: https://api. rocket. rs/v0. 5/rocket/fairing/trait. Fairing. html#завершение_работы [Client::terminate()]: https://api. rocket. rs/v0. 5/rocket/local/blocking/struct. Client. html#метод. terminate [rocket::execute()]: https://api. rocket. rs/v0. 5/rocket/fn. execute. html [CookieJar::get_pending()]: https://api. rocket. rs/v0. 5/rocket/http/struct. CookieJar. html#метод. get_pending [Metadata::render()]: https://api. rocket. rs/v0. 5/rocket_dyn_templates/struct. Metadata. html#метод. render [pool()]: https://api. rocket. rs/v0. 5/rocket_sync_db_pools/example/struct. ExampleDb. html#метод. pool [Request::client_ip()]: https://api. rocket. rs/v0. 5/rocket/request/struct. Request. html#метод. client_ip [max_blocking]: https://api. rocket. rs/v0. 5/rocket/struct. Config. html#поле. max_blocking [ip_header]: https://api. rocket. rs/v0. 5/rocket/struct. Config. htmlhtml#поле. ip_header [LocalRequest::identity()]: https://api. rocket. rs/v0. 5/rocket/local/blocking/struct. LocalRequest. html#метод. identity [TempFile::open()]: https://api. rocket. rs/v0. 5/rocket/fs/enum. TempFile. html#метод. open [Error::pretty_print()]: https://api. rocket. rs/v0. 5/rocket/struct. Error. html#метод. pretty_print [API для перехода соединений]: https://api. rocket. rs/v0. 5/rocket/struct. Response. html#переход [rocket_ws]: https://api. rocket. rs/v0. 5/rocket_ws/ [регистрация]: https://api. rocket. rs/v0. 5/rocket/response/struct. Response. html#метод. add_upgrade [IoHandler]: https://api. rocket. rs/v0. 5/rocket/data/trait. IoHandler. html [response::status]: https://api. rocket. rs/v0. 5/rocket/response/status/index. html [Персонализированные ошибки формы данных]: https://api. rocket. rs/v0. 5/rocket/form/error/enum. ErrorKind. html#вариант. Custom [request::Outcome]: https://api. rocket. rs/v0. 5/rocket/request/type. Outcome. html#вариант. Forward [Результаты маршрута Forward]: https://api. rocket. rs/v0. 5/rocket/request/type. Outcome. html#вариант. Forward [
Outcome::Error]: https://api. rocket. rs/v0. 5/rocket/outcome/enum. Outcome. html#вариант. Error [
IntoOutcome]: https://api. rocket. rs/v0. 5/rocket/outcome/trait. IntoOutcome. html [
MediaType::JavaScript]: https://api. rocket. rs/v0. 5/rocket/http/struct. MediaType. html#ассоциированный-констант. JavaScript [
TempFile::open()]: https://api. rocket. rs/v0. 5/rocket/fs/enum. TempFile. html#метод. open [
Error::pretty_print()]: https://api. rocket. rs/v0. 5/rocket/struct. Error. html#метод. pretty_print [
RouteUri`]: https://api. rocket. rs/v0. 5/rocket/route/struct. RouteUri. html# Версия 0. 4. 10 (21 мая 2021)## Ядро
3276b8
] Устранено использование unsafe
в Origin::parse_owned()
, что исправляет проблему целостности.#1548
, 93e88b0
] Исправлена проблема, препятствующая компиляции под Windows Subsystem for Linux v1.Outcome Try
до версии 2 в последнем nightly.rustc
— 1.54.0-nightly (2021-05-18)
.base64
до 0.13
.2059a6
] Исправлена низкоуровневая проблема целостности минимального влияния в uri::Formatter
.86bd7c
]] Добавлены значения по умолчанию и настраиваемые временные ограничения чтения и записи: read_timeout
и write_timeout
.c24a96
]] Добавлена возможность sse
, которая [включает очистку буфера] путём возврата io::ErrorKind::WouldBlock
.contrib
.contrib
.trybuild
вместо compiletest-rs
.[86bd7c
]: https://github.com/rwf2/Rocket/commit/86bd7c
[c24a96
]: https://github.com/rwf2/Rocket/commit/c24a96
[включает очистку буфера]: https://api.rocket.rs/v0.4/rocket/response/struct.Stream.html#buffering-and-blocking
89150f
] Исправлена низкая проблема целостности минимального влияния в LocalRequest::clone()
.376f74
] Исправлена проблема сериализации cookie, приводящая к некорректной дешифрации cookie в некоторых случаях.ring
для приватных cookie и тем самым для Rocket по умолчанию.Origin::map_path()
для манипулирования путями Origin
.handler::Outcome::from_or_forward()
.Options::NormalizeDirs
для StaticFiles
.cfg(debug_assertions)
в Cargo.toml
,
что позволяет выполнять сборку на последних nightly версиях.Debug
для кода ответа 500
.Result
была отмечена как устаревшая.Debug
для типов Rocket теперь учитывают варианты
форматирования.NoContent
],
[Unauthorized
],
[Forbidden
],
и
[Conflict
].FromParam
для базовых типов NonZero
.Some
,
Ok
, и Err
, затенены.core
; rocket_codegen
больше не используется.Чат Rocket перемещён на [Matrix] и [Freenode]. [Debug
]: https://api.rocket.rs/v0.4/rocket/response/struct.Debug.html
[NoContent
]: https://api.rocket.rs/v0.4/rocket/response/status/struct.NoContent.html
[Unauthorized
]: https://api.rocket.rs/v0.4/rocket/response/status/struct.Unauthorized.html
[Forbidden
]: https://api.rocket.rs/v0.4/rocket/response/status/struct.Forbidden.html
[Conflict
]: https://api.rocket.rs/v0.4/rocket/response/status/struct.Conflict.html
[Matrix]: https://chat.mozilla.org/#/room/#rocket:mozilla.org
[Freenode]: https://kiwiirc.com/client/chat.freenode.net/#rocket
Версия 0.4.2 (28 июня 2019)## Ядро
Использование FnBox
заменено на Box<dyn FnOnce>
.
Удалены постоянные фич-гейты try_from
и transpose_result
.
Макросы derive переэкспортированы вместе с соответствующими трейтами.
Минимально требуемый rustc
— 1.35.0-nightly (2019-04-05)
.
JsonValue
теперь реализует FromIterator
.non_snake_case
в генерируемом коде игнорируются.rustc
— 1.33.0-nightly (2019-01-03)
.StaticFiles
через метод StaticFiles::rank()
.MsgPack
правильно устанавливает тип содержимого MessagePack для ответов.Типы пулов баз данных теперь реализуют DerefMut
.
Добавлена поддержка пулов соединений memcache.
Больше не зависит от стандартных фич ядра.## Документация
Исправлены многие опечатки во всех rustdoc и руководствах.
Добавлена документация по монтированию более одного маршрута одновременно.
isatty
в пользу atty
.StaticFiles
].Handler
].FromData::transform()
].SpaceHelmet
для безопасности и приватности заголовков.private-cookies
.FromFormValue
].Responder
].Template::custom()
для кастомизации движков шаблонов,
включая регистрацию фильтров и помощников.Client
.LocalRequest::private_cookie()
.production
.keep_alive
.ROCKET_CLI_COLORS=off
.format
принимает [краткие формы] таких как json
и html
.Responder
для Status
].Response::cookies()
для получения ответных cookie. * Все логирование отключается при установке log
в значение off
.Metadata
] для получения информации шаблонов.Uri
] парсит URI согласно RFC 7230 в один из типов [Origin
],
[Absolute
], или [Authority
].Outcome::and_then()
], [Outcome::failure_then()
],
и [Outcome::forward_then()
].Responder
для &[u8]
.T: Into<Vec<Route>>
может быть [mount()
]ировано.Request::get_query_value()
] для получения значения строки запроса по ключу.State::from()
для создания значений State
.Uri
]: https://api.rocket.rs/v0.4/rocket/http/uri/enum.Uri.html
[Origin
]: https://api.rocket.rs/v0.4/rocket/http/uri/struct.Origin.html
[Absolute
]: https://api.rocket.rs/v0.4/rocket/http/uri/struct.Absolute.html
[Authority
]: https://api.rocket.rs/v0.4/rocket/http/uri/struct.Authority.html
[Outcome::and_then()
]: https://api.rocket.rs/v0.4/rocket/enum.Outcome.html#method.and_then
[Outcome::forward_then()
]: https://api.rocket.rs/v0.4/rocket/enum.Outcome.html#method.forward_then
[Outcome::failure_then()
]: https://api.rocket.rs/v0.4/rocket/enum.Outcome.html#method.failure_then
[StaticFiles
]: https://api.rocket.rs/v0.4/rocket_contrib/serve/struct.StaticFiles.html
[живое перезагрузка шаблонов]: https://rocket.rs/v0.4/guide/responses/#live-reloading
[Handler
]: https://api.rocket.rs/v0.4/rocket/trait.Handler.html
[mount()
]: https://api.rocket.rs/v0.4/rocket/struct.Rocket.html#method.mount
[FromData::transform()
]: https://api.rocket.rs/v0.4/robot/data/trait.FromData.html#tymethod.transform
[преобразование]: https://api.rocket.rs/v0.4/robot/data/trait.FromData.html#transforming
[обработка строки запроса]: https://rocket.rs/v0.4/guide/requests/#query-strings
[по умолчанию ранжирование]: https://rocket.rs/v0.4/guide/requests/#default-ranking
[Request::get_query_value()
]: https://api.rocket.rs/v0.4/rocket/struct.Request.html#method.get_query_value
[Responder
для Status
]: https://rocket.rs/v0.4/guide/responses/#status
Перепись codegenКрейт rocket_codegen
полностью переписан с использованием API процедурных макросов, которые станут стабильными. Мы ожидаем, что ночное разрушение будет значительно снижено, вероятно до нуля. Новый импорт прелюда для приложений Rocket выглядит следующим образом:
- #![feature(plugin)]
- #![plugin(rocket_codegen)]
+ #![feature(proc_macro_hygiene, decl_macro)]
- extern crate rocket;
+ #[macro_use] extern crate rocket;
Крейт rocket_codegen
не следует указывать как прямую зависимость. Удалите его из вашего файла Cargo.toml
:
[dependencies]
- rocket = "0.3"
+ rocket = "0.4"
- rocket_codegen = "0.3"
Эта версия включает множество разрушающих изменений. Эти изменения перечислены ниже вместе с краткими заметками о том, как обрабатывать эти изменения в существующих приложениях, когда применимо. * Атрибуты маршрутов и ловушек уважают приватность функций.
Чтобы смонтировать маршрут или зарегистрировать ловушку вне модуля, где они объявлены, убедитесь, что функция-обработчик помечена как pub
или crate
.
* Синтаксис обработки запросов был полностью переработан.
Параметр запроса <param>
теперь представлен как <param>
. Рассмотрите возможность использования переработанной [обработки строки запроса].
* Атрибут #[error]
и макрос errors!
были удалены.
Используйте #[catch]
и catchers!
вместо этого.
* Метод Rocket::catch()
был переименован в [Rocket::register()
].
Измените вызовы формы .catch(errors![...])
на .register(catchers![...])
.
* Атрибут #[catch]
принимает только функции с 0 или 1 аргументом.
Убедитесь, что аргумент для ловушки, если он есть, имеет тип &Request
.
* [json!
] возвращает объект типа [JsonValue
], больше не требует обёртки.
Измените случаи использования Json(json!({...}))
на json!
и измените соответствующий тип на JsonValue
.
* Все окружения по умолчанию используют порт 8000.
Вручную настройте порт 80
для окружений stage
и production
для получения прежнего поведения.
* Отладочные сборки по умолчанию используют окружение production.
Вручную установите окружение на debug
с помощью ROCKET_ENV=debug
для получения прежнего поведения.
* [Form
] и [LenientForm
] потеряли параметр жизни get()
, метод.
Измените тип Form<'a, T<'a>>
на Form<T>
или Form<T<'a>>>
. Form<T>
и LenientForm<T>
теперь реализуют Deref<Target = T>
, что позволяет удалить вызовы
метода .get()
. * [ring
] был обновлен до версии 0.13.
Убедитесь, что все транзитивные зависимости к `ring` указывают на версию `0.13`.
Тип Uri
в основном заменён типом [Origin
].
В общем случае замените тип Uri
на Origin
. Полевые члены base
и uri
типа [Route
]
теперь имеют тип [Origin
]. Защитник типа &Uri
теперь имеет тип &Origin
.
Метод [Request::uri()
] теперь возвращает объект типа [Origin
].
Все элементы в модуле [rocket_contrib
] находятся за модулями.
Json
теперь json::Json
MsgPack
теперь msgpack::MsgPack
MsgPackError
теперь msgpack::Error
Template
теперь templates::Template
UUID
теперь uuid::Uuid
Value
заменён на json::JsonValue
Сертификаты TLS требуют расширения subjectAltName
.
Убедитесь, что ваши сертификаты TLS содержат расширение subjectAltName
с значением,
установленным на ваш домен.
Пути маршрутов, точки монтирования и URI типа LocalRequest
строго проверяются.
Убедитесь, что ваши точки монтирования являются абсолютными путями без параметров,
маршруты должны иметь абсолютные пути с правильной синтаксической конструкцией параметров,
а пути, передаваемые в LocalRequest
, должны быть корректными.
Метод [Template::show()
] принимает &Rocket
, но не принимает root
.
При тестировании используйте метод [client.rocket()
], чтобы получить ссылку на экземпляр Rocket
.
Для отображения шаблонов в маршрутах используйте метод [Template::render()
]. * Метод [Request::remote()
] возвращает реальный удалённый IP-адрес, не перезаписывая его.
Чтобы получить IP-адрес из заголовка "X-Real-IP", если он присутствует, используйте методы
[Request::real_ip()
] или [Request::client_ip()
].
Вариант Bind
был добавлен в тип [LaunchErrorKind
].
Убедитесь, что проверки на LaunchErrorKind
учитывают или игнорируют вариант Bind
.
Куки автоматически отслеживаются и распространяются через объект типа Client
.
Для поведения предыдущих версий создайте объект Client
с помощью метода
[Client::untracked()
].
Метод LocalRequest::cloned_dispatch()
был удалён.
Для воспроизведения старого поведения используйте цепочку вызовов .clone().dispatch()
.
Конструкторы типа [Redirect
] принимают обобщённый тип T: TryInto<Uri<'static>>>
.
Вызов конструктора Redirect
с непостоянной строкой &str
вида
Redirect::to(string)
следует преобразовать в Redirect::to(string.to_string())
,
выделяя строку на куче перед её передачей конструктору.
Реализация [FromData
] для [Form
] и [LenientForm
] теперь возвращает ошибку
типа [FormDataError
].
При отсутствии I/O ошибок, строка формы хранится в варианте как &'f str
.
Добавлен вариант [Missing
] к типу ошибки [ConfigError
].
Убедитесь, что проверка на ConfigError
включает или игнорирует вариант Missing
.
Реализация [FromData
] для типа данных [Json
] теперь возвращает ошибку
типа [JsonError
]. Предыдущий тип ошибки SerdeError
стал вторым членом перечисления JsonError
.
Разбирайте и деконструируйте этот вариант для получения прежнего поведения.
Теперь реализация [FromData
] эмулируется через [FromDataSimple
].
Измените реализации FromData
на FromDataSimple
, но не используйте.
Рассмотрите возможность использования [трансформаций], если это может принести пользу вашей реализации.
Итератор [FormItems
] проходит по значениям типа [FormItem
].
Преобразуйте использование .map(|item| item.key_value())
для восстановления прежнего поведения.
Вариант [LaunchErrorKind::Collision
] содержит вектор коллизирующих маршрутов.
Деконструируйте его с помощью LaunchErrorKind::Collision(..)
, чтобы игнорировать вектор.
Методы [Request::get_param()
] и [Request::get_segments()
] индексируются по
сегменту, а не по динамическому параметру.
Приведите аргумент n
в вызовах этих методов соответственно.
Атрибуты маршрута на основе метода больше не принимают ключированное значение path
.
Преобразуйте атрибут вида #[get(path = "..")]
в #[get("..")]
.
Защитники данных для [Json
] и [MsgPack
] больше не отвергают запросы с неожиданным типом контента.
Для приближения к прежнему поведению добавьте параметр маршрута format = "json"
при использовании Json
, или format = "msgpack"
при использовании MsgPack
.
Реализован интерфейс [Responder
для Status
]. Удалены Failure
,
status::NoContent
, и status::Reset
ответчики. Замените использование Failure(status)
на status
напрямую. Замените
status::NoContent
на Status::NoContent
. Замените status::Reset
на Status::ResetContent
. * [Config::root()
] возвращает Option<&Path>
вместо &Path
.
Для предыдущего поведения используйте config.root().unwrap()
.
[Status::new()
] больше не является const
.
Создайте Status
напрямую.
Конструкторы класса [Config
] теперь возвращают Config
вместо Result<Config>
.
Методы ConfigError::BadCWD
и Config.config_path
были удалены.
У класса [Json
] больше нет значения по умолчанию для его типового параметра.
Использование data
на маршрутах методов, не являющихся payload, стало предупреждением вместо ошибки.
Метод raw_form_string
классов [Form
] и [LenientForm
] был удален.
Несколько невозможных ассоциативных типов Error
теперь установлены как !
.
Все конструкторы класса [AdHoc
] требуют имени в качестве первого параметра. * Топовый тип Error
был удален. [LaunchErrorKind::Collision
]: https://api.rocket.rs/v0.4/rocket/error/enum.LaunchErrorKind.html#variant.Collision
[json!
]: https://api.rocket.rs/v0.4/rocket_contrib/macro.json.html
[JsonValue
]: https://api.rocket.rs/v0.4/rocket_contrib/json/struct.JsonValue.html
[Json
]: https://api.rocket.rs/v0.4/rocket_contrib/json/struct.Json.html
[ring
]: https://crates.io/crates/ring
[Template::show()
]: https://api.rocket.rs/v0.4/rocket_contrib/templates/struct.Template.html#method.show
[Template::render()
]: https://api.rocket.rs/v0.4/rocket_contrib/templates/struct.Template.html#method.render
[client.rocket()
]: https://api.rocket.rs/v0.4/rocket/local/struct.Client.html#method.rocket
[Request::remote()
]: https://api.rocket.rs/v0.4/rocket/struct.Request.html#method.remote
[Request::real_ip()
]: https://api.rocket.rs/v0.4/rocket/struct.Request.html#method.real_ip
[Request::client_ip()
]: https://api.rocket.rs/v0.4/rocket/struct.Request.html#method.client_ip
[Bind
]: https://api.rocket.rs/v0.4/rocket/error/enum.LaunchErrorKind.html#variant.Bind
[LaunchErrorKind
]: https://api.rocket.rs/v0.4/rocket/error/enum.LaunchErrorKind.html
[Client::untracked()
]: https://api.rocket.rs/v0.4/rocket/local/struct.Client.html#method.untracked
[Uuid
]: https://api.rocket.rs/v0.4/rocket_contrib/uuid/struct.Uuid.html
[Route
]: https://api.rocket.rs/v0.4/rocket/struct.Route.html
[Redirect
]: https://api.rocket.rs/v0.4/rocket/response/struct.Redirect.html
[Request::uri()
]: https://api.rocket.rs/v0.4/rocket/struct.Request.html#method.uri
[FormDataError
]: https://api.rocket.rs/v0.4/rocket/request/enum.FormDataError.html
[FromData
]: https://api.rocket.rs/v0.4/rocket/data/trait.FromData.html
[Form
]: https://api.rocket.rs/v0.4/rocket/request/struct.Form.html
[LenientForm
]: https://api.rocket.rs/v0.4/rocket/request/struct.LenientForm.html
[AdHoc
]: https://api.rocket.rs/v0.4/rocket/fairing/struct.AdHoc.html
[Missing
]: https://api.rocket.rs/v0.4/rocket/config/enum.ConfigError.html#variant.Missing
[ConfigError
]: https://api.rocket.rs/v0.4/rocket/config/enum.ConfigError.html
[Rocket::register()
]: https://api.rocket.rs/v0.4/rocket/struct.Rocket.html#method.register
[JsonError
]: https://api.rocket.rs/v0.4/rocket/contrib/json/enum.JsonError.html4/rocket_contrib/json/enum. JsonError. html
[transformations]: https://api. rocket. rs/v0. 4/4/rocket/data/from_data. html#transformation
[FromDataSimple
]: https://api. rocket. rs/v0. 4/rocket/data/trait. FromDataSimple. html
[Request::get_param()
]: https://api. rocket. rs/v0. 4/rocket/struct. Request. html#method. get_param
[Request::get_segments()
]: https://api. rocket. rs/v0. 4/rocket/struct. Request. html#method. get_segments
[FormItem
]: https://api. rocket. rs/v0. 4/rocket/request/struct. FormItem. html
[rocket_contrib
]: https://api. rocket. rs/v0. 4/rocket_contrib/index. html
[MsgPack
]: https://api. rocket. rs/v0. 4/rocket_contrib/msgpack/struct. MsgPack. html
[Status::new()
]: https://api. rocket. rs/v0. 4/rocket/http/struct. Status. html#method. new
[Config
]: https://api. rocket. rs/v0. 4/rocket/struct. Config. html
[Config::root()
]: https://api. rocket. rs/v0. 4/rocket/struct. Config. html#method. root
403
обработчик теперь ссылается на авторизацию, а не на аутентификацию.HttpOnly
, и им присваивается срок годности в одну неделю по умолчанию.rocket_codegen
.400
вместо 500
.HEAD
.504: Gateway Timeout
.unsafe
было снижено до двух случаев в основной библиотеке.FormItems
] теперь парсит пустые ключи и значения, а также ключи без значений.Config::active()
] как сокращение для Config::new(Environment::active()?)
.Flash
] cookie теперь очищаются только после проверки.Sync
для [AdHoc::on_attach()
], [AdHoc::on_launch()
] было удалено.AdHoc::on_attach()
], [AdHoc::on_launch()
] принимают FnOnce
. * Добавлена функция [Config::root_relative()
] для получения путей относительно файла конфигурации.
Добавлена функция [Config::tls_enabled()
] для определения активного состояния TLS.
ASCII коды цветов больше не выводятся на версиях Windows, которые их не поддерживают.
Добавлены следующие известные типы медиа: FLAC (audio/flac
), Icon (image/x-icon
), WEBM (audio/webm
), TIFF (image/tiff
), AAC (audio/aac
), Calendar (text/calendar
), MPEG (video/mpeg
), TAR (application/x-tar
), GZIP (application/gzip
), MOV (video/quicktime
), MP4 (video/mp4
), ZIP (application/zip
).
Добавлены следующие расширения: .weba
(WEBM
), .ogv
(OGG
), .mp4
(MP4
), .mpeg4
(MP4
), .aac
(AAC
), .ics
(Calendar
), .bin
(Binary
), .mpg
(MPEG
), .mpeg
(MPEG
), .tar
(TAR
), .gz
(GZIP
), .tif
(TIFF
), .tiff
(TIFF
), .mov
(MOV
).
Улучшена взаимодействие между атрибутами маршрутов и декларативными макросами.
Генерируемый код теперь использует инфраструктуру логгирования вместо println!
.
Маршрутизация была оптимизирована за счет кэширования метаданных маршрутизации.
[Form
] и [LenientForm
] теперь могут быть открыто созданы.
Цветовая схема консоли использует стандартные цвета терминала вместо белого.
Цветовая схема консоли является последовательной во всех сообщениях.
i128
и u128
теперь реализуют [FromParam
], [FromFormValue
].
Зависимость base64
была обновлена до версии 0.10
.
Зависимость log
была обновлена до версии 0.4
.
Зависимость handlebars
была обновлена до версии 1.0
.
Зависимость tera
была обновлена до версии 0.11
. * Зависимость uuid
была обновлена до версии 0.7
.
Зависимость rustls
была обновлена до версии 0.14
.
Зависимость cookie
была обновлена до версии 0.11
. [Пример шаблонов Tera]: https://github.com/rwf2/Rocket/tree/v0.4/examples/tera_templates
[FormItems
]: https://api.rocket.rs/v0.4/rocket/request/enum.FormItems.html
[Config::active()
]: https://api.rocket.rs/v0.4/rocket/config/struct.Config.html#method.active
[Flash
]: https://api.rocket.rs/v0.4/rocket/response/struct.Flash.html
[AdHoc::on_attach()
]: https://api.rocket.rs/v0.4/rocket/fairing/struct.AdHoc.html#method.on_attach
[AdHoc::on_launch()
]: https://api.rocket.rs/v0.4/rocket/fairing/struct.AdHoc.html#method.on_launch
[Config::root_relative()
]: https://api.rocket.rs/v0.4/rocket/struct.Config.html#method.root_relative
[Config::tls_enabled()
]: https://api.rocket.rs/v0.4/rocket/struct.Config.html#method.tls_enabled
rocket_codegen
: https://api.rocket.rs/v0.4/rocket_codegen/index.html
[FromParam
]: https://api.rocket.rs/v0.4/rocket/request/trait.FromParam.html
[FromFormValue
]: https://api.rocket.rs/v0.4/rocket/request/trait.FromFormValue.html
[Data
]: https://api.rocket.rs/v0.4/rocket/struct.Data.html## Инфраструктура
Все документы версионируются.
Предыдущие, текущие и разрабатываемые версии всех документов хранятся.
Репозиторий был переупакован с топ-уровневыми директориями core
и contrib
.
Модуль http
был разделён в отдельный crate rocket_http
. Это внутреннее изменение.
Все использование unsafe
документируется с неформальными доказательствами корректности.
2018-08-23
.rustc
— 1.30.0-nightly 2018-08-23
.#[catch]
и макрос catchers!
, заменившие #[error]
и errors!
.#[error]
и макрос errors!
были отмечены как устаревшие.2018-07-15
.rustc
— 1.29.0-nightly 2018-07-15
.2018-06-22
.rustc
— 1.28.0-nightly 2018-06-22
.2018-06-12
.rustc
— 1.28.0-nightly 2018-06-12
.# Версия 0.3.12 (май 31, 2018)2018-05-30
.rustc
— 1.28.0-nightly 2018-05-30
.2018-05-18
.2018-05-03
.rustc
— 1.27.0-nightly 2018-05-04
.2018-05-03
.2018-04-26
.rustc
— 1.27.0-nightly 2018-04-26
.2018-04-26
.rustc
— 1.27.0-nightly 2018-04-26
.iterator_for_each
, i128_type
, conservative_impl_trait
, never_type
.Rocket.state()
для получения управляемого состояния из экземпляров Rocket
.Rocket.attach()
теперь корректно обрабатываются.application/vnd.api+json
) теперь известен как тип медиа.Content-Type
и Accept
правильно сохраняются при использовании Request.clone()
.rustc
— 1.25.0-nightly 2018-01-12
.2017-12-22
.rustc
— 1.24.0-nightly 2017-12-22
.git grep
вместо egrep
для более быстрого поиска.2017-12-17
.rustc
— 1.24.0-nightly 2017-12-17
.Реализация Responder
для NamedFile
теперь использует размерное тело, когда длина файла известна.
Используется #[repr(C)]
для оберток над str
, чтобы гарантировать правильную структуру лайаута на всех платформах.
Добавлен status::BadRequest
Responder
.## Генерация кода
Улучшено сообщение об ошибке компиляции для отсутствующего аргумента в обработчике.
Обновлена генерация кода для ночного сборки 2017-12-13
.
Минимально требуемый rustc
— 1.24.0-nightly 2017-12-13
.
html_root_url
в rustdoc указывает на правильный адрес.Outcome
: Debug
для Config
теперь уважает форматирование опций.Cow<str>
теперь реализует FromParam
.Vec<u8>
теперь реализует Responder
.Binary
для application/octet-stream
.rustc
— 1.22.0-nightly 2017-09-13
.2017-09-25
.rustc
— 1.22.0-nightly 2017-09-25
.Reponder
Responder
.Добавлены методы конвертации из и в Box<UncasedStr>
.## Генерация кода
Предупреждения были удалены из-за нестабильности компилятора. Предупреждения вернутся как отдельный crate rocket_lints
.
Обновлены предупреждения для ночной сборки 2017-08-10
.
Минимально требуемый rustc
— 1.21.0-nightly (2017-08-10)
.
_ident
).assert!
(#367).2017-08-10
.rustc
— 1.21.0-nightly (2017-08-10)
.MsgPack
] в модуль [contrib
] для простого использования и возврата данных в формате MessagePack.LaunchError
]) от метода [Rocket::launch()
] возвращаются для анализа без вызова паники.Accept
].Accept
] можно получить через метод [Request::accept()
].#[form(field = "name")]
.Rocket::routes()
].Response::body_string()
] для получения содержимого ответа как строки типа String
.Response::body_bytes()
] для получения содержимого ответа как массива байт типа Vec<u8>
.Response::content_type()
] для удобного получения заголовка Content-Type ответа.Request::limits()
для получения ограничений входящих данных.
Request::guard()
для простого получения защитников запроса.Request::route()
для получения активного маршрута, если он существует.&Route
теперь является защитником запроса.Route
может быть получен через Route::base
или Route::base()
.Cookies
, зашифрованных ключом конфигурации secret_key
.Config::{development, staging, production}
для объекта Config
.Config::get_datetime()
для получения значения extra как объекта типа Datetime
.LenientForm
.?
теперь может использоваться с типом Outcome
.stdout
не являетсяTTY.FromForm
доступна для типов Option<T: FromForm>
и Result<T: FromForm, T::Error>
.[NotFound]
для простого 404 ответа.session_key
был переименован в secret_key
, теперь требуется ключ длиной 256 бит в базовой шестнадцатеричной кодировке Base64
Вряд ли что-то использовало ранее session_key
. Если это было так, переименуйте session_key
в secret_key
. Сгенерируйте случайный ключ размером 256 бит в базовой шестнадцатеричной системе с помощью инструмента типа openssl: openssl rand -base64 32
.
Запросный гвард &Cookies
был удален в пользу Cookies
Измените &Cookies
на позициях запросного гварда на Cookies
.
Метод Rocket::launch()
теперь возвращает объект типа LaunchError
, а не вызывает панику.
Для старого поведения добавьте точку с запятой после вызова метода .launch()
: .launch();
.
Маршруты без параметров запроса совпадают с запросами с или без параметров запроса.
Обходного пути нет, но данное изменение может позволить удалить ручные ранги маршрутов.
Атрибут маршрута format
для запросов без нагрузки совпадает с заголовком Accept.
Кроме использования пользовательского запросного гварда, обходного пути нет. Ранее, format
всегда совпадал с заголовком Content-Type, независимо от того, указывала ли метод запроса наличие нагрузки или нет. * Тип данных &str
больше не может использоваться в структурах формы или параметрах.
Используйте новый тип данных [&RawStr
].
ContentType
больше не является запросным гвардом.
Используйте &ContentType
вместо этого.
Метод Request::content_type()
теперь возвращает &ContentType
, а не ContentType
.
Используйте .clone()
для преобразования &ContentType
в ContentType
, если требуется такой тип данных.
Метод Response::header_values()
был удален. Теперь метод Response::headers()
возвращает объект типа &HeaderMap
.
Вызов метода Response::headers()
можно заменить на Response::headers().iter()
. Вызов метода Response::header_values(name)
можно заменить на Response::headers().get(name)
.
Коллизии маршрутов приводят к жесткой ошибке и панике.
Обходного пути нет. Ранее, коллизии маршрутов были предупреждением.
Trait [IntoOutcome
] расширен и стал более гибким.
Обходного пути нет. Метод IntoOutcome::into_outcome()
теперь принимает значение типа Failure
для использования. Был добавлен метод IntoOutcome::or_forward()
для возврата объекта типа Forward
при наличии ошибки в self
.
Опция 'testing' была удалена.
Удалите features = ["testing"]
из файла Cargo.toml
. Используйте новую модульную структуру для тестирования.
Библиотека serde
была обновлена до версии OnClickListener 1.0.
Нет альтернативного решения. Убедитесь, что все зависимости зависят от serde
1.0
.
config::active()
был удален. Используйте метод [Rocket::config()
], чтобы получить конфигурацию до запуска. Если требуется, используйте [управляемое состояние] для хранения информации о конфигурации для последующего использования.
Интерфейс трейта [Responder
] изменился.
Метод Responder::respond(self)
был удален в пользу Responder::respond_to(self, &Request)
. Ответчики могут динамически корректировать свой ответ в зависимости от входящего запроса.
Метод Outcome::of(Responder)
был удален, а метод Outcome::from(&Request, Responder)
добавлен.
Используйте Outcome::from(...)
вместо Outcome::of(...)
.
Использование шаблонов требует прикрепления Template::fairing()
.
Вызовите .attach(Template::fairing())
на экземпляре Rocket вашего приложения перед запуском.
Реализация Display
для типа Template
была удалена.
Используйте метод [Template::show()
], чтобы непосредственно отобразить шаблон.
Метод Request::new()
больше не экспортирован.
Нет альтернативного решения.
Интерфейс трейта [FromForm
] изменился.
Метод Responder::from_form_items(&mut FormItems)
был удален в пользу Responder::from_form(&mut FormItems, bool)
. Второй параметр указывает, должна ли парсинг строго выполняться (true
) или нет (false
).
Тип LoggingLevel
был удален как корневой переэкспортируемый тип.
Теперь его можно импортировать из rocket::config::LoggingLevel
.
Был добавлен вариант Io
к типу ошибки [ConfigError
]. Убедитесь, что конструкция match
для ConfigError
включает вариант Io
.
Метод [ContentType::from_extension()
] теперь возвращает значение типа Option<ContentType>
.
Для старого поведения используйте .unwrap_or(ContentType::Any)
.
Трейт конфигурации IntoValue
был удалён в пользу Into<Value>
.
Нет альтернативного решения. Используйте Into<Value>
там, где это необходимо.
Тип данных rocket_contrib::JSON
был переименован в [rocket_contrib::Json
].
Используйте Json
вместо JSON
.
Все структуры в модуле [content
] используют имена с заглавной буквы.
Используйте Json
, Xml
, Html
и Css
вместо JSON
, XML
, HTML
и CSS
соответственно.[&RawStr
]: https://api.rocket.rs/v0.3/rocket/http/struct.RawStr.html
[IntoOutcome
]: https://api.rocket.rs/v0.3/rocket/outcome/trait.IntoOutcome.html
[local
]: https://api.rocket.rs/v0.3/rocket/local/index.html
[Rocket::config()
]: https://api.rocket.rs/v0.3/rocket/struct.Rocket.html#method.config
[управляемое состояние]: https://rocket.rs/v0.3/guide/state/
[Responder
]: https://api.rocket.rs/v0.3/rocket/response/trait.Responder.html
[Template::show()
]: https://api.rocket.rs/v0.3/rocket_contrib/struct.Template.html#method.show
[FromForm
]: https://api.rocket.rs/v0.3/rocket/request/trait.FromForm.html
[ConfigError
]: https://api.rocket.rs/v0.3/rocket/config/enum.ConfigError.html
[ContentType::from_extension()
]: https://api.rocket.rs/v0.3/rocket/http/struct.ContentType.html#method.from_extension
[rocket_contrib::Json
]: https://api.rocket.rs/v0.3/rocket_contrib/struct.Json.html
[content
]: https://api.rocket.rs/v0.3/rocket/response/content/index.html
Кроме новых функций, в Rocket были внедрены следующие улучшения: * В HTTP
заголовке сервера Server
слово "Rocket"
теперь пишется с большой буквы.
rocket_contrib::Json
по умолчанию установлен как json::Value
.'...'
в сообщении запуска.FromData
для типов данных Vec<u8>
и String
.uuid
была обновлена до версии 0.5
.base64
была обновлена до версии 0.6
.toml
была обновлена до версии 0.4
.handlebars
была обновлена до версии 0.27
.tera
была обновлена до версии 0.10
.yansi
] используется для всех цветовых эффектов в терминале.rustc
dev
во время сборки.Config
] экспортирована из корневого пространства имён.Clone
и Debug
для типа данных [Request
].workers
теперь по умолчанию равен num_cpus * 2
.PartialOrd
, Ord
и Hash
для типа данных [State
].format
теперь работает так, как описано в документации.[yansi
]: https://crates.io/crates/yansi
[Request
]: https://api.rocket.rs/v0.3/rocket/struct.Request.html
[State
]: https://api.rocket.rs/v0.3/rocket/struct.State.html
master
теперь использует номер версии с суффиксом -dev
.2017-06-01
.rustc
— 1.19.0-nightly (2017-06-01)
.2017-05-26
.k
и v
в структурах FromForm
путём избежания коллизий идентификаторов (#265).2017-04-15
.rustc
— 1.18.0-nightly (2017-04-15)
.2017-03-30
.rustc
— 1.18.0-nightly (2017-03-30)
.Методы get_slice
и get_table
были добавлены в Config
.
Возможность использования ограниченной публичности (pub_restricted
) была стабилизована!## Генерация кода
Предупреждения были обновлены для ночного сбора 2017-03-20
.
Минимально требуемый rustc
— это 1.17.0-nightly (2017-03-22)
.
2017-02-25
и 2017-02-26
.rustc
— это 1.17.0-nightly (2017-02-26)
.Flash
работают так, как ожидалось, независимо от пути.config
корректно принимает адреса IPv6.Set-Cookie
корректно устанавливаются.Display
и Error
для ConfigError
.webp
, ttf
, otf
, woff
, и woff2
.into_bytes
и into_inner
для Body
.unmanaged_state
, чтобы она работала с заранее заполненными псевдонимами типов.manage
и JSON
.Подробные заметки выпуска версии 0.2 также доступны на rocket.rs.## Новые возможностиЭтот выпуск включает следующие новые возможности:
Config
могут быть созданы с помощью ConfigBuilder
, который следует паттерну строителя.Rocket::custom
.name
и value
к Header
для получения имени и значения заголовка.workers
можно использовать для установки количества потоков, используемых Rocket.Request.remote()
. Предварительная обработка запроса заменяет удаленный IP значением из заголовка X-Real-IP
, если он присутствует.MockRequest.remote()
.SocketAddr
получает удаленный адрес.contrib
добавлен тип UUID
.rocket
и rocket_codegen
будут отказываться от сборки при использовании некомпилирующегося ночного выпуска и выводить приятные сообщения об ошибке.cookie
, включая добавление CookieBuilder
.bool
в структуре FromForm
будут парситься как false
. * Итератор FormItems
может быть запрошен для полного парсинга через completed
и exhausted
.
OPTIONS
могут быть объявлены с помощью декоратора options
.URI::percent_encode()
.Rocket::custom
принимает два параметра, первый из которых — это Config
по значению.
Вызов в виде v0.1
: Rocket::custom(&config)
теперь выглядит так: Rocket::custom(config, false)
.
Шаблоны Tera названы без расширения.
Шаблон с именем name.html.tera
теперь просто name
.
Метод unwrap
для типа JSON
переименован в into_inner
.
Вызов .unwrap()
следует заменить на .into_inner()
.
Макрос map!
был удален в пользу макроса json!
.
Вызов вида map!{ "a" => b }
можно записать следующим образом: json!({ "a": b })
.
Заголовок hyper::SetCookie
больше не экспортирован.
Используйте тип Cookie
напрямую как тип Into<Header>
.
Тип Content-Type
для String
теперь text/plain
.
Для ответов на основе String
используйте content::Plain<String>
.
Метод Request.content_type()
возвращает Option<ContentType>
.
Используйте .unwrap_or(ContentType::Any)
для получения старого поведения.
Защитник запроса ContentType
передает, когда запрос не имеет заголовка Content-Type
.
Используйте Option<ContentType>
и .unwrap_or(ContentType::Any)
для старого поведения.
Инстанс Rocket
должен объявляться до MockRequest
.
Измените порядок вызова rocket::ignite()
и MockRequest::new()
. * Роут с указанием format
теперь соответствует только запросам с тем же форматом.
Ранее роут с указанием format
соответствовал запросам без указанного формата. В этом случае нет способа обойти данное изменение; просто укажите форматы там, где они требуются.
Прямое создание объектов FormItem
больше недопустимо.
Вместо создания в виде FormItem(string)
используйте FormItem::from(string)
.
Метод from_from_string(&str)
в FromForm
удален в пользу метода from_form_items(&mut FormItems)
.
Большинство реализаций должны использовать FormItems
внутренне; просто используйте переданный FormItems
. В других случаях строка формы может быть получена через метод inner_str
для FormItems
.
Config::{set, default_for}
устарели.
Вместо set
используйте методы set_{параметр}
, а вместо default_for
— new
или build
.
Роутинговые пути должны быть абсолютными.
Добавьте слеш /
в начало относительного пути, чтобы преобразовать его в абсолютный.
Роутинговые пути не могут содержать пустых сегментов.
Удалите любые пустые сегменты, включая завершающие, из роутингового пути.
В этом выпуске были исправлены несколько ошибок:
Rocket::custom
не устанавливал пользовательскую конфигурацию как активную.Кроме новых возможностей, Rocket получил следующие небольшие улучшения:
port
теперь является правильным u16
.0.25
.PartialEq
для типа Config
не учитывает путь или ключ секрета.0.10
.JSON as FromData
теперь представлен как SerdeError
.0.9
.0.7
.pub(crate)
используется повсеместно для обеспечения правил видимости./path?<param>
) теперь записываются в журнал.FromSegments
для PathBuf
.proc_macro
удалена из примеров из-за недостатка стабильности.# Версия 0.1.4 (январь 4, 2017)2017-01-03
.Outcome
исправлена (Succcess -> Success).ContentType::CSV
._method
методом POST.String
правильно декодируются._method
теперь правильно игнорируется при производстве FromForm
.format
больше не приводят к ошибкам.FromForm
больше не вызывает предупреждение о deprication.head
для запросов HEAD
.route(OPTIONS)
для запросов OPTIONS
..tera
теперь корректно автоматически экранируются.Display
.Todo
уточнены в его README
.Добавлены тесты для примеров config
, optional_result
, optional_redirect
и query_params
.
Скрипт тестирования проверяет наличие табуляций и запрещает их использование.## Инфраструктура
Новый скрипт (bump_version.sh
) автоматизирует повышение версий.
Конфигурационный скрипт выдаёт ошибку при неправильной поддержке команд readlink/readpath.
Бэдж Travis указывает на публичные сборки.
get_raw_segments
в генерации кода маршрутов
(#41).<param..>
) учитывают префиксы.publish.sh
) автоматизирует публикацию на crates.io.bump_version.sh
) автоматизирует повышение версий.body
в NamedFile Responder
было потеряно во время перемещения; оно восстановлено!Это первое публичное выпуск Rocket!
hyper
в основных типах Rocket удалены. Rocket теперь реализует свои собственные типы Request
и Response
.ContentType
использует связанные константы вместо статических методов.StatusCode
был удален в пользу нового типа Status
.Response
заменен типом Response
.Responder::respond
больше не принимает тип из библиотеки Hyper.Responder::respond
возвращает объект типа Response
, принимает self
по значению.Handler
теперь возвращает Outcome
вместо псевдонима типа Response
.ErrorHandler
возвращает Result
.Hyper*
были перемещены в непрефиксированную версию в пространстве имён hyper::
.MockRequest::dispatch
теперь возвращает тип Response
.URIBuf
был удален в пользу унифицированного типа URI
.HEAD
.Response
и ResponseBuilder
.Request
, Header
, Status
и ContentType
.MockRequest
позволяет использовать любой тип заголовка.MockRequest
поддерживает куки.ROCKET_CODEGEN_DEBUG
включает логирование генерации кода.Все входящие данные запросов теперь обрабатываются с использованием прямого потокового чтения. Это привело к значительным изменениям в API Rocket. Они суммаризированы следующими изменениями API:
form
был удален.data
.data
и тип Form
.data
из типа Request
.FromData
со стандартной реализацией.FromData
используется для автоматического получения параметра data
.Responder
стал финальным: он больше не может переходить к другим запросам.Responder
может переходить только к catcher'ам.uri
запроса стал приватным. Используйте метод uri()
.Модуль form
перемещён под модуль request
.
response::data
переименован в response::content
.
Введён тип Outcome
с вариантами Success
, Failure
и Forward
.
Модуль outcome
перемещён на уровень верхнего уровня.
Response
теперь является псевдонимом типа Outcome
.
Empty Responder
удалён.
StatusResponder
удалён в пользу модуля response::status
.## Генерация кода
Обработчики ошибок могут принимать 0, 1 или 2 параметра.
FromForm
теперь работает на пустых структурах.
Теперь правильно удаляются lifetime при генерации кода.
Любое допустимое имя теперь разрешено как параметр маршрута с одним параметром.
Request
больше не имеет параметров lifetime.Handler
теперь включает параметр Data
.http
открыт для использования.Responder
для типа ()
как пустого ответа.config::get()
для доступа к глобальной конфигурации.testing
.Rocket.toml
позволяет использовать глобальную конфигурацию через таблицу [global]
.raw_upload
.pastebin
.--all-features
.Rocket::new
в пользу метода ignite
.Rocket::mount_and_launch
в пользу цепочки вызовов mount(..).launch()
.mount
и catch
принимают тип Rocket
по значению.http
.Template::render
в contrib
теперь принимает контекст по ссылке.Rocket.toml
для конфигурирования, используя разумные значения по умолчанию.Переменная окружения ROCKET_ENV
может использоваться для указания рабочего окружения.## Документация
Документирован тип ContentType
.
Документирован тип Request
.
Добавлен скрипт для сборки документации.
response::data_type
в response::data
._method
в формах как метод входящего запроса.Outcome::Bad
для обозначения ответов, которые провалились внутренне.NamedFile
Responder
, который использует расширение файла для типа содержимого ответа.Stream
Responder
для потоковых ответов.contrib
.JSON
, реализующую FromRequest
и Responder
.Template
, реализующую Responder
.Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )