{"id":16318021,"url":"https://github.com/workmanw/spring-test-bug-demo","last_synced_at":"2025-05-13T17:15:48.917Z","repository":{"id":146326109,"uuid":"382497509","full_name":"workmanw/spring-test-bug-demo","owner":"workmanw","description":null,"archived":false,"fork":false,"pushed_at":"2021-07-07T01:18:20.000Z","size":666,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-02-16T20:27:43.257Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/workmanw.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"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":"2021-07-03T01:12:50.000Z","updated_at":"2021-07-07T01:18:23.000Z","dependencies_parsed_at":"2024-03-25T06:00:42.007Z","dependency_job_id":null,"html_url":"https://github.com/workmanw/spring-test-bug-demo","commit_stats":{"total_commits":4,"total_committers":1,"mean_commits":4.0,"dds":0.0,"last_synced_commit":"6d0ae0ea7d0287158809a09b0ff8fed8f9495f97"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/workmanw%2Fspring-test-bug-demo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/workmanw%2Fspring-test-bug-demo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/workmanw%2Fspring-test-bug-demo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/workmanw%2Fspring-test-bug-demo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/workmanw","download_url":"https://codeload.github.com/workmanw/spring-test-bug-demo/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253990503,"owners_count":21995776,"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":[],"created_at":"2024-10-10T22:09:46.917Z","updated_at":"2025-05-13T17:15:48.888Z","avatar_url":"https://github.com/workmanw.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# README\n\nDemonstration for Mac OS Big Sur socket bug. \n\n- ~[spring-projects/spring-boot#27143](https://github.com/spring-projects/spring-boot/issues/27143)~\n- ~[spring-cloud/spring-cloud-contract#1678](https://github.com/spring-cloud/spring-cloud-contract/issues/1678)~\n- Change introduced by Apple 11.13.1 caused regression in CrowdStrike Falcon. Resulted in larger HTTP requests being corrupted. \n\n## Reproduction\n\nRun `mvn clean test` one or more times, and you will see the below exception. Alternatively, you can use `run-loop.sh` which will run the test ten times and print the number of failures.\n\n```shell\n2021-07-02 21:26:49.921  INFO 25652 --- [o-auto-1-exec-1] o.apache.coyote.http11.Http11Processor   : Error parsing HTTP request header\n Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.\n\njava.lang.IllegalArgumentException: Invalid character found in method name [AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0x0d0x0a--6hXCZ7NXvctrRhMdQfCslrHNTVm930eH--0x0d0x0aPOST]. HTTP method names must be tokens\n\tat org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:417) ~[tomcat-embed-core-9.0.39.jar:9.0.39]\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:261) ~[tomcat-embed-core-9.0.39.jar:9.0.39]\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.39.jar:9.0.39]\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) ~[tomcat-embed-core-9.0.39.jar:9.0.39]\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) ~[tomcat-embed-core-9.0.39.jar:9.0.39]\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.39.jar:9.0.39]\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.39.jar:9.0.39]\n\tat java.base/java.lang.Thread.run(Thread.java:829) ~[na:na]\n```\n\n## Issue\n\nThis test is uploading a 66K file as a multi-part form upload.\n\nWhat appears to be happening is that when files over 65K are uploaded this way the contents of the body in the buffer gets shifted around when it's sent over the wire. \n\nThe request body should look like this:\n\n```\nPOST /v1/demo/upload HTTP/1.1\nContent-Type: multipart/form-data;charset=UTF-8;boundary=jgV0Bpae6rNX-ZcB2FrJmBOVr8kS3yzAvq\nContent-Length: 66203\nHost: localhost:61694\nConnection: Keep-Alive\nUser-Agent: Apache-HttpClient/4.5.12 (Java/11.0.11)\nAccept-Encoding: gzip,deflate\n\n--jgV0Bpae6rNX-ZcB2FrJmBOVr8kS3yzAvq\nContent-Disposition: form-data; name=\"file\"; filename=\"SingleFile.txt\"\nContent-Type: text/plain\nContent-Length: 66000\n\nAAAAAAA...\u003c66,000x A\u003e...AAAAAAA\n--jgV0Bpae6rNX-ZcB2FrJmBOVr8kS3yzAvq--\n```\n\nHowever with this reproduction, the last portion of the body gets shifted to the beginning of the request. Looks like this:\n\n```\nAAAAAAAAAA\n--jgV0Bpae6rNX-ZcB2FrJmBOVr8kS3yzAvq--\nPOST /v1/demo/upload HTTP/1.1\nContent-Type: multipart/form-data;charset=UTF-8;boundary=jgV0Bpae6rNX-ZcB2FrJmBOVr8kS3yzAvq\nContent-Length: 66203\nHost: localhost:61694\nConnection: Keep-Alive\nUser-Agent: Apache-HttpClient/4.5.12 (Java/11.0.11)\nAccept-Encoding: gzip,deflate\n\n--jgV0Bpae6rNX-ZcB2FrJmBOVr8kS3yzAvq\nContent-Disposition: form-data; name=\"file\"; filename=\"SingleFile.txt\"\nContent-Type: text/plain\nContent-Length: 66000\n\nAAAAAAAAAAA...\u003c66,000x A\u003e...\n```\n\nThe above results in a malformed HTTP request that Tomcat is unable to parse. This results in the `Invalid character found in method name` error observed above.\n\nThis can be further observed by placing a breakpoint in `Http11InputBuffer::parseRequestLine` and watching contents of the `byteBuffer` as it's read from the socket.\n\n![screenshot 1](docs/screenshot-1.png)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fworkmanw%2Fspring-test-bug-demo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fworkmanw%2Fspring-test-bug-demo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fworkmanw%2Fspring-test-bug-demo/lists"}