{"id":20773892,"url":"https://github.com/simonmittag/mse6","last_synced_at":"2025-10-29T19:50:37.710Z","repository":{"id":40616423,"uuid":"261312223","full_name":"simonmittag/mse6","owner":"simonmittag","description":"mse6 is a mock HTTP/TLS server for integration tests and edge cases. It supports slow HTTP responses, bad content encoding, sudden crashes, network termination and other abnormal behaviour that is otherwise difficult to observe or reproduce under test conditions.","archived":false,"fork":false,"pushed_at":"2025-04-28T11:30:19.000Z","size":364,"stargazers_count":15,"open_issues_count":2,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-28T12:39:56.460Z","etag":null,"topics":["bad-code","bad-idea","bad-ideas","chaos-engineering","chaos-monkey","cicd","continuous-integration","http","http-server","https","integration-testing","slowhttptest","slowmotion","testing","testing-tools","tls","unit-testing","websockets"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/simonmittag.png","metadata":{"files":{"readme":"ReadMe.Md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-05-04T22:48:27.000Z","updated_at":"2025-04-28T11:30:22.000Z","dependencies_parsed_at":"2024-06-19T01:29:19.923Z","dependency_job_id":"5c1bb795-8299-4573-978c-733bdd7d3859","html_url":"https://github.com/simonmittag/mse6","commit_stats":null,"previous_names":[],"tags_count":47,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simonmittag%2Fmse6","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simonmittag%2Fmse6/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simonmittag%2Fmse6/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simonmittag%2Fmse6/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/simonmittag","download_url":"https://codeload.github.com/simonmittag/mse6/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251729558,"owners_count":21634279,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bad-code","bad-idea","bad-ideas","chaos-engineering","chaos-monkey","cicd","continuous-integration","http","http-server","https","integration-testing","slowhttptest","slowmotion","testing","testing-tools","tls","unit-testing","websockets"],"created_at":"2024-11-17T12:27:37.145Z","updated_at":"2025-10-29T19:50:37.644Z","avatar_url":"https://github.com/simonmittag.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"![](mse6.png)\n\nmse6 is designed to test the resilience of your http client. It's a mock HTTP/TLS server that responds with \nabnormal behaviour such as slow HTTP responses, bad content encoding, sudden crashes, network termination \nthat are otherwise difficult to consistently reproduce under test conditions. \n\n[![Circleci Builds](https://circleci.com/gh/simonmittag/mse6.svg?style=shield)](https://circleci.com/gh/simonmittag/mse6)\n[![Github Workflows](https://github.com/simonmittag/mse6/workflows/Go/badge.svg)](https://github.com/simonmittag/mse6/actions)\n[![Github Issues](https://img.shields.io/github/issues/simonmittag/mse6)](https://github.com/simonmittag/mse6/issues)\n[![Github Activity](https://img.shields.io/github/commit-activity/m/simonmittag/mse6)](https://img.shields.io/github/commit-activity/m/simonmittag/mse6)  \n[![Go Report](https://goreportcard.com/badge/github.com/simonmittag/mse6)](https://goreportcard.com/report/github.com/simonmittag/mse6)\n[![Codeclimate Maintainability](https://api.codeclimate.com/v1/badges/362bc41f687169d50e6b/maintainability)](https://codeclimate.com/github/simonmittag/mse6/maintainability)\n[![Codeclimate Test Coverage](https://api.codeclimate.com/v1/badges/362bc41f687169d50e6b/test_coverage)](https://codeclimate.com/github/simonmittag/mse6/test_coverage)\n[![Go Version](https://img.shields.io/github/go-mod/go-version/simonmittag/jabba)](https://img.shields.io/github/go-mod/go-version/simonmittag/jabba)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n[![Docker Pulls](https://img.shields.io/docker/pulls/simonmittag/mse6)](https://img.shields.io/docker/pulls/simonmittag/mse6)\n[![Docker Image Size](https://img.shields.io/docker/image-size/simonmittag/mse6?sort=date)](https://img.shields.io/docker/image-size/simonmittag/mse6?sort=date)\n[![Version](https://img.shields.io/badge/version-0.5.1-orange)](https://github.com/simonmittag/mse6/releases/tag/v0.5.1)\n\n## Up and running\n### Docker\n```\ndocker pull simonmittag/mse6 \u0026\u0026\n  docker run -p8081:8081 simonmittag/mse6\n```\n\n### Homebrew\n```\nbrew tap simonmittag/cli \u0026\u0026\n  brew install mse6 \u0026\u0026\n  mse6\n```\n\n### Golang\n```bash\ngo install github.com/simonmittag/mse6/cmd/mse6 \u0026\u0026 \n  mse6\n```\n\n## Usage\n```\nλ mse6 -h\n  Usage of mse6:\n    -p int\n      \tthe http port (default 8081)\n    -s self-signed ssl mode\n    -t\tserver self test\n    -u string\n    \tthe path prefix (default \"/mse6/\")\n    -v\tprint the server version\n```\n\n## Routes\n`GET /mse6/badcontentlength`\nSends invalid content length header, too large for response\n\n`GET /mse6/badgzip`\nSends a response gzip content encoding header and garbled binary\n\n`GET /mse6/brotli`\nSends a response with br content encoding header and brotli encoded binary response\n\n`CONNECT /mse6/connect?body=true`\nSends a HTTP 200 OK response to the HTTP connect method. Has no bearing on network connection other than standard keepalive.\nWill send (illegal) body if body=true\n\n`GET /mse6/choose`\nSends a HTTP response to the client with one of the following content encodings: `br`, `gzip`, `deflate` or `identity` \nContent encoding preference is in above order and depends on values found in `Accept-Encoding` header found on request. \n\n`GET /mse6/chunked`\nSends a chunked HTTP/1.1 response to the client\n\n`DELETE /mse6/delete`\nStandard json response with status code 204\n\n`GET /mse6/deflate`\nsends a deflate encoded response\n\n`GET /mse6/echoheader`\nechoes all request headers sent on response body for testing\n\n`GET /mse6/echoquery`\nechoes all query string values sent with request on response body for testing\n\n`GET /mse6/echoport`\nsends a response with the http port the server is listening on\n\n`GET /mse6/formget`\nsimulates a form GET by echoing the raw request\n\n`POST /mse6/formpost`\nsimulates a form POST by echoing the raw request. Supports both `Content-Type: application/x-www-form-urlencoded`\nand `Content-Type: multipart/form-data`\n\n`GET /mse6/get`\nStandard json response with status code 200\n\n`HEAD /mse6/getorhead?cl=y`\n`GET /mse6/getorhead`\nSends a HTTP HEAD response or a GET response, depending on request method.\nIf query param cl is appended with any value, the Content-Length header of \nthe body otherwise sent by GET is also included in the HEAD response\n\n`GET /mse6/gzip`\nSends a gzipped response with proper content encoding\n\n`GET /mse6/hangupduringheader`\nSends a partial header only response, waits 2s, then closes the TCP connection.\n\n`GET /mse6/hangupafterheader`\nSends a complete header only response message , waits 2s, then closes the TCP connection.\n\n`GET /mse6/hangupduringbody`\nSends a complete header message, then some of the body, waits 2s, then closes the TCP connection.\n\n`GET /mse6/jwks`\nsends a list of RS256 Jwks keys\n\n`GET /mse6/jwksmix`\nsends a list of mixed algorithm Jwks keys\n\n`GET /mse6/jwkses256`\nsends a JWKS key of type ES256\n\n`GET /mse6/jwksbad`\nsends illegally formatted Jwks key\n\n`GET /mse6/jwksrotate`\nsends a rotating Jwks keys that change arbitrarily.\n\n`GET /mse6/jwksbadrotate?rc=0`\nsends a rotating Jwks key that alternates every request. Sends malformed keys. Stateful method, reset good behaviour with rc=0\n\n`GET /mse6/nocontentenc`\nSends a HTTP response without a content encoding header set\n\n`OPTIONS /mse6/options?code=n\u0026body=true`\nSends a HTTP OPTIONS response as per RFC7231, section 4.3.7. Contains Allow headers and a status code.\nLegal status codes are 200 and 204, the rest is undefined. Will send (illegal) body if body=true\n\n`PATCH /mse6/patch`\nStandard json response with status code 200\n\n`POST /mse6/post`\nStandard json response with status code 201\n\n`PUT /mse6/put`\nStandard json response with status code 200\n\n`GET /mse6/send?code=nnn\u0026url=http%3A%2F%2Fwww.google.com`\nSends arbitrary response code between 100 and 999. For redirects, you can supply a custom\nlocation parameter. Don't forget to URL encode your params.\n\n`GET /mse6/slowheader?wait=n`\nSends headers but only after waiting for n seconds. \nAlternatively configure default with -w=n on cli\n\n`GET /mse6/slowbody?wait=n`\nSends body after initial lag of n/2s, then sends remaining body without chunking after n/2s. \nAlternatively configure default with -w=n on cli\n\n`TRACE /mse6/trace`\nStandard json response with status code 200 and \"message/http\" content type.\nSends boilerplate trace response in body, not actual request echo.\n\n`GET /mse6/tiny`\nTiny JSON response with content encoding identity\n\n`GET /mse6/tinygzip`\nTiny JSON response with content encoding gzip\n\n`GET /mse6/unknowncontentenc`\nSends unknown content-encoding header with json response.\n\n\n`GET /mse6/websocket?n=1\u0026c=true\u0026c1=true\u0026c2=true`\nUpgrade the client connection to a HTTP/1.1 websocket that echoes messages sent to it.\nSpecify n for how often the echo should repeat. Specify c to orderly close the connection\nfrom the server side after sending all echo responses. Specify c1 to only send websocket\nprotocol close. Specify c2 to only hang up on TCP connection, without respecting websocket protocol.\n\n## Contributions\nThe mse6 team welcomes all [contributors](https://github.com/simonmittag/mse6/blob/master/CONTRIBUTING.md). Everyone interacting with the project's codebase, issue trackers, chat rooms and mailing lists\nis expected to follow the [code of conduct](https://github.com/simonmittag/mse6/blob/master/CODE_OF_CONDUCT.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsimonmittag%2Fmse6","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsimonmittag%2Fmse6","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsimonmittag%2Fmse6/lists"}