name: "Test"
command: "bazelisk test //:tests || true"
+ - store_artifacts:
+ path: ~/project/bazel-testlogs
+
- store_test_results:
path: ~/project/bazel-testlogs/rest
- store_test_results:
- store_test_results:
path: ~/project/bazel-testlogs/webhook
+ - store_artifacts:
+ path: ~/project/bazel-testlogs
+
- run:
name: "Build"
command: "bazelisk build //:packages"
- run:
name: "Test"
command: |
- $ErrorActionPreference = ‘SilentlyContinue’
- bazelisk test //:tests
+ bazelisk test //:tests | Out-Null
- store_test_results:
path: ~/project/bazel-testlogs/rest
- store_test_results:
path: ~/project/bazel-testlogs/webhook
+ - store_artifacts:
+ path: ~/project/bazel-testlogs
- run:
name: "Build"
// Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
"remoteUser": "vscode",
"overrideCommand": false,
- "runArgs": ["--init"],
+ "runArgs": ["--init", "--network=host"]
}
\ No newline at end of file
write!(f, "An error occurred within the nova system: {}", self.message) // user-facing output
}
}
+
+impl From<&str> for NovaError {
+ fn from(message: &str) -> Self {
+ NovaError { message: message.to_string() }
+ }
+}
\ No newline at end of file
config: Arc<Config>,
}
+impl ServiceProxy {
+ async fn proxy_call() {}
+}
+
impl Service<Request<Body>> for ServiceProxy {
type Response = Response<Body>;
type Error = hyper::Error;
);
*req.headers_mut() = headers;
- let res = self.client
- .request(req)
- .map_ok(move |res| {
- if let Some(bucket) = res.headers().get("x-ratelimit-bucket") {
-
- println!("bucket ratelimit! {:?} : {:?}", path, bucket);
- }
+ let client = self.client.clone();
+ let ratelimiter = self.ratelimiter.clone();
- res
- });
-
- return Box::pin(res);
+ return Box::pin(async move {
+ match ratelimiter.check(&req).await {
+ Ok(allowed) => match allowed {
+ true => {
+ Ok(client
+ .request(req)
+ .map_ok(move |res| {
+ if let Some(bucket) = res.headers().get("x-ratelimit-bucket") {
+
+ println!("bucket ratelimit! {:?} : {:?}", path, bucket);
+ }
+ res
+ }).await.unwrap())
+ },
+ false => {
+ Ok(Response::builder().body("ratelimited".into()).unwrap())
+ },
+ },
+ Err(_) => {
+ Ok(Response::builder().body("server error".into()).unwrap())
+ },
+ }
+ });
}
}
-use common::redis_crate::{AsyncCommands, RedisError, aio::Connection};
+use common::{error::NovaError, redis_crate::{AsyncCommands, RedisError, aio::Connection}};
use hyper::{Body, Request};
use tokio::sync::Mutex;
use std::sync::Arc;
}
}
- pub async fn check(&mut self,request: Request<Body>) -> bool {
+ pub async fn check(&self,request: &Request<Body>) -> Result<bool, NovaError> {
// we lookup if the route hash is stored in the redis table
let path = request.uri().path();
let hash = xxh32(path.as_bytes(), 32);
let value: Result<String, RedisError> = redis.get(key).await;
match value {
- Ok(_) => true,
- Err(error) => false,
+ Ok(response) => {
+ Ok(false)
+ },
+ Err(error) => Err(NovaError::from("failed to issue redis request")),
}
}
}
}\r
\r
async fn start(settings: Settings<Config>) {\r
- \r
let addr = format!(\r
"{}:{}",\r
settings.config.server.address, settings.config.server.port\r