Skip to content

v0.8.0

Compare
Choose a tag to compare
@yoshuawuyts yoshuawuyts released this 24 Apr 14:24

API Documentation

This patch introduces the use of the ? operator in Endpoints, initial support for Server-Sent Events, static file serving, and a new submodule hierarchy. This continues the integration of http-types we started in v0.7.0

Fallible endpoints

Tide now allows the use of ? in endpoints. Errors are automatically converted to tide::Error and have a status code of 500 assigned to them. Overriding status codes can be done through the use of the tide::Status trait which is included in the prelude.

use async_std::{fs, io};
use tide::{Response, StatusCode};

#[async_std::main]
async fn main() -> io::Result<()> {
    let mut app = tide::new();

    app.at("/").get(|_| async move {
        let mut res = Response::new(StatusCode::Ok);
        res.set_body(fs::read("my_file").await?);
        Ok(res)
    });

    app.listen("localhost:8080").await?;
    Ok(())
}

Server-Sent Events

This release makes the first steps towards integrating channels in Tide. In this release we're introducing support for Server-Sent Events, unidirectional event streams that operate over HTTP. This can be used for implementing features such as live-reloading, or sending notifications.

use tide::sse;

#[async_std::main]
async fn main() -> Result<(), std::io::Error> {
    let mut app = tide::new();
    app.at("/sse").get(sse::endpoint(|_req, sender| async move {
        sender.send("fruit", "banana", None).await;
        sender.send("fruit", "apple", None).await;
        Ok(())
    }));
    app.listen("localhost:8080").await?;
    Ok(())
}

Connecting to the stream can be done using async-sse or from the browser:

var sse = new EventSource('/sse');
sse.on("message", (ev) => console.log(ev));

In the future we may expand on these APIs to allow other endpoints to send messages on established channels, but in order to do so we need to implement session management first.

Static file serving

Tide is now able to serve static directories through the Route::serve_dir method. This allows mapping URLs to directories on disk:

#[async_std::main]
async fn main() -> Result<(), std::io::Error> {
    let mut app = tide::new();
    app.at("/public/images").serve_dir("images/")?;
    app.listen("127.0.0.1:8080").await?;
    Ok(())
}

Revamped Hierarchy

Tide has been changing a lot recently, and we've made changes to our submodules so we can keep up. We no longer have a singular middleware submodule and instead split them up by topic. This will allow us to continue to expand on Tide's capabilities, while keeping things easy to find.

Screenshot_2020-04-24 tide - Rust

Future Directions

The next step for us is to continue to integrate http-types into Tide, focusing on the Request, Response, and Body types. This will likely coincide with a [email protected] release. After that our goal is to expand our capabilities around file serving and testing. And finally adding support for WebSockets, sessions, and TLS.

We're excited for the future of Tide, and we're glad you're here with us!

Added

  • Enabled the use of ? in Endpoint #438
  • HttpService is now directly implemented on Server #442
  • Added Route::serve_dir which can serve full directories #415
  • Added a "getting started" section to the README #445
  • Added Response::redirect_permanent #435
  • Added Response::redirect_temporary #435
  • Added the redirect submodule #450
  • Added redirect::permanent #435
  • Added the log submodule providing structured logging #451
  • Added a test for chunked encoding #437
  • Added a logo and favicon for rustdoc #459
  • Added the sse submodule providing initial Server-Sent Events support #456
  • Added tide::{Body, StatusCode}, re-exported from http-types #455
  • Added instructions to the README how to run examples #460
  • Added an example for a nesting tide server #429

Changed

  • All Endpoints now return Result<Into<Response>> #438
  • Renamed tide::redirect to tide::redirect::temporary #450
  • Logging middleware is now enabled by default #451
  • Moved CORS middleware to the security submodule #453
  • Allow tide::Result<Response> to be abbreviated as tide::Result #457
  • Replaced the use of IntoResponse with Into<Response> #463

Removed

  • Removed unused server impl code #441
  • Removed the tide::server::Service struct #442
  • Removed the tide::server submodule #442
  • Removed the tide::middleware submodule #453
  • Removed the IntoResponse trait #463

Fixed

  • Fixed CORS behavior if there is no origin header #439
  • Fixed documentation formatting in lib.rs #454
  • Fixed a stability issue in our tests regarding by opening random ports #446