intrepid_core/extract/
http_get.rs1use crate::{Context, Frame, HttpFrameMeta};
2
3use super::{Extractor, MessageFrameError, MessageMetaJson, MetaMismatchError};
4
5#[derive(Debug, Clone, PartialEq, Eq)]
7pub struct HttpGet;
8
9impl<State> Extractor<State> for HttpGet {
10 type Error = MessageFrameError;
11
12 fn extract(frame: Frame, context: &Context<State>) -> Result<Self, Self::Error>
13 where
14 Self: Sized,
15 {
16 let MessageMetaJson(http_meta) = MessageMetaJson::<HttpFrameMeta>::extract(frame, context)?;
17
18 if http_meta.method != "GET" {
19 return Err(MetaMismatchError(http_meta.method))?;
20 }
21
22 Ok(Self)
23 }
24}
25
26#[tokio::test]
27async fn extracting_different_methods() -> Result<(), Box<dyn std::error::Error>> {
28 use crate::HttpRequestFrame;
29 use axum::http::Request;
30
31 let request = HttpRequestFrame::from(Request::get("/test").body(axum::body::Body::default())?);
32
33 let context = Context::<()>::default();
34 let extraction = HttpGet::extract(request.into_frame().await, &context);
35
36 assert!(extraction.is_ok());
37
38 let failure_cases = [
39 "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "CONNECT", "PATCH", "TRACE",
40 ];
41
42 for method in failure_cases {
43 let request = HttpRequestFrame::from(
44 Request::builder()
45 .method(method)
46 .uri("/test")
47 .body(axum::body::Body::default())?,
48 );
49
50 let context = Context::<()>::default();
51 let extraction = HttpGet::extract(request.into_frame().await, &context);
52
53 assert!(matches!(
54 extraction.unwrap_err(),
55 MessageFrameError::MetaMismatch(MetaMismatchError(_))
56 ));
57 }
58
59 Ok(())
60}
61
62#[test]
63fn failure() -> Result<(), MessageFrameError> {
64 use crate::{Error, ExtractorError};
65
66 let context = Context::<()>::default();
67 let result = HttpGet::extract_from_frame_and_state(Frame::default(), &context);
68
69 assert!(matches!(
70 result.unwrap_err(),
71 Error::ExtractorError(ExtractorError::MessageFrameError(
72 MessageFrameError::WrongFrame(_)
73 ))
74 ),);
75
76 Ok(())
77}