Skip to content

Commit ce8ca8f

Browse files
committed
Add parser
1 parent 5cff3c8 commit ce8ca8f

File tree

13 files changed

+565
-2
lines changed

13 files changed

+565
-2
lines changed

.github/workflows/test.yml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
name: Test
2+
3+
on:
4+
push:
5+
branches: [master, develop]
6+
pull_request:
7+
branches: [master, develop]
8+
9+
jobs:
10+
build:
11+
runs-on: ubuntu-latest
12+
13+
steps:
14+
- uses: actions/checkout@v2
15+
- name: Run tests
16+
run: cargo test --verbose

.gitignore

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,35 @@
1+
# Created by https://www.gitignore.io/api/rust,macos
2+
# Edit at https://www.gitignore.io/?templates=rust,macos
3+
4+
### macOS ###
5+
# General
6+
.DS_Store
7+
.AppleDouble
8+
.LSOverride
9+
10+
# Icon must end with two \r
11+
Icon
12+
13+
# Thumbnails
14+
._*
15+
16+
# Files that might appear in the root of a volume
17+
.DocumentRevisions-V100
18+
.fseventsd
19+
.Spotlight-V100
20+
.TemporaryItems
21+
.Trashes
22+
.VolumeIcon.icns
23+
.com.apple.timemachine.donotpresent
24+
25+
# Directories potentially created on remote AFP share
26+
.AppleDB
27+
.AppleDesktop
28+
Network Trash Folder
29+
Temporary Items
30+
.apdisk
31+
32+
### Rust ###
133
# Generated by Cargo
234
# will have compiled files and executables
335
/target/
@@ -8,3 +40,10 @@ Cargo.lock
840

941
# These are backup files generated by rustfmt
1042
**/*.rs.bk
43+
44+
### Others ###
45+
.halt.releez.yml
46+
/.idea
47+
routerify-query.iml
48+
49+
# End of https://www.gitignore.io/api/rust,macos

Cargo.toml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
[package]
2+
name = "routerify-query"
3+
version = "1.0.0"
4+
description = "A Routerify middleware which parses the request query string."
5+
homepage = "https://github.com/routerify/routerify-query"
6+
repository = "https://github.com/routerify/routerify-query"
7+
keywords = ["routerify", "hyper-rs", "middleware", "querystring"]
8+
categories = ["asynchronous", "web-programming", "web-programming::http-server"]
9+
authors = ["Rousan Ali <[email protected]>"]
10+
readme = "README.md"
11+
license = "MIT"
12+
edition = "2018"
13+
14+
[dependencies]
15+
routerify = "1.0"
16+
hyper = "0.13"
17+
url = "2.1"
18+
19+
[dev-dependencies]
20+
tokio = { version = "0.2", features = ["full"] }
21+
stream-body = "0.1"

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) 2020 Routerify
3+
Copyright (c) 2020 Rousan Ali
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

README.md

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,74 @@
1+
[![Github Actions Status](https://github.com/routerify/routerify-query/workflows/Test/badge.svg)](https://github.com/routerify/routerify-query/actions)
2+
[![crates.io](https://img.shields.io/crates/v/routerify-query.svg)](https://crates.io/crates/routerify-query)
3+
[![Documentation](https://docs.rs/routerify-query/badge.svg)](https://docs.rs/routerify-query)
4+
[![MIT](https://img.shields.io/crates/l/routerify-query.svg)](./LICENSE)
5+
16
# routerify-query
2-
A pre middleware which parses the request query
7+
8+
A [`Routerify`](https://github.com/routerify/routerify) middleware which parses the request query string and populates in the `req` object.
9+
10+
[Docs](https://docs.rs/routerify-query)
11+
12+
## Usage
13+
14+
First add this to your `Cargo.toml`:
15+
16+
```toml
17+
[dependencies]
18+
routerify = "1.0"
19+
routerify-query = "1.0.0"
20+
```
21+
22+
An example:
23+
```rust
24+
use hyper::{Body, Request, Response, Server};
25+
use routerify::{Router, RouterService};
26+
// Import the query_parser function and the RequestQueryExt trait.
27+
use routerify_query::{query_parser, RequestQueryExt};
28+
use std::{convert::Infallible, net::SocketAddr};
29+
30+
// A handler for "/" page. Visit: "/?username=Alice&bookname=HarryPotter" to see query values.
31+
async fn home_handler(req: Request<Body>) -> Result<Response<Body>, Infallible> {
32+
// Access the query values.
33+
let user_name = req.query("username").unwrap();
34+
let book_name = req.query("bookname").unwrap();
35+
36+
Ok(Response::new(Body::from(format!(
37+
"User: {}, Book: {}",
38+
user_name, book_name
39+
))))
40+
}
41+
42+
// Create a router.
43+
fn router() -> Router<Body, Infallible> {
44+
Router::builder()
45+
// Attach the query_parser middleware.
46+
.middleware(query_parser())
47+
.get("/", home_handler)
48+
.build()
49+
.unwrap()
50+
}
51+
52+
#[tokio::main]
53+
async fn main() {
54+
let router = router();
55+
56+
// Create a Service from the router above to handle incoming requests.
57+
let service = RouterService::new(router);
58+
59+
// The address on which the server will be listening.
60+
let addr = SocketAddr::from(([127, 0, 0, 1], 3001));
61+
62+
// Create a server by passing the created service to `.serve` method.
63+
let server = Server::bind(&addr).serve(service);
64+
65+
println!("App is running on: {}", addr);
66+
if let Err(err) = server.await {
67+
eprintln!("Server error: {}", err);
68+
}
69+
}
70+
```
71+
72+
## Contributing
73+
74+
Your PRs and suggestions are always welcome.

examples/example.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
use hyper::{Body, Request, Response, Server};
2+
use routerify::{Router, RouterService};
3+
// Import the query_parser function and the RequestQueryExt trait.
4+
use routerify_query::{query_parser, RequestQueryExt};
5+
use std::{convert::Infallible, net::SocketAddr};
6+
7+
// A handler for "/" page. Visit: "/?username=Alice&bookname=HarryPotter" to see query values.
8+
async fn home_handler(req: Request<Body>) -> Result<Response<Body>, Infallible> {
9+
// Access the query values.
10+
let user_name = req.query("username").unwrap();
11+
let book_name = req.query("bookname").unwrap();
12+
13+
Ok(Response::new(Body::from(format!(
14+
"User: {}, Book: {}",
15+
user_name, book_name
16+
))))
17+
}
18+
19+
// Create a router.
20+
fn router() -> Router<Body, Infallible> {
21+
Router::builder()
22+
// Attach the query_parser middleware.
23+
.middleware(query_parser())
24+
.get("/", home_handler)
25+
.build()
26+
.unwrap()
27+
}
28+
29+
#[tokio::main]
30+
async fn main() {
31+
let router = router();
32+
33+
// Create a Service from the router above to handle incoming requests.
34+
let service = RouterService::new(router);
35+
36+
// The address on which the server will be listening.
37+
let addr = SocketAddr::from(([127, 0, 0, 1], 3001));
38+
39+
// Create a server by passing the created service to `.serve` method.
40+
let server = Server::bind(&addr).serve(service);
41+
42+
println!("App is running on: {}", addr);
43+
if let Err(err) = server.await {
44+
eprintln!("Server error: {}", err);
45+
}
46+
}

examples/test.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use hyper::{Body, Request, Response, Server};
2+
use routerify::{Router, RouterService};
3+
use routerify_query::{query_parser, RequestQueryExt};
4+
use std::{convert::Infallible, net::SocketAddr};
5+
6+
async fn home_handler(req: Request<Body>) -> Result<Response<Body>, Infallible> {
7+
let q = req.query("bookname");
8+
dbg!(q);
9+
10+
Ok(Response::new(Body::from("Home page")))
11+
}
12+
13+
fn router() -> Router<Body, Infallible> {
14+
Router::builder()
15+
.middleware(query_parser())
16+
.get("/", home_handler)
17+
.build()
18+
.unwrap()
19+
}
20+
21+
#[tokio::main]
22+
async fn main() {
23+
let router = router();
24+
25+
let service = RouterService::new(router);
26+
27+
let addr = SocketAddr::from(([127, 0, 0, 1], 3001));
28+
29+
let server = Server::bind(&addr).serve(service);
30+
31+
println!("App is running on: {}", addr);
32+
if let Err(err) = server.await {
33+
eprintln!("Server error: {}", err);
34+
}
35+
}

examples/test_stream_body.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
use hyper::{Body as HyperBody, Request, Response, Server};
2+
use routerify::{Router, RouterService};
3+
use routerify_query::{query_parser, RequestQueryExt};
4+
use std::{convert::Infallible, net::SocketAddr};
5+
use stream_body::StreamBody;
6+
7+
async fn home_handler(req: Request<HyperBody>) -> Result<Response<StreamBody>, Infallible> {
8+
dbg!(req.queries());
9+
dbg!(req.query("name"));
10+
dbg!(req.query("bookName"));
11+
12+
Ok(Response::new(StreamBody::from("Home page")))
13+
}
14+
15+
fn router() -> Router<StreamBody, Infallible> {
16+
Router::builder()
17+
.middleware(query_parser())
18+
.get("/", home_handler)
19+
.options(
20+
"/*",
21+
|_req| async move { Ok(Response::new(StreamBody::from("Options"))) },
22+
)
23+
.any(|_req| async move { Ok(Response::new(StreamBody::from("Not Found"))) })
24+
.err_handler(|err| async move { Response::new(StreamBody::from(format!("Error: {}", err))) })
25+
.build()
26+
.unwrap()
27+
}
28+
29+
#[tokio::main]
30+
async fn main() {
31+
let router = router();
32+
33+
let service = RouterService::new(router);
34+
35+
let addr = SocketAddr::from(([127, 0, 0, 1], 3001));
36+
37+
let server = Server::bind(&addr).serve(service);
38+
39+
println!("App is running on: {}", addr);
40+
if let Err(err) = server.await {
41+
eprintln!("Server error: {}", err);
42+
}
43+
}

releez.yml

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
version: 1.0.0
2+
checklist:
3+
- name: Checkout develop and sync with remote
4+
type: auto
5+
run:
6+
- git checkout develop
7+
- git push
8+
- name: Check syntax
9+
type: auto
10+
run:
11+
- cargo check --release
12+
- name: Run tests
13+
type: auto
14+
run:
15+
- cargo test --release
16+
- name: Start a new release branch
17+
type: auto
18+
run:
19+
- git flow release start "v${VERSION}"
20+
- name: Make sure code is formatted
21+
type: auto
22+
run:
23+
- cargo fmt
24+
- name: Bump version
25+
type: manual
26+
instructions:
27+
- Please update version with ${VERSION} in Cargo.toml file.
28+
- Please update version with ${VERSION} in README.md file if needed.
29+
- name: Commit changes
30+
type: auto
31+
run:
32+
- git add --all && git commit -m "Bump version"
33+
- name: Finish release branch
34+
type: auto
35+
run:
36+
- git flow release finish -s "v${VERSION}"
37+
- name: Push branches and tags to Github
38+
type: auto
39+
run:
40+
- git checkout master
41+
- git push origin master
42+
- git push origin develop
43+
- git push --tags
44+
- name: Edit tag on Github
45+
type: manual
46+
instructions:
47+
- Tag is pushed to Github(https://github.com/routerify/routerify-query/releases). Edit it there and make it a release.
48+
- name: Publish to crates.io
49+
type: auto
50+
confirm: Are you sure to publish it to crates.io?
51+
run:
52+
- cargo publish
53+
- git checkout develop

rustfmt.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
max_width = 120
2+
tab_spaces = 4

0 commit comments

Comments
 (0)