Skip to content

Add pattern matching support to Net::HTTPGenericRequest#15111

Closed
baweaver wants to merge 1 commit intoruby:masterfrom
baweaver:baweaver/net-http/request-pattern-matching
Closed

Add pattern matching support to Net::HTTPGenericRequest#15111
baweaver wants to merge 1 commit intoruby:masterfrom
baweaver:baweaver/net-http/request-pattern-matching

Conversation

@baweaver
Copy link
Contributor

@baweaver baweaver commented Nov 8, 2025

This PR adds deconstruct_keys to Net::HTTPGenericRequest, enabling pattern matching on HTTP request attributes.

Usage

case request
in method: 'POST', path: %r{^/api/}
  handle_api_request(request)
in method: 'GET', path: '/'
  handle_root
end

Implementation

• Added PATTERN_MATCHING_KEYS constant defining valid keys: method, path, uri, body, content_type
• Implemented deconstruct_keys following Ruby pattern matching best practices
• Returns only requested keys when specified, all valid keys when keys is nil

Implements deconstruct_keys to enable pattern matching on HTTP requests
based on method, path, and other request attributes.

Example:
  case request
  in method: 'POST', path: %r{^/api/}
    handle_api_request(request)
  in method: 'GET', path: '/'
    handle_root
  end
@launchable-app
Copy link

launchable-app bot commented Nov 8, 2025

8/66943 Tests Failed

test/mkmf/test_egrep_cpp.rb#test_egrep_cpp
Failure:
TestMkmfEgrepCpp#test_egrep_cpp [D:/a/ruby/ruby/src/test/mkmf/test_egrep_cpp.rb:7]:
PATH=".;D:/a/ruby/ruby/build;D:/a/ruby/ruby/build;D:/a/ruby/ruby/build;C:\hostedtoolcache\windows\Java_Temurin-Hotspot_jdk\17.0.17-10\x64\bin;C:\Users\runneradmin\AppData\Roaming\Python\Python314\Scripts;C:\hostedtoolcache\windows\Python\3.14.0\x64\Scripts;C:\hostedtoolcache\windows\Python\3.14.0\x64;C:\Users\runneradmin\scoop\shims;C:\hostedtoolcache\windows\Ruby\3.1.7\x64\bin;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.44.35207\bin\HostX64\x64;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\VC\VCPackages;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TestWindow;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\bin\Roslyn;C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64\;C:\Program Files (x86)\HTML Help Workshop;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsoft\FSharp\Tools;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Team Tools\DiagnosticsHub\Collector;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\Extensions\Microsoft\CodeCoverage.Console;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\Llvm\x64\bin;C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\\x64;C:\Program Files (x86)\Windows Kits\10\bin\\x64;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\\MSBuild\Current\Bin\amd64;C:\Windows\Microsoft.NET\Framework64\v4.0.30319;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\;C:\Users\runneradmin\scoop\shims;C:\hostedtoolcache\windows\Ruby\3.1.7\x64\bin;C:\Program Files\MongoDB\Server\7.0\bin;C:\vcpkg;C:\tools\zstd;C:\hostedtoolcache\windows\stack\3.7.1\x64;C:\cabal\bin;C:\\ghcup\bin;C:\mingw64\bin;C:\Program Files\dotnet;C:\Program Files\MySQL\MySQL Server 8.0\bin;C:\Program Files\R\R-4.5.2\bin\x64;C:\SeleniumWebDrivers\GeckoDriver;C:\SeleniumWebDrivers\EdgeDriver\;C:\SeleniumWebDrivers\ChromeDriver;C:\Program Files (x86)\sbt\bin;C:\Program Files (x86)\GitHub CLI;C:\Program Files\Git\bin;C:\Program Files (x86)\pipx_bin;C:\npm\prefix;C:\hostedtoolcache\windows\go\1.24.9\x64\bin;C:\hostedtoolcache\windows\Python\3.9.13\x64\Scripts;C:\hostedtoolcache\windows\Python\3.9.13\x64;C:\Program Files\OpenSSL\bin;C:\tools\kotlinc\bin;C:\hostedtoolcache\windows\Java_Temurin-Hotspot_jdk\17.0.17-10\x64\bin;C:\Program Files\ImageMagick-7.1.2-Q16-HDRI;C:\Program Files\Microsoft SDKs\Azure\CLI2\wbin;C:\ProgramData\kind;C:\ProgramData\Chocolatey\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\PowerShell\7\;C:\Program Files\Microsoft\Web Platform Installer\;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\;C:\Program Files\Microsoft SQL Server\150\Tools\Binn\;C:\Program Files\dotnet\;C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\;C:\Program Files (x86)\WiX Toolset v3.14\bin;C:\Program Files\Microsoft SQL Server\130\DTS\Binn\;C:\Program Files\Microsoft SQL Server\140\DTS\Binn\;C:\Program Files\Microsoft SQL Server\150\DTS\Binn\;C:\Program Files\Microsoft SQL Server\160\DTS\Binn\;C:\Program Files\Microsoft SQL Server\170\DTS\Binn\;C:\ProgramData\chocolatey\lib\pulumi\tools\Pulumi\bin;C:\Program Files\CMake\bin;C:\Strawberry\c\bin;C:\Strawberry\perl\site\bin;C:\Strawberry\perl\bin;C:\ProgramData\chocolatey\lib\maven\apache-maven-3.9.11\bin;C:\Program Files\Microsoft Service Fabric\bin\Fabric\Fabric.Code;C:\Program Files\Microsoft SDKs\Service Fabric\Tools\ServiceFabricLocalClusterManager;C:\Program Files\nodejs\;C:\Program Files\Git\cmd;C:\Program Files\Git\mingw64\bin;C:\Program Files\Git\usr\bin;C:\Program Files\GitHub CLI\;c:\tools\php;C:\Program Files (x86)\sbt\bin;C:\Program Files\Amazon\AWSCLIV2\;C:\Program Files\Amazon\SessionManagerPlugin\bin\;C:\Program Files\Amazon\AWSSAMCLI\bin\;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;C:\Program Files\mongosh\;C:\Program Files\LLVM\bin;C:\Program Files (x86)\LLVM\bin;C:\Users\runneradmin\.dotnet\tools;C:\Users\runneradmin\.cargo\bin;C:\Users\runneradmin\AppData\Local\Microsoft\WindowsApps;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsoft\CMake\Ninja;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\VC\Linux\bin\ConnectionManagerExe;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\vcpkg" LSAN_OPTIONS=detect_leaks=0 cl -nologo -E -I. -ID:/a/ruby/ruby/build/.ext/include/i386-mswin32 -ID:/a/ruby/ruby/src/include -ID:/a/ruby/ruby/src/tool/lib/test/unit -ID:/a/ruby/ruby/src/vcpkg_installed/x64-windows/include  -D_WIN32_WINNT=_WIN32_WINNT_WIN8   -MD -Zi -W2 -wd4100 -wd4127 -wd4210 -wd4214 -wd4255 -wd4574  -wd4668 -wd4710 -wd4711 -wd4820 -wd4996  -we4028 -we4142 -we4047 -we4013 -wd5287 -O2sy- -Zc:inline -Zm600   conftest.c  |
    ruby -ne 'print if /ruby_init/'
conftest.c
D:\a\ruby\ruby\src\include\ruby/internal/config.h(22): fatal error C1083: Cannot open include file: 'ruby/config.h': No such file or directory
checked program was:
/* begin */
 1: #include "ruby.h"
 2: 
 3: #ifndef WIN32_LEAN_AND_MEAN
 4: #define WIN32_LEAN_AND_MEAN
 5: #endif /* WIN32_LEAN_AND_MEAN */
 6: #ifndef WIN32
 7: #define WIN32
 8: #endif /* WIN32 */
 9: #include <winsock2.h>
10: #include <ws2tcpip.h>
11: #include <windows.h>
/* end */

.
<true> expected but was
<false>.

test/mkmf/test_have_macro.rb#test_have_macro_header
Error:
TestMkmfHaveMacro#test_have_macro_header:
Test::Unit::ProxyError: The compiler failed to generate an executable file.
You have to install development tools first.

    D:/a/ruby/ruby/src/lib/mkmf.rb:528:in 'MakeMakefile#try_do'
    D:/a/ruby/ruby/src/lib/mkmf.rb:655:in 'MakeMakefile#try_compile'
    D:/a/ruby/ruby/src/lib/mkmf.rb:955:in 'MakeMakefile#macro_defined?'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1124:in 'block in MakeMakefile#have_macro'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1070:in 'block in MakeMakefile#checking_for'
    D:/a/ruby/ruby/src/lib/mkmf.rb:370:in 'block (2 levels) in MakeMakefile::Logging.postpone'
    D:/a/ruby/ruby/src/lib/mkmf.rb:340:in 'MakeMakefile::Logging.open'
    D:/a/ruby/ruby/src/lib/mkmf.rb:370:in 'block in MakeMakefile::Logging.postpone'
    D:/a/ruby/ruby/src/lib/mkmf.rb:340:in 'MakeMakefile::Logging.open'
    D:/a/ruby/ruby/src/lib/mkmf.rb:366:in 'MakeMakefile::Logging.postpone'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1069:in 'MakeMakefile#checking_for'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1123:in 'MakeMakefile#have_macro'
    D:/a/ruby/ruby/src/test/mkmf/test_have_macro.rb:18:in 'block in TestMkmfHaveMacro#test_have_macro_header'
    D:/a/ruby/ruby/src/lib/tempfile.rb:576:in 'Tempfile.create_with_filename'
    D:/a/ruby/ruby/src/lib/tempfile.rb:562:in 'Tempfile.create'
    D:/a/ruby/ruby/src/test/mkmf/test_have_macro.rb:13:in 'TestMkmfHaveMacro#test_have_macro_header'

test/mkmf/test_have_macro.rb#test_have_macro_opt
Error:
TestMkmfHaveMacro#test_have_macro_opt:
Test::Unit::ProxyError: The compiler failed to generate an executable file.
You have to install development tools first.

    D:/a/ruby/ruby/src/lib/mkmf.rb:528:in 'MakeMakefile#try_do'
    D:/a/ruby/ruby/src/lib/mkmf.rb:655:in 'MakeMakefile#try_compile'
    D:/a/ruby/ruby/src/lib/mkmf.rb:955:in 'MakeMakefile#macro_defined?'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1124:in 'block in MakeMakefile#have_macro'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1070:in 'block in MakeMakefile#checking_for'
    D:/a/ruby/ruby/src/lib/mkmf.rb:370:in 'block (2 levels) in MakeMakefile::Logging.postpone'
    D:/a/ruby/ruby/src/lib/mkmf.rb:340:in 'MakeMakefile::Logging.open'
    D:/a/ruby/ruby/src/lib/mkmf.rb:370:in 'block in MakeMakefile::Logging.postpone'
    D:/a/ruby/ruby/src/lib/mkmf.rb:340:in 'MakeMakefile::Logging.open'
    D:/a/ruby/ruby/src/lib/mkmf.rb:366:in 'MakeMakefile::Logging.postpone'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1069:in 'MakeMakefile#checking_for'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1123:in 'MakeMakefile#have_macro'
    D:/a/ruby/ruby/src/test/mkmf/test_have_macro.rb:9:in 'TestMkmfHaveMacro#test_have_macro_opt'

test/mkmf/test_have_macro.rb#test_not_have_macro_header
Error:
TestMkmfHaveMacro#test_not_have_macro_header:
Test::Unit::ProxyError: The compiler failed to generate an executable file.
You have to install development tools first.

    D:/a/ruby/ruby/src/lib/mkmf.rb:528:in 'MakeMakefile#try_do'
    D:/a/ruby/ruby/src/lib/mkmf.rb:655:in 'MakeMakefile#try_compile'
    D:/a/ruby/ruby/src/lib/mkmf.rb:955:in 'MakeMakefile#macro_defined?'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1124:in 'block in MakeMakefile#have_macro'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1070:in 'block in MakeMakefile#checking_for'
    D:/a/ruby/ruby/src/lib/mkmf.rb:370:in 'block (2 levels) in MakeMakefile::Logging.postpone'
    D:/a/ruby/ruby/src/lib/mkmf.rb:340:in 'MakeMakefile::Logging.open'
    D:/a/ruby/ruby/src/lib/mkmf.rb:370:in 'block in MakeMakefile::Logging.postpone'
    D:/a/ruby/ruby/src/lib/mkmf.rb:340:in 'MakeMakefile::Logging.open'
    D:/a/ruby/ruby/src/lib/mkmf.rb:366:in 'MakeMakefile::Logging.postpone'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1069:in 'MakeMakefile#checking_for'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1123:in 'MakeMakefile#have_macro'
    D:/a/ruby/ruby/src/test/mkmf/test_have_macro.rb:31:in 'block in TestMkmfHaveMacro#test_not_have_macro_header'
    D:/a/ruby/ruby/src/lib/tempfile.rb:576:in 'Tempfile.create_with_filename'
    D:/a/ruby/ruby/src/lib/tempfile.rb:562:in 'Tempfile.create'
    D:/a/ruby/ruby/src/test/mkmf/test_have_macro.rb:27:in 'TestMkmfHaveMacro#test_not_have_macro_header'

test/mkmf/test_have_macro.rb#test_not_have_macro_opt
Error:
TestMkmfHaveMacro#test_not_have_macro_opt:
Test::Unit::ProxyError: The compiler failed to generate an executable file.
You have to install development tools first.

    D:/a/ruby/ruby/src/lib/mkmf.rb:528:in 'MakeMakefile#try_do'
    D:/a/ruby/ruby/src/lib/mkmf.rb:655:in 'MakeMakefile#try_compile'
    D:/a/ruby/ruby/src/lib/mkmf.rb:955:in 'MakeMakefile#macro_defined?'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1124:in 'block in MakeMakefile#have_macro'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1070:in 'block in MakeMakefile#checking_for'
    D:/a/ruby/ruby/src/lib/mkmf.rb:370:in 'block (2 levels) in MakeMakefile::Logging.postpone'
    D:/a/ruby/ruby/src/lib/mkmf.rb:340:in 'MakeMakefile::Logging.open'
    D:/a/ruby/ruby/src/lib/mkmf.rb:370:in 'block in MakeMakefile::Logging.postpone'
    D:/a/ruby/ruby/src/lib/mkmf.rb:340:in 'MakeMakefile::Logging.open'
    D:/a/ruby/ruby/src/lib/mkmf.rb:366:in 'MakeMakefile::Logging.postpone'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1069:in 'MakeMakefile#checking_for'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1123:in 'MakeMakefile#have_macro'
    D:/a/ruby/ruby/src/test/mkmf/test_have_macro.rb:23:in 'TestMkmfHaveMacro#test_not_have_macro_opt'

3 more failed tests
test/mkmf/test_signedness.rb#test_typeof_builtin
Error:
TestMkmfSignedness#test_typeof_builtin:
Test::Unit::ProxyError: The compiler failed to generate an executable file.
You have to install development tools first.

    D:/a/ruby/ruby/src/lib/mkmf.rb:528:in 'MakeMakefile#try_do'
    D:/a/ruby/ruby/src/lib/mkmf.rb:655:in 'MakeMakefile#try_compile'
    D:/a/ruby/ruby/src/lib/mkmf.rb:777:in 'MakeMakefile#try_static_assert'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1461:in 'MakeMakefile#try_signedness'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1514:in 'block in MakeMakefile#check_signedness'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1070:in 'block in MakeMakefile#checking_for'
    D:/a/ruby/ruby/src/lib/mkmf.rb:370:in 'block (2 levels) in MakeMakefile::Logging.postpone'
    D:/a/ruby/ruby/src/lib/mkmf.rb:340:in 'MakeMakefile::Logging.open'
    D:/a/ruby/ruby/src/lib/mkmf.rb:370:in 'block in MakeMakefile::Logging.postpone'
    D:/a/ruby/ruby/src/lib/mkmf.rb:340:in 'MakeMakefile::Logging.open'
    D:/a/ruby/ruby/src/lib/mkmf.rb:366:in 'MakeMakefile::Logging.postpone'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1069:in 'MakeMakefile#checking_for'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1513:in 'MakeMakefile#check_signedness'
    D:/a/ruby/ruby/src/test/mkmf/test_signedness.rb:9:in 'block (3 levels) in TestMkmfSignedness#test_typeof_builtin'
    D:/a/ruby/ruby/src/test/mkmf/base.rb:133:in 'BasicObject#instance_eval'
    D:/a/ruby/ruby/src/test/mkmf/base.rb:133:in 'TestMkmf::Base#mkmf'
    D:/a/ruby/ruby/src/test/mkmf/test_signedness.rb:9:in 'block (2 levels) in TestMkmfSignedness#test_typeof_builtin'
    D:/a/ruby/ruby/src/test/mkmf/test_signedness.rb:8:in 'Array#each'
    D:/a/ruby/ruby/src/test/mkmf/test_signedness.rb:8:in 'block in TestMkmfSignedness#test_typeof_builtin'
    D:/a/ruby/ruby/src/test/mkmf/test_signedness.rb:7:in 'Array#each'
    D:/a/ruby/ruby/src/test/mkmf/test_signedness.rb:7:in 'TestMkmfSignedness#test_typeof_builtin'

test/mkmf/test_signedness.rb#test_typeof_typedef
Error:
TestMkmfSignedness#test_typeof_typedef:
Test::Unit::ProxyError: The compiler failed to generate an executable file.
You have to install development tools first.

    D:/a/ruby/ruby/src/lib/mkmf.rb:528:in 'MakeMakefile#try_do'
    D:/a/ruby/ruby/src/lib/mkmf.rb:655:in 'MakeMakefile#try_compile'
    D:/a/ruby/ruby/src/lib/mkmf.rb:777:in 'MakeMakefile#try_static_assert'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1461:in 'MakeMakefile#try_signedness'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1514:in 'block in MakeMakefile#check_signedness'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1070:in 'block in MakeMakefile#checking_for'
    D:/a/ruby/ruby/src/lib/mkmf.rb:370:in 'block (2 levels) in MakeMakefile::Logging.postpone'
    D:/a/ruby/ruby/src/lib/mkmf.rb:340:in 'MakeMakefile::Logging.open'
    D:/a/ruby/ruby/src/lib/mkmf.rb:370:in 'block in MakeMakefile::Logging.postpone'
    D:/a/ruby/ruby/src/lib/mkmf.rb:340:in 'MakeMakefile::Logging.open'
    D:/a/ruby/ruby/src/lib/mkmf.rb:366:in 'MakeMakefile::Logging.postpone'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1069:in 'MakeMakefile#checking_for'
    D:/a/ruby/ruby/src/lib/mkmf.rb:1513:in 'MakeMakefile#check_signedness'
    D:/a/ruby/ruby/src/test/mkmf/test_signedness.rb:21:in 'block (3 levels) in TestMkmfSignedness#test_typeof_typedef'
    D:/a/ruby/ruby/src/test/mkmf/base.rb:133:in 'BasicObject#instance_eval'
    D:/a/ruby/ruby/src/test/mkmf/base.rb:133:in 'TestMkmf::Base#mkmf'
    D:/a/ruby/ruby/src/test/mkmf/test_signedness.rb:21:in 'block (2 levels) in TestMkmfSignedness#test_typeof_typedef'
    D:/a/ruby/ruby/src/test/mkmf/test_signedness.rb:16:in 'Array#each'
    D:/a/ruby/ruby/src/test/mkmf/test_signedness.rb:16:in 'block in TestMkmfSignedness#test_typeof_typedef'
    D:/a/ruby/ruby/src/test/mkmf/test_signedness.rb:15:in 'Array#each'
    D:/a/ruby/ruby/src/test/mkmf/test_signedness.rb:15:in 'TestMkmfSignedness#test_typeof_typedef'

test/rubygems/test_gem_remote_fetcher_local_ssl_server.rb#test_do_not_allow_insecure_ssl_connection_by_default

[-> View Test suite health in main branch]

@baweaver
Copy link
Contributor Author

baweaver commented Nov 9, 2025

Closed in favor of: ruby/net-http#241

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

Successfully merging this pull request may close these issues.

1 participant