pub struct ContentDisposition {
    pub disposition: DispositionType,
    pub parameters: Vec<DispositionParam>,
}
Expand description

A Content-Disposition header. It is compatible to be used either as a response header for the main body as (re)defined in RFC 6266, or as a header for a multipart body as (re)defined in RFC 7587.

In a regular HTTP response, the Content-Disposition response header is a header indicating if the content is expected to be displayed inline in the browser, that is, as a Web page or as part of a Web page, or as an attachment, that is downloaded and saved locally, and also can be used to attach additional metadata, such as the filename to use when saving the response payload locally.

In a multipart/form-data body, the HTTP Content-Disposition general header is a header that can be used on the subpart of a multipart body to give information about the field it applies to. The subpart is delimited by the boundary defined in the Content-Type header. Used on the body itself, Content-Disposition has no effect.

ABNF

content-disposition = "Content-Disposition" ":"
                      disposition-type *( ";" disposition-parm )

disposition-type    = "inline" | "attachment" | disp-ext-type
                      ; case-insensitive

disp-ext-type       = token

disposition-parm    = filename-parm | disp-ext-parm

filename-parm       = "filename" "=" value
                    | "filename*" "=" ext-value

disp-ext-parm       = token "=" value
                    | ext-token "=" ext-value

ext-token           = <the characters in token, followed by "*">

Note

filename is not supposed to contain any non-ASCII characters when used in a Content-Disposition HTTP response header, where filename* with charset UTF-8 may be used instead in case there are Unicode characters in file names. Filename is acceptable to be UTF-8 encoded directly in a Content-Disposition header for multipart/form-data, though.

filename must not be used within multipart/form-data.

Examples

use actix_web::http::header::{
    Charset, ContentDisposition, DispositionParam, DispositionType,
    ExtendedValue,
};

let cd1 = ContentDisposition {
    disposition: DispositionType::Attachment,
    parameters: vec![DispositionParam::FilenameExt(ExtendedValue {
        charset: Charset::Iso_8859_1, // The character set for the bytes of the filename
        language_tag: None, // The optional language tag (see `language-tag` crate)
        value: b"\xa9 Copyright 1989.txt".to_vec(), // the actual bytes of the filename
    })],
};
assert!(cd1.is_attachment());
assert!(cd1.get_filename_ext().is_some());

let cd2 = ContentDisposition {
    disposition: DispositionType::FormData,
    parameters: vec![
        DispositionParam::Name(String::from("file")),
        DispositionParam::Filename(String::from("bill.odt")),
    ],
};
assert_eq!(cd2.get_name(), Some("file")); // field name
assert_eq!(cd2.get_filename(), Some("bill.odt"));

// HTTP response header with Unicode characters in file names
let cd3 = ContentDisposition {
    disposition: DispositionType::Attachment,
    parameters: vec![
        DispositionParam::FilenameExt(ExtendedValue {
            charset: Charset::Ext(String::from("UTF-8")),
            language_tag: None,
            value: String::from("\u{1f600}.svg").into_bytes(),
        }),
        // fallback for better compatibility
        DispositionParam::Filename(String::from("Grinning-Face-Emoji.svg"))
    ],
};
assert_eq!(cd3.get_filename_ext().map(|ev| ev.value.as_ref()),
           Some("\u{1f600}.svg".as_bytes()));

Security Note

If “filename” parameter is supplied, do not use the file name blindly, check and possibly change to match local file system conventions if applicable, and do not use directory path information that may be present. See RFC 2183 §2.3.

Fields§

§disposition: DispositionType

The disposition type

§parameters: Vec<DispositionParam>

Disposition parameters

Implementations§

source§

impl ContentDisposition

source

pub fn attachment(filename: impl Into<String>) -> Self

Constructs a Content-Disposition header suitable for downloads.

Examples
use actix_web::http::header::{ContentDisposition, TryIntoHeaderValue as _};

let cd = ContentDisposition::attachment("files.zip");

let cd_val = cd.try_into_value().unwrap();
assert_eq!(cd_val, "attachment; filename=\"files.zip\"");
source

pub fn from_raw(hv: &HeaderValue) -> Result<Self, ParseError>

Parse a raw Content-Disposition header value.

source

pub fn is_inline(&self) -> bool

Returns true if type is Inline.

source

pub fn is_attachment(&self) -> bool

Returns true if type is Attachment.

source

pub fn is_form_data(&self) -> bool

Returns true if type is FormData.

source

pub fn is_ext(&self, disp_type: impl AsRef<str>) -> bool

Returns true if type is Ext and the disp_type matches.

source

pub fn get_name(&self) -> Option<&str>

Return the value of name if exists.

source

pub fn get_filename(&self) -> Option<&str>

Return the value of filename if exists.

source

pub fn get_filename_ext(&self) -> Option<&ExtendedValue>

Return the value of filename* if exists.

source

pub fn get_unknown(&self, name: impl AsRef<str>) -> Option<&str>

Return the value of the parameter which the name matches.

source

pub fn get_unknown_ext(&self, name: impl AsRef<str>) -> Option<&ExtendedValue>

Return the value of the extended parameter which the name matches.

Trait Implementations§

source§

impl Clone for ContentDisposition

source§

fn clone(&self) -> ContentDisposition

Returns a copy 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 ContentDisposition

source§

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

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

impl Display for ContentDisposition

source§

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

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

impl Header for ContentDisposition

source§

fn name() -> HeaderName

Returns the name of the header field.
source§

fn parse<T: HttpMessage>(msg: &T) -> Result<Self, ParseError>

Parse the header from a HTTP message.
source§

impl PartialEq<ContentDisposition> for ContentDisposition

source§

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

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

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

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl TryIntoHeaderValue for ContentDisposition

§

type Error = InvalidHeaderValue

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

fn try_into_value(self) -> Result<HeaderValue, Self::Error>

Try to convert value to a HeaderValue.
source§

impl Eq for ContentDisposition

source§

impl StructuralEq for ContentDisposition

source§

impl StructuralPartialEq for ContentDisposition

Auto Trait Implementations§

Blanket Implementations§

source§

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

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

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

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

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

source§

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

Mutably borrows from an owned value. Read more
source§

impl<Q, K> Equivalent<K> for Qwhere 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 Qwhere 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 Twhere 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> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere T: Clone,

§

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> ToString for Twhere T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

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

§

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 Twhere U: TryFrom<T>,

§

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> TryIntoHeaderPair for Twhere T: Header,

source§

impl<V, T> VZip<V> for Twhere V: MultiLane<T>,

source§

fn vzip(self) -> V

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