CGIDir

Struct CGIDir 

Source
pub struct CGIDir { /* private fields */ }
Expand description

Custom handler to execute CGIScripts

This handler will execute any script within the directory provided. See examples/cgi.rs for a full usage example

Implementations§

Source§

impl CGIDir

Source

pub fn new(path: impl AsRef<Path>) -> Self

Generate a CGI script from the associated path

build().mount("/", CGIDir::new("examples"))
Source

pub fn clear_file_types(self) -> Self

Clear file type associations, and disables directly running executables

let rocket = build().mount("/", CGIDir::new("test").clear_file_types());
let client = Client::tracked(rocket).unwrap();
let res = client.get("/simple.sh").dispatch();
assert_eq!(res.status(), Status::InternalServerError);
// Since the file could not be executed, a 500 error is returned
Source

pub fn set_file_type( self, extension: impl Into<Cow<'static, str>>, executable: impl Into<Cow<'static, Path>>, ) -> Self

Add a file type association for executing a file. Overrides an existing file type association if one exists.

let rocket = build().mount("/",
    CGIDir::new("test")
        .clear_file_types()// Clear file types
        .set_file_type("sh", Path::new("sh"))// manually insert `sh`
    );
let client = Client::tracked(rocket).unwrap();
let res = client.get("/simple.sh").dispatch();
assert_eq!(res.status(), Status::Ok);
Source

pub fn only_perl(self) -> Self

Only allow executing perl scripts. Disables all filetypes except .pl

let rocket = build().mount("/", CGIDir::new("test").only_perl());
let client = Client::tracked(rocket).unwrap();
let res = client.get("/simple.pl").dispatch();
assert_eq!(res.status(), Status::Ok);
let res = client.get("/simple.sh").dispatch();
assert_eq!(res.status(), Status::InternalServerError);
Source

pub fn only_python(self) -> Self

Only allow executing python scripts. Disables all filetypes except .py

let rocket = build().mount("/", CGIDir::new("test").only_python().detect_python3());
let client = Client::tracked(rocket).unwrap();
let res = client.get("/simple.py").dispatch();
assert_eq!(res.status(), Status::Ok);
let res = client.get("/simple.sh").dispatch();
assert_eq!(res.status(), Status::InternalServerError);
Source

pub fn detect_python3(self) -> Self

Automatically detect python executables. This should allow either python or python3 to be present on the system

let rocket = build().mount("/", CGIDir::new("test").detect_python3());
let client = Client::tracked(rocket).unwrap();
let res = client.get("/simple.py").dispatch();
assert_eq!(res.status(), Status::Ok);
§Panics

If python cannot be found on the current Path. If a version of python not on the path is desired, it is recommended to explicitly set the path e.g. .set_file_type("py", Path::new("/opt/py/bin/python"))

Source

pub fn detect_python2(self) -> Self

Automatically detect python executables. This should allow either python or python2 to be present on the system

let rocket = build().mount("/", CGIDir::new("test").detect_python2());
let client = Client::tracked(rocket).unwrap();
let res = client.get("/simple.py").dispatch();
assert_eq!(res.status(), Status::Ok);
§Panics

If python cannot be found on the current Path. If a version of python not on the path is desired, it is recommended to explicitly set the path e.g. .set_file_type("py", Path::new("/opt/py/bin/python"))

Source

pub fn only_sh(self) -> Self

Only allow executing python scripts. Disables all filetypes except .sh

let rocket = build().mount("/", CGIDir::new("test").only_sh());
let client = Client::tracked(rocket).unwrap();
let res = client.get("/simple.sh").dispatch();
assert_eq!(res.status(), Status::Ok);
let res = client.get("/simple.py").dispatch();
assert_eq!(res.status(), Status::InternalServerError);
Source

pub fn shell_interpreter( self, executable: impl Into<Cow<'static, Path>>, ) -> Self

Sets the shell interpreter. Implicitly enables .sh files if they are currently disabled

Default is sh

let rocket = build().mount("/", CGIDir::new("test").shell_interpreter(Path::new("bash")));
let client = Client::tracked(rocket).unwrap();
let res = client.get("/shell.sh").dispatch();
assert_eq!(res.status(), Status::Ok);
assert_eq!(res.into_string().unwrap(), "bash\n");
Source

pub fn add_windows_scripts(self) -> Self

Adds default Windows Shell Script types:

  • cmd.exe: .cmd, .bat
  • powershell.exe: .ps1
  • cscript.exe: .wsf, .vbs, .js
let rocket = build().mount("/", CGIDir::new("test").add_windows_scripts());
let client = Client::tracked(rocket).unwrap();
let res = client.get("/simple.cmd").dispatch();
assert_eq!(res.status(), Status::Ok);
Source

pub fn direct_executables(self, allow: bool) -> Self

Whether to allow directly executable files. This may allow scripts with execute permissions and a shebang (#!) to be executed, on some systems.

Defaults to true

Source

pub fn unencoded_equals(self, allow: bool) -> Self

Whether to pass parameters that contain unencoded =

The CGI spec requires this to be false, which is the default

Source

pub fn dot_files(self, allow: bool) -> Self

Whether to allow serving unix hidden files (files starting with a .)

Defaults to false

let rocket = build().mount("/", CGIDir::new("test").dot_files(false));
let client = Client::tracked(rocket).unwrap();
let res = client.get("/.simple.sh").dispatch();
assert_eq!(res.status(), Status::NotFound);
Source

pub fn hidden_files(self, allow: bool) -> Self

Whether to allow serving hidden files

Defaults to false, only applies to Windows

Source

pub fn setuid_files(self, allow: bool) -> Self

Whether to allow serving files with setuid & setgid bits set

Defaults to false, only has an effect on Unix systems. Note this does not prevent a script from executing a setuid bit binary, but rather only protects against Rocket starting a setuid binary

Source

pub fn serve_get(self, allow: bool) -> Self

Whether to serve GET & HEAD requests

Defaults to true

let rocket = build().mount("/", CGIDir::new("test").serve_get(false));
let client = Client::tracked(rocket).unwrap();
let res = client.get("/.simple.sh").dispatch();
assert_eq!(res.status(), Status::NotFound);
Source

pub fn serve_post(self, allow: bool) -> Self

Whether to serve POST requests

Defaults to true

let rocket = build().mount("/", CGIDir::new("test").serve_post(false));
let client = Client::tracked(rocket).unwrap();
let res = client.post("/.simple.sh").dispatch();
assert_eq!(res.status(), Status::NotFound);

Trait Implementations§

Source§

impl Clone for CGIDir

Source§

fn clone(&self) -> CGIDir

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for CGIDir

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Handler for CGIDir

Source§

fn handle<'r, 'life0, 'life1, 'async_trait>( &'life0 self, request: &'r Request<'life1>, data: Data<'r>, ) -> Pin<Box<dyn Future<Output = Outcome<'r>> + Send + 'async_trait>>
where Self: 'async_trait, 'r: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Called by Rocket when a Request with its associated Data should be handled by this handler. Read more
Source§

impl Into<Vec<Route>> for CGIDir

Source§

fn into(self) -> Vec<Route>

Converts this type into the (usually inferred) input type.
Source§

impl PartialEq for CGIDir

Source§

fn eq(&self, other: &CGIDir) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Eq for CGIDir

Source§

impl StructuralPartialEq for CGIDir

Auto Trait Implementations§

§

impl Freeze for CGIDir

§

impl RefUnwindSafe for CGIDir

§

impl Send for CGIDir

§

impl Sync for CGIDir

§

impl Unpin for CGIDir

§

impl UnwindSafe for CGIDir

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Cloneable for T
where T: Handler + Clone,

Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoCollection<T> for T

Source§

fn into_collection<A>(self) -> SmallVec<A>
where A: Array<Item = T>,

Converts self into a collection.
Source§

fn mapped<U, F, A>(self, f: F) -> SmallVec<A>
where F: FnMut(T) -> U, A: Array<Item = U>,

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Paint for T
where T: ?Sized,

Source§

fn fg(&self, value: Color) -> Painted<&T>

Returns a styled value derived from self with the foreground set to value.

This method should be used rarely. Instead, prefer to use color-specific builder methods like red() and green(), which have the same functionality but are pithier.

§Example

Set foreground color to white using fg():

use yansi::{Paint, Color};

painted.fg(Color::White);

Set foreground color to white using white().

use yansi::Paint;

painted.white();
Source§

fn primary(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Primary].

§Example
println!("{}", value.primary());
Source§

fn fixed(&self, color: u8) -> Painted<&T>

Returns self with the fg() set to [Color :: Fixed].

§Example
println!("{}", value.fixed(color));
Source§

fn rgb(&self, r: u8, g: u8, b: u8) -> Painted<&T>

Returns self with the fg() set to [Color :: Rgb].

§Example
println!("{}", value.rgb(r, g, b));
Source§

fn black(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Black].

§Example
println!("{}", value.black());
Source§

fn red(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Red].

§Example
println!("{}", value.red());
Source§

fn green(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Green].

§Example
println!("{}", value.green());
Source§

fn yellow(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Yellow].

§Example
println!("{}", value.yellow());
Source§

fn blue(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Blue].

§Example
println!("{}", value.blue());
Source§

fn magenta(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Magenta].

§Example
println!("{}", value.magenta());
Source§

fn cyan(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Cyan].

§Example
println!("{}", value.cyan());
Source§

fn white(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: White].

§Example
println!("{}", value.white());
Source§

fn bright_black(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightBlack].

§Example
println!("{}", value.bright_black());
Source§

fn bright_red(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightRed].

§Example
println!("{}", value.bright_red());
Source§

fn bright_green(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightGreen].

§Example
println!("{}", value.bright_green());
Source§

fn bright_yellow(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightYellow].

§Example
println!("{}", value.bright_yellow());
Source§

fn bright_blue(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightBlue].

§Example
println!("{}", value.bright_blue());
Source§

fn bright_magenta(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightMagenta].

§Example
println!("{}", value.bright_magenta());
Source§

fn bright_cyan(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightCyan].

§Example
println!("{}", value.bright_cyan());
Source§

fn bright_white(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightWhite].

§Example
println!("{}", value.bright_white());
Source§

fn bg(&self, value: Color) -> Painted<&T>

Returns a styled value derived from self with the background set to value.

This method should be used rarely. Instead, prefer to use color-specific builder methods like on_red() and on_green(), which have the same functionality but are pithier.

§Example

Set background color to red using fg():

use yansi::{Paint, Color};

painted.bg(Color::Red);

Set background color to red using on_red().

use yansi::Paint;

painted.on_red();
Source§

fn on_primary(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Primary].

§Example
println!("{}", value.on_primary());
Source§

fn on_fixed(&self, color: u8) -> Painted<&T>

Returns self with the bg() set to [Color :: Fixed].

§Example
println!("{}", value.on_fixed(color));
Source§

fn on_rgb(&self, r: u8, g: u8, b: u8) -> Painted<&T>

Returns self with the bg() set to [Color :: Rgb].

§Example
println!("{}", value.on_rgb(r, g, b));
Source§

fn on_black(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Black].

§Example
println!("{}", value.on_black());
Source§

fn on_red(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Red].

§Example
println!("{}", value.on_red());
Source§

fn on_green(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Green].

§Example
println!("{}", value.on_green());
Source§

fn on_yellow(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Yellow].

§Example
println!("{}", value.on_yellow());
Source§

fn on_blue(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Blue].

§Example
println!("{}", value.on_blue());
Source§

fn on_magenta(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Magenta].

§Example
println!("{}", value.on_magenta());
Source§

fn on_cyan(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Cyan].

§Example
println!("{}", value.on_cyan());
Source§

fn on_white(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: White].

§Example
println!("{}", value.on_white());
Source§

fn on_bright_black(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightBlack].

§Example
println!("{}", value.on_bright_black());
Source§

fn on_bright_red(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightRed].

§Example
println!("{}", value.on_bright_red());
Source§

fn on_bright_green(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightGreen].

§Example
println!("{}", value.on_bright_green());
Source§

fn on_bright_yellow(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightYellow].

§Example
println!("{}", value.on_bright_yellow());
Source§

fn on_bright_blue(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightBlue].

§Example
println!("{}", value.on_bright_blue());
Source§

fn on_bright_magenta(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightMagenta].

§Example
println!("{}", value.on_bright_magenta());
Source§

fn on_bright_cyan(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightCyan].

§Example
println!("{}", value.on_bright_cyan());
Source§

fn on_bright_white(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightWhite].

§Example
println!("{}", value.on_bright_white());
Source§

fn attr(&self, value: Attribute) -> Painted<&T>

Enables the styling Attribute value.

This method should be used rarely. Instead, prefer to use attribute-specific builder methods like bold() and underline(), which have the same functionality but are pithier.

§Example

Make text bold using attr():

use yansi::{Paint, Attribute};

painted.attr(Attribute::Bold);

Make text bold using using bold().

use yansi::Paint;

painted.bold();
Source§

fn bold(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Bold].

§Example
println!("{}", value.bold());
Source§

fn dim(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Dim].

§Example
println!("{}", value.dim());
Source§

fn italic(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Italic].

§Example
println!("{}", value.italic());
Source§

fn underline(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Underline].

§Example
println!("{}", value.underline());

Returns self with the attr() set to [Attribute :: Blink].

§Example
println!("{}", value.blink());

Returns self with the attr() set to [Attribute :: RapidBlink].

§Example
println!("{}", value.rapid_blink());
Source§

fn invert(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Invert].

§Example
println!("{}", value.invert());
Source§

fn conceal(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Conceal].

§Example
println!("{}", value.conceal());
Source§

fn strike(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Strike].

§Example
println!("{}", value.strike());
Source§

fn quirk(&self, value: Quirk) -> Painted<&T>

Enables the yansi Quirk value.

This method should be used rarely. Instead, prefer to use quirk-specific builder methods like mask() and wrap(), which have the same functionality but are pithier.

§Example

Enable wrapping using .quirk():

use yansi::{Paint, Quirk};

painted.quirk(Quirk::Wrap);

Enable wrapping using wrap().

use yansi::Paint;

painted.wrap();
Source§

fn mask(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Mask].

§Example
println!("{}", value.mask());
Source§

fn wrap(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Wrap].

§Example
println!("{}", value.wrap());
Source§

fn linger(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Linger].

§Example
println!("{}", value.linger());
Source§

fn clear(&self) -> Painted<&T>

👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear(). The clear() method will be removed in a future release.

Returns self with the quirk() set to [Quirk :: Clear].

§Example
println!("{}", value.clear());
Source§

fn resetting(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Resetting].

§Example
println!("{}", value.resetting());
Source§

fn bright(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Bright].

§Example
println!("{}", value.bright());
Source§

fn on_bright(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: OnBright].

§Example
println!("{}", value.on_bright());
Source§

fn whenever(&self, value: Condition) -> Painted<&T>

Conditionally enable styling based on whether the Condition value applies. Replaces any previous condition.

See the crate level docs for more details.

§Example

Enable styling painted only when both stdout and stderr are TTYs:

use yansi::{Paint, Condition};

painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);
Source§

fn new(self) -> Painted<Self>
where Self: Sized,

Create a new Painted with a default Style. Read more
Source§

fn paint<S>(&self, style: S) -> Painted<&Self>
where S: Into<Style>,

Apply a style wholesale to self. Any previous style is replaced. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more