use crate::types::{TxId, ContentHash, Result, KotobaError, Value, Properties};
use crate::graph::GraphRef;
use crate::http::ir::*;
use crate::graph::{Graph, VertexData, EdgeData};
use crate::storage::{MVCCManager, MerkleDAG};
use crate::rewrite::{RewriteEngine, RewriteExterns};
use crate::ir::rule::{RuleIR, Match};
use crate::ir::strategy::{StrategyIR, StrategyOp};
use crate::ir::patch::Patch;
use std::collections::HashMap;
use std::sync::Arc;
#[derive(Clone)]
pub struct HttpRequestProcessor {
rewrite_engine: Arc<RewriteEngine>,
mvcc: Arc<MVCCManager>,
merkle: Arc<MerkleDAG>,
}
impl HttpRequestProcessor {
pub fn new(
rewrite_engine: Arc<RewriteEngine>,
mvcc: Arc<MVCCManager>,
merkle: Arc<MerkleDAG>,
) -> Self {
Self {
rewrite_engine,
mvcc,
merkle,
}
}
pub async fn process_request(&self, request: HttpRequest) -> Result<HttpResponse> {
self.process_request_simple(request).await
}
async fn process_request_simple(&self, request: HttpRequest) -> Result<HttpResponse> {
match request.path.as_str() {
"/ping" => {
let mut headers = HttpHeaders::new();
headers.set("content-type".to_string(), "application/json".to_string());
Ok(HttpResponse::new(
request.id,
HttpStatus::ok(),
headers,
Some(ContentHash::sha256([0; 32])), ))
},
"/health" => {
let mut headers = HttpHeaders::new();
headers.set("content-type".to_string(), "application/json".to_string());
Ok(HttpResponse::new(
request.id,
HttpStatus::ok(),
headers,
Some(ContentHash::sha256([1; 32])), ))
},
_ => {
Ok(HttpResponse::new(
request.id,
HttpStatus::not_found(),
HttpHeaders::new(),
None,
))
}
}
}
}
pub struct HttpRewriteExterns;
impl HttpRewriteExterns {
pub fn new() -> Self {
Self
}
}
impl RewriteExterns for HttpRewriteExterns {
fn deg_ge(&self, _v: crate::types::VertexId, _k: u32) -> bool {
true
}
fn edge_count_nonincreasing(&self, _g0: &GraphRef, _g1: &GraphRef) -> bool {
true
}
fn custom_measure(&self, _name: &str, _args: &[crate::types::Value]) -> f64 {
0.0
}
}
#[derive(Clone)]
pub struct MiddlewareProcessor {
middlewares: Vec<HttpMiddleware>,
}
impl MiddlewareProcessor {
pub fn new(middlewares: Vec<HttpMiddleware>) -> Self {
Self { middlewares }
}
pub async fn process(&self, request: &mut HttpRequest) -> Result<()> {
let mut sorted_middlewares = self.middlewares.clone();
sorted_middlewares.sort_by_key(|mw| mw.order);
for middleware in sorted_middlewares {
self.execute_middleware(&middleware, request).await?;
}
Ok(())
}
async fn execute_middleware(&self, middleware: &HttpMiddleware, request: &mut HttpRequest) -> Result<()> {
match middleware.name.as_str() {
"request_id" => {
let request_id = format!("req_{}", request.id);
request.headers.set("x-request-id".to_string(), request_id);
},
"logger" => {
println!("Request: {} {} {}", request.method, request.path, request.id);
},
"cors" => {
},
_ => {
println!("Executing custom middleware: {}", middleware.name);
}
}
Ok(())
}
}
#[derive(Clone)]
pub struct HandlerProcessor;
impl HandlerProcessor {
pub fn new() -> Self {
Self
}
pub async fn process(&self, route: &HttpRoute, request: &HttpRequest) -> Result<HttpResponse> {
match route.pattern.as_str() {
"/ping" => {
let mut headers = HttpHeaders::new();
headers.set("content-type".to_string(), "application/json".to_string());
Ok(HttpResponse::new(
request.id.clone(),
HttpStatus::ok(),
headers,
Some(ContentHash::sha256([0; 32])), ))
},
"/health" => {
let mut headers = HttpHeaders::new();
headers.set("content-type".to_string(), "application/json".to_string());
Ok(HttpResponse::new(
request.id.clone(),
HttpStatus::ok(),
headers,
Some(ContentHash::sha256([1; 32])), ))
},
_ => {
Ok(HttpResponse::new(
request.id.clone(),
HttpStatus::not_found(),
HttpHeaders::new(),
None,
))
}
}
}
}