From 491921b8edfbc84c1e4fb8d50a6da3718c5b2204 Mon Sep 17 00:00:00 2001 From: Andrew Mitchell Date: Sat, 6 Mar 2021 13:38:58 -0500 Subject: [PATCH 1/2] fix: Sends 400 status code for invalid write path --- src/influxdb_ioxd/http.rs | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/influxdb_ioxd/http.rs b/src/influxdb_ioxd/http.rs index 8eaf090b24..c6b93ae658 100644 --- a/src/influxdb_ioxd/http.rs +++ b/src/influxdb_ioxd/http.rs @@ -205,7 +205,7 @@ impl ApplicationError { match self { Self::BucketByName { .. } => self.internal_error(), Self::BucketMappingError { .. } => self.internal_error(), - Self::WritingPoints { .. } => self.internal_error(), + Self::WritingPoints { .. } => self.bad_request(), Self::PlanningSQLQuery { .. } => self.bad_request(), Self::Query { .. } => self.internal_error(), Self::QueryError { .. } => self.bad_request(), @@ -1140,6 +1140,39 @@ mod tests { check_response("get_writer_id", response, StatusCode::OK, data).await; } + #[tokio::test] + async fn write_to_invalid_database() { + let test_storage = Arc::new(AppServer::new( + ConnectionManagerImpl {}, + Arc::new(ObjectStore::new_in_memory(InMemory::new())), + )); + test_storage.set_id(1); + test_storage + .create_database("MyOrg_MyBucket", DatabaseRules::new()) + .await + .unwrap(); + let server_url = test_server(Arc::clone(&test_storage)); + + let client = Client::new(); + + let bucket_name = "NotMyBucket"; + let org_name = "MyOrg"; + let response = client + .post(&format!( + "{}/api/v2/write?bucket={}&org={}", + server_url, bucket_name, org_name + )) + .send() + .await; + + if let Ok(response) = response { + let status = response.status(); + assert_eq!(status, StatusCode::BAD_REQUEST); + } else { + panic!("Unexpected error response: {:?}", response); + } + } + #[tokio::test] async fn list_databases() { let server = Arc::new(AppServer::new( From 275075fd728734aeb6f231d6a1584b90cc77dc16 Mon Sep 17 00:00:00 2001 From: Andrew Mitchell Date: Mon, 15 Mar 2021 19:30:46 -0400 Subject: [PATCH 2/2] fix: Send a 404 for db not found write requests --- src/influxdb_ioxd/http.rs | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/influxdb_ioxd/http.rs b/src/influxdb_ioxd/http.rs index c6b93ae658..d68594dbed 100644 --- a/src/influxdb_ioxd/http.rs +++ b/src/influxdb_ioxd/http.rs @@ -205,7 +205,7 @@ impl ApplicationError { match self { Self::BucketByName { .. } => self.internal_error(), Self::BucketMappingError { .. } => self.internal_error(), - Self::WritingPoints { .. } => self.bad_request(), + Self::WritingPoints { .. } => self.internal_error(), Self::PlanningSQLQuery { .. } => self.bad_request(), Self::Query { .. } => self.internal_error(), Self::QueryError { .. } => self.bad_request(), @@ -442,12 +442,16 @@ where server .write_lines(&db_name, &lines) .await - .map_err(|e| Box::new(e) as _) - .context(WritingPoints { - org: write_info.org.clone(), - bucket_name: write_info.bucket.clone(), + .map_err(|e| match e { + server::Error::DatabaseNotFound { .. } => ApplicationError::DatabaseNotFound { + name: db_name.to_string(), + }, + _ => ApplicationError::WritingPoints { + org: write_info.org.clone(), + bucket_name: write_info.bucket.clone(), + source: Box::new(e), + }, })?; - Ok(Response::builder() .status(StatusCode::NO_CONTENT) .body(Body::empty()) @@ -1165,12 +1169,13 @@ mod tests { .send() .await; - if let Ok(response) = response { - let status = response.status(); - assert_eq!(status, StatusCode::BAD_REQUEST); - } else { - panic!("Unexpected error response: {:?}", response); - } + check_response( + "write_to_invalid_databases", + response, + StatusCode::NOT_FOUND, + "", + ) + .await; } #[tokio::test]