A middleware for Vapor 4 routing to trim a slash in url path
It’s a common thing for a website or a backend to allow URLs like mySite.com/webpage and mySite.Com/webpage/ for the same page. These pages are different URLs for a search engine. If you want to avoid duplicates, you can add a simple middleware to trim the ending slash and redirect a user.
Here’s an example code for such a middleware class for Vapor 4:
final class TrimSlashInPathMiddleware: Middleware {
func respond(to request: Request, chainingTo next: Responder) -> EventLoopFuture<Response> {
if request.url.path.count > 1, request.url.path.hasSuffix("/") {
let newPath = String(request.url.path.trimmingSuffix(while: { $0 == "/" }))
let response = request.redirect(to: newPath, redirectType: .permanent)
return request.eventLoop.makeSucceededFuture(response)
}
return next.respond(to: request)
}
}
Just add it to configure.swift file:
import Vapor
public func configure(_ app: Application) throws {
app.middleware.use(TrimSlashInPathMiddleware())
app.http.server.configuration.port = 8081
try routes(app)
}
Works with Vapor 4.92.5.
comment commentsМодульбанк информер 1.3
Выпустил небольшое обновление для Модульбанк инфомера. Обновил иконку в статусбаре (тепер узнаваемая), и добавил чекбокс для скрытия счетов с нулевым балансом. Ну и немного рефакторинга.
Исходный код на GitHub: https://github.com/makoni/ModulbankInformer
Скачать можно тут: https://github.com/makoni/ModulbankInformer/releases
How to get selected text inside of TextEditor in SwiftUI on macOS
TextEditor in SwiftUI still doesn’t have any API to get user selection. But since it’s using NSTextView internally we can subscribe to its notifications.
Here’s an example of getting a substring from user selection:
comment commentsSwift CouchDB client 1.3.2
Recently, there have been a couple of new releases for my Swift CouchDB library. Here are the recent changes:
- dateDecodingStrategy and dateEncodingStrategy can now be passed as parameters for get, update and insert methods.
- Added a check to handle expired authentication cookies.
- Comparing the set-cookie header in the response as lowercased.
- Introduced new methods to utilize the _find API, allowing you to find documents using a declarative JSON querying syntax
- Fixed an issue where the update method didn’t use dateEncodingStrategy parameter.
CouchDB Client on GitHub | Documentation with examples and tutorials.
comment commentsAppMetric 1.8
Обновил AppMetric для macOS - клиент для сервиса AppMetrica от Яндекса. Предыдущая версия, увы, уже перестала работать, т.к. они изменили формат ответа.
Судя по дошедшей до меня информации, я использовал что-то незадокументированное из их ответа. И, судя по текущим ответам их API - это было количество крэшей. Увы, пришлось выпилить и заменить на количество устройств.
Решил, что раз уж руки дошли, надо осовременить. Переделал всё на SwiftUI, но пришлось сам попап обернуть в старый добрый NSPopover, т.к. MenuBarExtra из SwiftUI уж больно ограничен. Может быть, дойдут руки написать пост об этом. Заодно перевёл всё на Swift Concurrency и графику из SF Symbols. Правда, теперь всё это работает на macOS 13+, но, думаю, те, кому оно полезно, обновляют макось тоже. Ну и, естственно, наконец-то нативная работа на Apple Silicon.
Обновление сегодня прошло ревью и доступно для скачивания. Планирую в будущем добавить всё-таки графики по дням/неделям.
comment comments
Модульбанк информер 1.2
Обнаружил досадный баг в Модульбанк Информере - если был счёт в турецких лирах, то JSON не парсился и данных не было совсем. Исправил в обновлении.
Исходный код на GitHub: https://github.com/makoni/ModulbankInformer
Скачать можно тут: https://github.com/makoni/ModulbankInformer/releases
Модульбанк информер
Недавно увидел, что у Модульбанка, которым я пользуюсь, есть публичный API. Поскольку у них для macOS нет приложения, а приложение для iOS не работает на Apple Silicon (их ограничение в целях безопасности), я сделал небольшой информер, который показывает в статус баре список счетов и баланс.
Приложение macOS 13+, т.к. хотелось выжать из SwiftUI всё самое актуальное, заодно попрактиковаться.
Исходный код на GitHub: https://github.com/makoni/ModulbankInformer
Скачать можно тут: https://github.com/makoni/ModulbankInformer/releases