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
impl CGIDir
Sourcepub fn new(path: impl AsRef<Path>) -> Self
pub fn new(path: impl AsRef<Path>) -> Self
Generate a CGI script from the associated path
build().mount("/", CGIDir::new("examples"))
Sourcepub fn clear_file_types(self) -> Self
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
Sourcepub fn set_file_type(
self,
extension: impl Into<Cow<'static, str>>,
executable: impl Into<Cow<'static, Path>>,
) -> Self
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);
Sourcepub fn only_perl(self) -> Self
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);
Sourcepub fn only_python(self) -> Self
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);
Sourcepub fn detect_python3(self) -> Self
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"))
Sourcepub fn detect_python2(self) -> Self
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"))
Sourcepub fn only_sh(self) -> Self
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);
Sourcepub fn shell_interpreter(
self,
executable: impl Into<Cow<'static, Path>>,
) -> Self
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");
Sourcepub fn add_windows_scripts(self) -> Self
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);
Sourcepub fn direct_executables(self, allow: bool) -> Self
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
Sourcepub fn unencoded_equals(self, allow: bool) -> Self
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
Sourcepub fn dot_files(self, allow: bool) -> Self
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);
Whether to allow serving hidden files
Defaults to false, only applies to Windows
Sourcepub fn setuid_files(self, allow: bool) -> Self
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
Sourcepub fn serve_get(self, allow: bool) -> Self
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);
Sourcepub fn serve_post(self, allow: bool) -> Self
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 Handler for CGIDir
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,
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,
Request
with its associated Data
should be
handled by this handler. Read moreimpl Eq for CGIDir
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> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoCollection<T> for T
impl<T> IntoCollection<T> for T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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 moreSource§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
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 bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
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>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
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 rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
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 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.
fn clear(&self) -> Painted<&T>
resetting()
due to conflicts with Vec::clear()
.
The clear()
method will be removed in a future release.Source§fn whenever(&self, value: Condition) -> Painted<&T>
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);