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

Multipart validation #969

Closed
vhmoura opened this issue Jul 18, 2023 · 6 comments
Closed

Multipart validation #969

vhmoura opened this issue Jul 18, 2023 · 6 comments
Labels

Comments

@vhmoura
Copy link

vhmoura commented Jul 18, 2023

Hi,

How do we validate a request that contains a json body and multiform data (an image for example)?

I can't find any matcher for it.

Thanks,
V

@StefH
Copy link
Collaborator

StefH commented Jul 19, 2023

Currently there is no special logic to parse a multipart and match the parts. I'll need to think on this how to could be added and how this could be used.

@StefH StefH added feature and removed question labels Jul 19, 2023
@StefH
Copy link
Collaborator

StefH commented Jul 25, 2023

@vhmoura
I'm working on this, you can try a preview version 1.5.32-ci-17662.

(https://github.com/WireMock-Net/WireMock.Net/wiki/MyGet-preview-versions)

Use it like:

            var textPlainContentTypeMatcher = new ContentTypeMatcher("text/plain");
            var textPlainContentMatcher = new ExactMatcher("This is some plain text");
            var textPlainMatcher = new MimePartMatcher(MatchBehaviour.AcceptOnMatch, textPlainContentTypeMatcher, null, null, textPlainContentMatcher);

            var partTextJsonContentTypeMatcher = new ContentTypeMatcher("text/json");
            var partTextJsonContentMatcher = new JsonMatcher(new { Key = "Value" }, true);
            var partTextMatcher = new MimePartMatcher(MatchBehaviour.AcceptOnMatch, partTextJsonContentTypeMatcher, null, null, partTextJsonContentMatcher);

            var imagePngContentTypeMatcher = new ContentTypeMatcher("image/png");
            var imagePngContentDispositionMatcher = new ExactMatcher("attachment; filename=\"image.png\"");
            var imagePngContentTransferEncodingMatcher = new ExactMatcher("base64");
            var imagePngContentMatcher = new ExactObjectMatcher(Convert.FromBase64String("iVBORw0KGgoAAAANSUhEUgAAAAIAAAACAgMAAAAP2OW3AAAADFBMVEX/tID/vpH/pWX/sHidUyjlAAAADElEQVR4XmMQYNgAAADkAMHebX3mAAAAAElFTkSuQmCC"));
            var imagePngMatcher = new MimePartMatcher(MatchBehaviour.AcceptOnMatch, imagePngContentTypeMatcher, imagePngContentDispositionMatcher, imagePngContentTransferEncodingMatcher, imagePngContentMatcher);

            var matchers = new IMatcher[]
            {
                textPlainMatcher,
                partTextMatcher,
                imagePngMatcher
            };

            server
                .Given(Request.Create()
                    .WithPath("/multipart")
                    .UsingPost()
                    .WithMultiPart(matchers)
                )
                .WithGuid("b9c82182-e469-41da-bcaf-b6e3157fefdb")
                .RespondWith(Response.Create()
                    .WithBody("MultiPart is ok")
                );

Or in JSON:

{
    "Guid": "b9c82182-e469-41da-bcaf-b6e3157fefdb",
    "UpdatedAt": "2023-07-24T18:12:55.564978Z",
    "Request": {
        "Path": {
            "Matchers": [
                {
                    "Name": "WildcardMatcher",
                    "Pattern": "/multipart",
                    "IgnoreCase": false
                }
            ]
        },
        "Methods": [
            "POST"
        ],
        "Body": {
            "Matchers": [
                {
                    "ContentTypeMatcher": {
                        "Name": "ContentTypeMatcher",
                        "Pattern": "text/plain",
                        "IgnoreCase": false
                    },
                    "ContentMatcher": {
                        "Name": "ExactMatcher",
                        "Pattern": "This is some plain text",
                        "IgnoreCase": false
                    },
                    "Name": "MimePartMatcher"
                },
                {
                    "ContentTypeMatcher": {
                        "Name": "ContentTypeMatcher",
                        "Pattern": "text/json",
                        "IgnoreCase": false
                    },
                    "ContentMatcher": {
                        "Name": "JsonMatcher",
                        "Pattern": {
                            "Key": "Value"
                        },
                        "IgnoreCase": true
                    },
                    "Name": "MimePartMatcher"
                },
                {
                    "ContentTypeMatcher": {
                        "Name": "ContentTypeMatcher",
                        "Pattern": "image/png",
                        "IgnoreCase": true
                    },
                    "ContentDispositionMatcher": {
                        "Name": "ExactMatcher",
                        "Pattern": "attachment; filename=\"image.png\"",
                        "IgnoreCase": true
                    },
                    "ContentTransferEncodingMatcher": {
                        "Name": "ExactMatcher",
                        "Pattern": "base64",
                        "IgnoreCase": true
                    },
                    "ContentMatcher": {
                        "Name": "ExactObjectMatcher",
                        "Pattern": "iVBORw0KGgoAAAANSUhEUgAAAAIAAAACAgMAAAAP2OW3AAAADFBMVEX/tID/vpH/pWX/sHidUyjlAAAADElEQVR4XmMQYNgAAADkAMHebX3mAAAAAElFTkSuQmCC"
                    },
                    "Name": "MimePartMatcher"
                }
            ],
            "MatchOperator": "Or"
        }
    },
    "Response": {
        "BodyDestination": "SameAsSource",
        "Body": "MultiPart is ok"
    }
}

@StefH
Copy link
Collaborator

StefH commented Jul 31, 2023

@vhmoura
Did you have time to check that specific preview version?

@StefH
Copy link
Collaborator

StefH commented Aug 3, 2023

@vhmoura
Did you have time to check that specific preview version?

It would really help if you can try this version before I merge to this main and create a new official version.

@vhmoura
Copy link
Author

vhmoura commented Aug 3, 2023

Hi. I didn’t. Sorry I was quite busy making loads of tests but based on what you are showing looks ok to me.

@StefH
Copy link
Collaborator

StefH commented Aug 3, 2023

#981

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

No branches or pull requests

2 participants