Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Not getting status code 200 generated when using actix-multiresponse #442

Open
TobiasDeBruijn opened this issue Jun 22, 2022 · 1 comment

Comments

@TobiasDeBruijn
Copy link
Contributor

TobiasDeBruijn commented Jun 22, 2022

Hi,

I'm encountering some strange behavior when using actix-multiresponse, with the paperclip feature enabled.

My route's function looks like this:

#[api_v2_operation(tags(v1, sensor_alert))]
pub async fn get(data: WebData, path: web::Path<Path>, session: Session) -> WebResult<Payload<proto::Alert>> { ... }

with proto::Alert being derived from a .proto file using prost:

#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "paperclip", derive(paperclip::actix::Apiv2Schema))]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Alert {
    #[prost(uint32, tag="1")]
    pub id: u32,
    ...
}

The paperclip and serde features are enabled for the proto crate here, so Apiv2Schema is derived.

The Payload struct looks like:

pub struct Payload<T: 'static + Default + Clone + PaperclipSupport>(pub T);

#[cfg(feature = "paperclip")]
pub trait PaperclipSupport: paperclip::v2::schema::Apiv2Schema + paperclip::actix::OperationModifier {}

It too has Apiv2Schema derived.

However, the generated spec omits the response entirely:

      responses:
        '400':
          description: Bad Request
        '401':
          description: Unauthorized
        '409':
          description: Conflict
        '429':
          description: Too Many Requests
        '500':
          description: Internal Server Error

I'm not getting any compiler errors, warnings or runtime warnings of any kind.

Environment

  • cargo: cargo 1.62.0-beta.2 (3f052d8ee 2022-05-12)
  • target: x86_64-unknown-linux-gnu
  • paperclip: 0.7.0
  • actix-web: 4.1.0
  • actix-multiresponse: 0.1.1
  • prost: 0.9.0
@TobiasDeBruijn
Copy link
Contributor Author

Looking in the generated spec, I do see something for Payload<T>, though it seems to ignore generics (is Apiv2Schema implemented incorrect for Payload<T>?):

  _Payload<>:
    description: |-
      Payload wrapper which facilitates the (de)serialization.
       This type can be used as both the request and response payload type.

       The proper format is chosen based on the `Content-Type` and `Accept` headers.
       When deserializing only the `Content-Type` header is used.
       When serializing, the `Accept` header is checked first, if it is missing
       the `Content-Type` header will be used. If both are missing the payload will
       default to `JSON`.

       # Errors

       When the `Content-Type` header is not provided in the request or is invalid, this will return a HTTP 400 error.
       If the `Content-Type` header, or `Accept` header is invalid when responding this will return a HTTP 400 error,
       however this is *not* done if both headers are missing on response.

       # Panics

       If during serializing no format is enabled
    type: object
    properties:
      organizations:
        type: array
        items:
          type: object
          properties:
            description:
              type: string
            id:
              type: integer
              format: int32
            name:
              type: string
          required:
            - id
            - name
    required:
      - organizations

Though the definition is never used.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant