Skip to content

Instantly share code, notes, and snippets.

@mayankchoubey
Last active September 9, 2023 19:27
Show Gist options
  • Save mayankchoubey/39b888b1ce24063c0f2a23c0ce8af9ac to your computer and use it in GitHub Desktop.
Save mayankchoubey/39b888b1ce24063c0f2a23c0ce8af9ac to your computer and use it in GitHub Desktop.
Rust - QR generator API
[package]
name = "actix_qr_generator"
version = "0.1.0"
edition = "2021"
[dependencies]
actix-web = { version = "4", features = ["openssl"] }
qrcode-generator = "4.1.8"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1"
openssl = { version = "0.10" , features = ["vendored"] }
use actix_web::{web, post, App, HttpServer, HttpResponse, Responder};
use qrcode_generator::QrCodeEcc;
use serde::Deserialize;
use openssl::ssl::{SslAcceptor, SslFiletype, SslMethod};
#[derive(Deserialize)]
struct QrRequest {
urlToEmbed: String,
}
#[post("/qr")]
async fn generate_qr(qr_request: web::Json<QrRequest>) -> impl Responder {
if qr_request.urlToEmbed.is_empty() {
return HttpResponse::BadRequest().into();
}
let result: Vec<u8> = qrcode_generator::to_png_to_vec(qr_request.urlToEmbed.clone(), QrCodeEcc::Low, 512)
.unwrap();
return HttpResponse::Ok()
.content_type("image/png")
.body(result);
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
let mut builder = SslAcceptor::mozilla_intermediate(SslMethod::tls()).unwrap();
builder
.set_private_key_file("/Users/mayankc/Work/source/perfComparisons/certs/key.pem", SslFiletype::PEM)
.unwrap();
builder
.set_certificate_chain_file("/Users/mayankc/Work/source/perfComparisons/certs/cert.pem")
.unwrap();
HttpServer::new(|| App::new().service(generate_qr))
.bind_openssl("127.0.0.1:3000", builder)?
.run()
.await
}
// NOTE ================================================
// The app has been built in release mode.
// =====================================================
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment