1
0
Fork 0
mirror of https://github.com/SinTan1729/chhoto-url synced 2024-12-26 23:58:35 -06:00

Basic redirection working

This commit is contained in:
Sayantan Santra 2023-04-02 22:26:23 -05:00
parent 0e97516759
commit b9d76b6734
7 changed files with 139 additions and 27 deletions

View file

@ -1,21 +1,27 @@
FROM rust:1 as build FROM rust:1 as build
RUN cargo install cargo-build-deps
RUN mkdir /actix RUN cargo new --bin simply-shorten
WORKDIR /actix WORKDIR /simply-shorten
COPY ./actix/cargo.toml /actix/cargo.toml COPY ./actix/Cargo.toml .
COPY ./actix/cargo.lock /actix/cargo.lock COPY ./actix/Cargo.lock .
RUN cargo build --deps-only RUN cargo build-deps --release
COPY ./actix /actix COPY ./actix/src ./src
COPY ./actix/resources ./resources
RUN cargo install --path . RUN cargo build --release
FROM gcr.io/distroless/cc-debian10 FROM gcr.io/distroless/cc-debian10
EXPOSE 2000 EXPOSE 2000
COPY --from=build /usr/local/cargo/bin/actix /usr/local/bin/actix WORKDIR /opt
CMD ["actix"] COPY --from=build /simply-shorten/target/release/simply-shorten /opt/simply-shorten
COPY --from=build /simply-shorten/resources /opt/resources
COPY ./urls.sqlite /opt/urls.sqlite
CMD ["./simply-shorten"]

3
actix/.directory Normal file
View file

@ -0,0 +1,3 @@
[Dolphin]
Timestamp=2023,4,2,17,52,37.922
Version=4

49
actix/Cargo.lock generated
View file

@ -2,14 +2,6 @@
# It is not intended for manual editing. # It is not intended for manual editing.
version = 3 version = 3
[[package]]
name = "actix"
version = "0.1.0"
dependencies = [
"actix-files",
"actix-web",
]
[[package]] [[package]]
name = "actix-codec" name = "actix-codec"
version = "0.5.0" version = "0.5.0"
@ -919,6 +911,17 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "simply-shorten"
version = "0.1.0"
dependencies = [
"actix-files",
"actix-web",
"regex",
"sqlite",
"sqlite3-src",
]
[[package]] [[package]]
name = "slab" name = "slab"
version = "0.4.8" version = "0.4.8"
@ -944,6 +947,36 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "sqlite"
version = "0.30.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b1908664131c21a38e5b531344d52a196ec338af5bf44f7fa2c83d539e9561d"
dependencies = [
"libc",
"sqlite3-sys",
]
[[package]]
name = "sqlite3-src"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d1815a7a02c996eb8e5c64f61fcb6fd9b12e593ce265c512c5853b2513635691"
dependencies = [
"cc",
"pkg-config",
]
[[package]]
name = "sqlite3-sys"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d47c99824fc55360ba00caf28de0b8a0458369b832e016a64c13af0ad9fbb9ee"
dependencies = [
"libc",
"sqlite3-src",
]
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.109" version = "1.0.109"

View file

@ -1,5 +1,5 @@
[package] [package]
name = "actix" name = "simply-shorten"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
@ -8,3 +8,9 @@ edition = "2021"
[dependencies] [dependencies]
actix-web = "4" actix-web = "4"
actix-files = "0.6.2" actix-files = "0.6.2"
sqlite = "0.30.4"
regex = "1.7.3"
[dependencies.sqlite3-src]
version="0.4.0"
features=["bundled"]

23
actix/src/database.rs Normal file
View file

@ -0,0 +1,23 @@
use sqlite::{open, Row};
pub fn find_url(shortlink: &str) -> String {
let db = open("./urls.sqlite").expect("Unable to open database!");
let query = "SELECT long_url FROM urls WHERE short_url = ?";
let statement: Vec<Row> = db
.prepare(query)
.unwrap()
.into_iter()
.bind((1, shortlink))
.unwrap()
.map(|row| row.unwrap())
.collect();
let mut longlink = "";
if statement.len() == 1 {
longlink = statement[0].read::<&str, _>("long_url");
}
String::from(longlink)
}

View file

@ -1,19 +1,44 @@
use actix_files::Files; use actix_files::{Files, NamedFile};
use actix_web::{get, web, App, HttpServer, Responder}; use actix_web::{
get,
web::{self, Redirect},
App, HttpServer, Responder,
};
mod database;
mod utils;
#[get("/hello/{name}")] // Define the routes
async fn greet(name: web::Path<String>) -> impl Responder {
format!("Hello {name}!") // Add new links
// Return all active links
// 404 error page
#[get("/err/404")]
async fn error404() -> impl Responder {
NamedFile::open_async("./resources/404.html").await
} }
#[actix_web::main] // or #[tokio::main] // Handle a given shortlink
#[get("/{shortlink}")]
async fn link_handler(shortlink: web::Path<String>) -> impl Responder {
let longlink = utils::get_longurl(shortlink);
if longlink == String::from("") {
Redirect::to("/err/404")
} else {
Redirect::to(longlink).permanent()
}
}
#[actix_web::main]
async fn main() -> std::io::Result<()> { async fn main() -> std::io::Result<()> {
HttpServer::new(|| { HttpServer::new(|| {
App::new() App::new()
.service(greet) .service(link_handler)
.service(error404)
.service(Files::new("/", "./resources/").index_file("index.html")) .service(Files::new("/", "./resources/").index_file("index.html"))
}) })
.bind(("127.0.0.1", 2000))? .bind(("0.0.0.0", 2000))?
.run() .run()
.await .await
} }

16
actix/src/utils.rs Normal file
View file

@ -0,0 +1,16 @@
use crate::database;
use actix_web::web;
use regex::Regex;
pub fn get_longurl(shortlink: web::Path<String>) -> String {
if validate_link(&shortlink) {
database::find_url(shortlink.as_str())
} else {
String::from("")
}
}
fn validate_link(link: &str) -> bool {
let re = Regex::new("[a-z0-9-_]+").unwrap();
re.is_match(link)
}