From: Tomas Doran Date: Tue, 1 Dec 2009 01:08:22 +0000 (+0000) Subject: Merge 'trunk' into 'param_filtering' X-Git-Tag: 5.80025~12 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=cc8a4eb9a08483f5fe80f674d19c612acc12a94d;hp=-c Merge 'trunk' into 'param_filtering' r10824@t0mlaptop (orig r10823): autarch | 2009-07-07 21:58:31 +0100 Deleted the old Restarter and associated code. Also removed the dep on File::Modified r10831@t0mlaptop (orig r10830): t0m | 2009-07-08 21:11:57 +0100 U R DOIN IT WRONG. r10836@t0mlaptop (orig r10835): t0m | 2009-07-08 23:12:29 +0100 More ->config fixes + Changelog r10852@t0mlaptop (orig r10851): t0m | 2009-07-11 13:51:07 +0100 Less lies in the deprecated block comment in Dispatcher.pm as it's throwing people off r10862@t0mlaptop (orig r10861): groditi | 2009-07-11 23:07:47 +0100 private_path method for actions that returns a string suitable for use in forward and unit tests for the rest of catalyst::Action r10865@t0mlaptop (orig r10864): t0m | 2009-07-12 01:56:51 +0100 Fix test r10866@t0mlaptop (orig r10865): t0m | 2009-07-12 01:57:19 +0100 Refactor to remove warning r10885@t0mlaptop (orig r10884): t0m | 2009-07-14 21:25:03 +0100 Fix Makefile.PL to actually do the right thing on Lepoard (alledgedly), and encourage someone to contribute to maintaining our protection against Apple :) r10892@t0mlaptop (orig r10891): dandv | 2009-07-16 02:12:59 +0100 Fixed POD links to get and request r10893@t0mlaptop (orig r10892): dandv | 2009-07-16 06:24:10 +0100 Could not have made a more insignificant patch r10898@t0mlaptop (orig r10897): t0m | 2009-07-16 22:05:25 +0100 Special move for CX::Component::Traits. No tests, please don't look. r10899@t0mlaptop (orig r10898): t0m | 2009-07-16 22:12:49 +0100 Remove 10897, this hack kinda works, but then leads to more issues. Gonna branch r10900@t0mlaptop (orig r10899): t0m | 2009-07-16 22:24:11 +0100 Write that down r10915@t0mlaptop (orig r10914): dandv | 2009-07-17 06:18:22 +0100 Hyperlinked POD entry for Catalysy::Request->args r10941@t0mlaptop (orig r10940): jester | 2009-07-22 13:46:29 +0100 Changed link from C::Base to C::Controller; fixed my alias r10962@t0mlaptop (orig r10961): hobbs | 2009-07-23 05:46:43 +0100 Depend on Module::Pluggable 3.9 to resolve a bug with inner packages in tests. r10963@t0mlaptop (orig r10962): hobbs | 2009-07-23 10:32:08 +0100 Test and Changelog entry for r10961. r10981@t0mlaptop (orig r10980): t0m | 2009-07-25 22:05:19 +0100 Remove dead and unused method r10985@t0mlaptop (orig r10984): autarch | 2009-07-26 03:14:23 +0100 fix spelling of attributes in the test name r10986@t0mlaptop (orig r10985): dandv | 2009-07-26 08:13:19 +0100 Fixed a bunch of POD hyperlinks in Catalyst.pm and minor punctuation in Catalyst::Action r10994@t0mlaptop (orig r10993): kmx | 2009-07-28 16:26:44 +0100 C::Engine::FastCGI (_fix_env) - Microsoft IIS on Windows 2008 R2 has version string "IIS/7.5" that was not supported; this patch makes test condition more general, accepting versions from IIS/6.0 to IIS/9.9 (should be enough for a while) r10995@t0mlaptop (orig r10994): hobbs | 2009-07-29 01:33:25 +0100 Rewrite the POD for $c->uri_for(). Reintroduce some bits of information that were lost in 5.7->5.8, and remove a misleading statement about $c->action. Recommend the use of uri_for_action with a private action path. r10996@t0mlaptop (orig r10995): hobbs | 2009-07-29 01:59:19 +0100 Update Changes and add me to Contributors r10997@t0mlaptop (orig r10996): hobbs | 2009-07-29 02:06:09 +0100 Add konobi to contributors r10998@t0mlaptop (orig r10997): hobbs | 2009-07-29 02:35:11 +0100 Changes entry for r10993 r11009@t0mlaptop (orig r11008): t0m | 2009-07-30 15:31:26 +0100 Add to TODO so I don't have to grep backlog later when I have tuits r11013@t0mlaptop (orig r11012): t0m | 2009-07-31 02:46:00 +0100 Large TODO update r11019@t0mlaptop (orig r11018): t0m | 2009-08-01 01:39:39 +0100 Merge branch pass_component_names: svn merge -r 10899:10927 http://dev.catalyst.perl.org/repos/Catalyst/Catalyst-Runtime/5.80/branches/pass_component_names r11021@t0mlaptop (orig r11020): t0m | 2009-08-01 03:00:23 +0100 Aww, crap, fail. merge 10927:HEAD from pass_component_names r11024@t0mlaptop (orig r11023): caelum | 2009-08-01 20:04:08 +0100 allow uri_for($controller_instance) r11035@t0mlaptop (orig r11034): t0m | 2009-08-05 20:39:01 +0100 Require perl 5.8.6 r11038@t0mlaptop (orig r11037): hobbs | 2009-08-06 10:57:02 +0100 Add a method to the stats object to get the request start time. r11048@t0mlaptop (orig r11047): t0m | 2009-08-07 01:15:04 +0100 Fix the perl version required there also r11049@t0mlaptop (orig r11048): t0m | 2009-08-07 01:24:17 +0100 Blow up if we're in author mode and don't have the right M::I extensions r11050@t0mlaptop (orig r11049): t0m | 2009-08-07 01:57:21 +0100 Bump MX::MA dep for anon class tests r11058@t0mlaptop (orig r11057): gbjk | 2009-08-07 17:45:03 +0100 DispatchType::Chained fix for default args attribute to handle Args(0) vs Args() at depth. r11059@t0mlaptop (orig r11058): gbjk | 2009-08-07 18:17:15 +0100 DispatchType::Chained fix failing test of Args(0) vs Args(0) on surface r11062@t0mlaptop (orig r11061): gbjk | 2009-08-07 22:17:22 +0100 Engine::HTTP - Fix paths for HTTP requests with scheme and domain in URI. r11064@t0mlaptop (orig r11063): groditi | 2009-08-08 22:54:04 +0100 make debug output prettier with large widths r11065@t0mlaptop (orig r11064): groditi | 2009-08-08 22:54:46 +0100 oops debug output got leaked in r11069@t0mlaptop (orig r11068): t0m | 2009-08-09 13:36:20 +0100 Fix RT#48555 r11070@t0mlaptop (orig r11069): t0m | 2009-08-09 13:36:55 +0100 Updates changelog r11071@t0mlaptop (orig r11070): t0m | 2009-08-09 15:22:21 +0100 Rewrite fixes for RT#48555 r11123@t0mlaptop (orig r11122): t0m | 2009-08-11 22:49:37 +0100 Unfuck Catalyst::View::JSON r11125@t0mlaptop (orig r11124): t0m | 2009-08-11 23:32:47 +0100 Apply patch from RT#48623 to fix headers in Engine::HTTP r11127@t0mlaptop (orig r11126): rjbs | 2009-08-12 00:33:18 +0100 svn merge -r 11123:11125 branches/locate_components/ trunk/ r11128@t0mlaptop (orig r11127): rjbs | 2009-08-12 00:34:12 +0100 add changelog entry for merged locate_components branch r11130@t0mlaptop (orig r11129): t0m | 2009-08-12 01:15:51 +0100 Tiny change to make the error make more sense r11132@t0mlaptop (orig r11131): t0m | 2009-08-12 02:09:09 +0100 Split test out into a more proper app, so that the test no longer relies on the metaclass initialization hacking occurring in ->setup_component, as I want to move it r11133@t0mlaptop (orig r11132): t0m | 2009-08-12 02:11:07 +0100 Blow up rather than failing to call ->can if everything is totally screwed r11134@t0mlaptop (orig r11133): rafl | 2009-08-12 03:54:52 +0100 Fix POD refering to CGI::Cookie. We're using CGI::Simple::Cookie. Courtesy of Forrest Cahoon. r11135@t0mlaptop (orig r11134): t0m | 2009-08-12 12:03:06 +0100 Make the code much clearer about what is going on, and remove the horrible map and grep which I hated. r11140@t0mlaptop (orig r11139): rafl | 2009-08-16 10:19:58 +0100 Do at least one (possibly empty) write when reading the response body from a filehandle. r11145@t0mlaptop (orig r11144): jshirley | 2009-08-17 22:33:17 +0100 Adding and documented X-Forwarded-Port r11146@t0mlaptop (orig r11145): t0m | 2009-08-17 23:08:19 +0100 Capitalisation fixes in Changelog r11147@t0mlaptop (orig r11146): t0m | 2009-08-17 23:11:34 +0100 Add _component_name stuff to Changes r11148@t0mlaptop (orig r11147): jshirley | 2009-08-17 23:13:05 +0100 Conflict resolution r11149@t0mlaptop (orig r11148): hobbs | 2009-08-17 23:24:46 +0100 Changelog for r11037 r11150@t0mlaptop (orig r11149): t0m | 2009-08-18 00:14:38 +0100 Switch to catalyst_component_name r11154@t0mlaptop (orig r11153): ferz | 2009-08-18 07:55:14 +0100 Test case using Exception::Class r11155@t0mlaptop (orig r11154): ferz | 2009-08-18 12:19:40 +0100 drop POD comments. r11166@t0mlaptop (orig r11165): t0m | 2009-08-19 20:03:01 +0100 Move test to make more sense in my idea of the naming scheme - t/dead_ is for tests which check the app pukes, which this shouldn't r11167@t0mlaptop (orig r11166): t0m | 2009-08-19 20:04:59 +0100 Fail commit was fail. Back out the part I didn't want r11168@t0mlaptop (orig r11167): t0m | 2009-08-19 20:10:06 +0100 Remove r11058 - the commit message is lies, it does not fix the TODO test r11169@t0mlaptop (orig r11168): t0m | 2009-08-19 21:21:44 +0100 Back out r11057 which breaks one of the chained tests, whilst not fixing the bug in question r11170@t0mlaptop (orig r11169): t0m | 2009-08-19 21:29:16 +0100 Clean up test app for the exception test, as we don't want to depend on Test::Class thanks r11171@t0mlaptop (orig r11170): rafl | 2009-08-19 21:45:45 +0100 Changelog Engine::finalize_body changes. r11181@t0mlaptop (orig r11180): gbjk | 2009-08-21 14:07:54 +0100 Changelog update for previous Catalyst::Engine::HTTP fix. r11182@t0mlaptop (orig r11181): rafl | 2009-08-21 16:51:26 +0100 Now we don't have the broken restarter engine anymore, we conflict with old Catalyst::Devel versions, that don't have the new restarter yet. r11183@t0mlaptop (orig r11182): rafl | 2009-08-21 17:12:57 +0100 Conflict with the latest mason view, which blows up because of the new component_name constructor arg. r11184@t0mlaptop (orig r11183): rafl | 2009-08-21 17:13:05 +0100 Version 5.80008. r11190@t0mlaptop (orig r11189): t0m | 2009-08-21 20:54:58 +0100 Fix and tests for big issue in 5.80008 r11191@t0mlaptop (orig r11190): rafl | 2009-08-21 21:28:30 +0100 Version 5.80009. r11193@t0mlaptop (orig r11192): rafl | 2009-08-21 21:55:25 +0100 DOH! do more than one read, if necessary. r11194@t0mlaptop (orig r11193): rafl | 2009-08-21 22:22:36 +0100 Do what we want instead of exiting a sub via last. r11195@t0mlaptop (orig r11194): rafl | 2009-08-21 22:22:45 +0100 Add test for sending the body from a filehandle with more data than the default chunksize of 64k. r11196@t0mlaptop (orig r11195): rafl | 2009-08-21 22:31:38 +0100 Changelogging. r11197@t0mlaptop (orig r11196): rafl | 2009-08-21 22:41:05 +0100 Version 5.80010. r11215@t0mlaptop (orig r11214): rafl | 2009-08-22 20:56:53 +0100 Remove leftovers of the restarter engine. The removed code caused test failures, which weren't apparent due to installed copies still being available in everyone's @INC. r11218@t0mlaptop (orig r11217): rafl | 2009-08-23 12:46:42 +0100 Changelogging. r11219@t0mlaptop (orig r11218): rafl | 2009-08-23 12:55:48 +0100 Version 5.80011. r11221@t0mlaptop (orig r11220): rafl | 2009-08-23 19:42:17 +0100 Failing test for component loading r11233@t0mlaptop (orig r11232): t0m | 2009-08-24 13:51:03 +0100 Test fixes for if CATALYST_DEBUG is set to 1. r11239@t0mlaptop (orig r11238): t0m | 2009-08-25 12:25:54 +0100 0003-Remove-diag-message.patch (marcus) r11240@t0mlaptop (orig r11239): t0m | 2009-08-25 12:26:15 +0100 Fix duplicate components r11252@t0mlaptop (orig r11251): frew | 2009-08-26 20:00:01 +0100 Look! I'm famous! (See Catalyst-Devel) r11254@t0mlaptop (orig r11253): dandv | 2009-08-27 01:56:26 +0100 POD addition: $c->req->body returns a string or a File::Temp object r11278@t0mlaptop (orig r11277): t0m | 2009-09-01 02:07:23 +0100 Nuke skipped test which will never pass r11279@t0mlaptop (orig r11278): t0m | 2009-09-01 02:07:47 +0100 Author tests r11280@t0mlaptop (orig r11279): t0m | 2009-09-01 02:09:29 +0100 t/author in MANFEST r11281@t0mlaptop (orig r11280): t0m | 2009-09-01 02:10:46 +0100 Stop remote tests breaking everything, and force authors to run some remote tests. r11282@t0mlaptop (orig r11281): t0m | 2009-09-01 02:11:33 +0100 Stop calling class data methods on instances + commented out warning r11283@t0mlaptop (orig r11282): t0m | 2009-09-01 02:11:45 +0100 Changelog r11300@t0mlaptop (orig r11292): t0m | 2009-09-01 15:11:05 +0100 Bump versions back to 5.8.4 r11301@t0mlaptop (orig r11293): t0m | 2009-09-01 15:32:46 +0100 Changes tweaks r11307@t0mlaptop (orig r11299): t0m | 2009-09-02 03:03:58 +0100 Changelogging r11361@t0mlaptop (orig r11331): t0m | 2009-09-07 15:45:01 +0100 Fix hash key name back to what it used to be for compat, keeping renamed accessor where it was. Tests for this breakage to follow r11363@t0mlaptop (orig r11333): t0m | 2009-09-07 21:19:40 +0100 Test for r11331 + fix to only report each action name once from get_action_methods r11364@t0mlaptop (orig r11334): t0m | 2009-09-07 21:21:52 +0100 I'm an idiot, that totally doesn't work. remove. r11365@t0mlaptop (orig r11335): t0m | 2009-09-07 21:25:53 +0100 AGH. Too tired to be doing this, fucked it up again r11366@t0mlaptop (orig r11336): t0m | 2009-09-07 21:33:31 +0100 Fix duplicate results from get_action_methods. Q. Why didn't I just do that first time round? A: Am idiot. r11369@t0mlaptop (orig r11339): marcus | 2009-09-09 18:05:32 +0100 un-TODO passing TODO tests r11370@t0mlaptop (orig r11340): marcus | 2009-09-09 18:08:03 +0100 Prepare for release r11374@t0mlaptop (orig r11344): groditi | 2009-09-09 22:06:59 +0100 add myself to contributors r11375@t0mlaptop (orig r11345): t0m | 2009-09-10 01:13:56 +0100 Fix warnings in upcoming moose r11377@t0mlaptop (orig r11347): t0m | 2009-09-10 02:14:13 +0100 r11046@t0mlaptop (orig r11045): yousef | 2009-08-07 00:07:07 +0100 Moved action methods from t/lib/TestApp.pm to t/lib/Test/Controller/Root.pm. Uncommented the if statement in lib/Catalyst/Controller.pm that checks for actions in the appclass. r11378@t0mlaptop (orig r11348): t0m | 2009-09-10 02:20:55 +0100 Eat the merge mark, svk hates me. r11379@t0mlaptop (orig r11349): t0m | 2009-09-10 03:13:04 +0100 Blargh. Merge branch deprecate_appclass_actions manually, with svn merge http://dev.catalyst.perl.org/repos/Catalyst/Catalyst-Runtime/5.80/trunk http://dev.catalyst.perl.org/repos/Catalyst/Catalyst-Runtime/5.80/branches/deprecate_appclass_actions . after I forgot -l on svk push, but ctrl-C after the first rev meant svk had already committed a merge mark and re-merging did nothing, and removing it didn't do the right thing. Fail cake.. r11380@t0mlaptop (orig r11350): hobbs | 2009-09-10 08:20:31 +0100 Rework the C<< $c->go >> documentation a little, hopefully it's more clear. r11382@t0mlaptop (orig r11352): autarch | 2009-09-11 03:48:29 +0100 Preserve immutable_options when temporarily making a class mutable r11383@t0mlaptop (orig r11353): t0m | 2009-09-11 09:18:09 +0100 Work with old and new Moose r11393@t0mlaptop (orig r11363): autarch | 2009-09-14 19:37:25 +0100 The warning about a class having mutable ancestors has been removed (and was never in a non-dev Moose release) r11396@t0mlaptop (orig r11366): t0m | 2009-09-15 21:48:19 +0100 Remove what is now lies from Changes. Bump all the deps which need to be bumped to not crap warnings everywhere r11399@t0mlaptop (orig r11369): t0m | 2009-09-16 18:14:29 +0100 Changelog r11400@t0mlaptop (orig r11370): t0m | 2009-09-16 18:15:52 +0100 Now we depend on latest Moose we are certain to have immutable options r11401@t0mlaptop (orig r11371): t0m | 2009-09-17 09:52:34 +0100 -short is dead, RT#49771 r11402@t0mlaptop (orig r11372): t0m | 2009-09-17 09:52:52 +0100 Add note about actions in appclass being deprecated r11403@t0mlaptop (orig r11373): t0m | 2009-09-17 09:54:45 +0100 Add note about ::[MVC]:: warnings r11404@t0mlaptop (orig r11374): t0m | 2009-09-17 09:58:15 +0100 Re-space current release changelog to align with the rest. Move -short changelog to the right place. r11405@t0mlaptop (orig r11375): rafl | 2009-09-17 10:33:28 +0100 Version 5.80013. r11407@t0mlaptop (orig r11377): t0m | 2009-09-17 14:32:16 +0100 Well, that got forgotten, oops r11426@t0mlaptop (orig r11396): rafl | 2009-09-20 15:01:45 +0100 Fix a syntax error in the ContextClosure pod. r11427@t0mlaptop (orig r11397): rafl | 2009-09-20 15:01:51 +0100 Use clean instead of autoclean in the ContextClosure synopsis until we've fixed the issues with that and MXMA. r11428@t0mlaptop (orig r11398): gbjk | 2009-09-21 15:05:17 +0100 - Fix go / visit expecting captures and arguments in reverse order. r11429@t0mlaptop (orig r11399): mateu | 2009-09-21 19:57:14 +0100 Update $c->forward and $c->state documentation to address scalar context. r11430@t0mlaptop (orig r11400): t0m | 2009-09-23 15:48:06 +0100 Dep bump r11452@t0mlaptop (orig r11422): t0m | 2009-09-25 13:03:50 +0100 Remove warnings for using Catalyst::Dispatcher->dispatch_types r11459@t0mlaptop (orig r11429): t0m | 2009-09-27 13:27:41 +0100 Optional test not optional for authors r11460@t0mlaptop (orig r11430): t0m | 2009-09-27 13:33:05 +0100 Make r11422 not break stuff - idiot :( r11487@t0mlaptop (orig r11457): t0m | 2009-10-05 22:59:47 +0100 r11483@t0mlaptop (orig r11453): abraxxa | 2009-10-05 12:57:34 +0100 Improved the suggested fix warning when component resolution uses regex fallback for fully qualified component names. Added disable_component_resolution_regex_fallback config option to switch off regex fallback for component resolution. r11488@t0mlaptop (orig r11458): t0m | 2009-10-05 22:59:52 +0100 r11486@t0mlaptop (orig r11456): t0m | 2009-10-05 22:59:01 +0100 Tidy up changelog/attribution r11503@t0mlaptop (orig r11468): ilmari | 2009-10-06 16:30:41 +0100 Set ->request on the response object i Catalyst::Test::local_request--This line, and those below, will be ignored-- M t/unit_load_catalyst_test.t M lib/Catalyst/Test.pm M Changes r11519@t0mlaptop (orig r11484): phaylon | 2009-10-07 18:21:47 +0100 added stub config section (incl TODO) to Cat.pm for things like 'current_view' r11548@t0mlaptop (orig r11513): caelum | 2009-10-12 17:18:22 +0100 fix uninitialized warning in ACL r11549@t0mlaptop (orig r11514): caelum | 2009-10-12 17:22:08 +0100 better fix for uninitialized warning r11550@t0mlaptop (orig r11515): t0m | 2009-10-12 18:10:32 +0100 Less cargo cult madness r11554@t0mlaptop (orig r11519): caelum | 2009-10-13 15:37:02 +0100 more correct fix for uninitialized warning from ACL r11556@t0mlaptop (orig r11521): dhoss | 2009-10-14 01:14:42 +0100 Snow Leopard uses COPYFILE_DISABLE r11557@t0mlaptop (orig r11522): dhoss | 2009-10-14 01:20:06 +0100 fixed regex for next mac codename/version, will have to actually figure out what the 10.7 codename is when it arrives r11558@t0mlaptop (orig r11523): dhoss | 2009-10-14 01:23:45 +0100 Attempted to make the error message more obvious r11561@t0mlaptop (orig r11526): dhoss | 2009-10-14 01:50:26 +0100 fixed error message for mac osx 10.7 r11568@t0mlaptop (orig r11533): hobbs | 2009-10-15 03:32:28 +0100 Give people a pointer to chase if they're looking for info on $c->req->user r11574@t0mlaptop (orig r11539): t0m | 2009-10-15 22:19:26 +0100 Add docs I promised for r11484 r11622@t0mlaptop (orig r11587): jshirley | 2009-10-16 21:06:19 +0100 The longawaited nginx patch to support non-root apps, and some pod r11623@t0mlaptop (orig r11588): jshirley | 2009-10-16 21:07:29 +0100 Changes for nginx patches r11624@t0mlaptop (orig r11589): jshirley | 2009-10-16 21:08:55 +0100 My favorite color is clear and I like to eat rocks r11670@t0mlaptop (orig r11635): t0m | 2009-10-19 18:02:59 +0100 Remove warnings from duplicate action declerations r11675@t0mlaptop (orig r11640): poisonbit | 2009-10-20 21:12:46 +0100 Example added to #Actions_in_your_application_class r11676@t0mlaptop (orig r11641): poisonbit | 2009-10-20 21:32:41 +0100 Formating (a lost space and line break) r11677@t0mlaptop (orig r11642): poisonbit | 2009-10-20 21:34:45 +0100 More regresion from 11640, correcting parentheses and endpoint. r11678@t0mlaptop (orig r11643): poisonbit | 2009-10-20 22:08:47 +0100 Change in actions inside roles. http://bobtfish.livejournal.com/264317.html r11679@t0mlaptop (orig r11644): poisonbit | 2009-10-20 23:16:03 +0100 Fixes to pass podchecker OK r11714@t0mlaptop (orig r11679): rafl | 2009-10-28 23:54:56 +0000 Enable Catalyst::Utils::home() to find home within Dist::Zilla built dists. Courtesy of nperez. r11716@t0mlaptop (orig r11681): t0m | 2009-10-29 00:43:07 +0000 Make URI a link to make it super obvious r11796@t0mlaptop (orig r11761): t0m | 2009-11-05 00:11:15 +0000 Need newer LWP for tests to pass as suggested on list by Jose Luis Martinez r11811@t0mlaptop (orig r11776): altreus | 2009-11-06 17:09:51 +0000 Add doc for no-args call to ->uri_for r11813@t0mlaptop (orig r11778): dhoss | 2009-11-06 17:13:27 +0000 fixed options passed to devel server so that author tests pass r11814@t0mlaptop (orig r11779): altreus | 2009-11-06 17:14:49 +0000 Amend doc to not mention using undef in ->uri_for r11816@t0mlaptop (orig r11781): t0m | 2009-11-07 16:50:59 +0000 Back out change from -port to -l - svn merge -r 11778:11777 r11823@t0mlaptop (orig r11788): rafl | 2009-11-09 22:21:19 +0000 Make request->body fail when used as a writer. r11824@t0mlaptop (orig r11789): t0m | 2009-11-10 19:51:33 +0000 Fix changelog, me-- r11825@t0mlaptop (orig r11790): t0m | 2009-11-10 19:56:09 +0000 Warn on case_sensitive being set, remove documentation r11827@t0mlaptop (orig r11792): t0m | 2009-11-10 21:36:06 +0000 Return 1, only currently works by chance r11828@t0mlaptop (orig r11793): t0m | 2009-11-10 21:37:26 +0000 Also retarded r11829@t0mlaptop (orig r11794): t0m | 2009-11-10 21:41:27 +0000 And lets not change behaviour with the log flush change.. r11836@t0mlaptop (orig r11801): t0m | 2009-11-12 01:12:05 +0000 Bring the changelog up to date. r11839@t0mlaptop (orig r11804): t0m | 2009-11-12 01:44:46 +0000 r11462@t0mlaptop (orig r11432): rafl | 2009-09-27 16:06:26 +0100 More aggregated tests. r11463@t0mlaptop (orig r11433): rafl | 2009-09-27 16:06:36 +0100 Fix a couple of aggregation warnings. r11464@t0mlaptop (orig r11434): rafl | 2009-09-27 16:06:51 +0100 More aggregation. r11465@t0mlaptop (orig r11435): rafl | 2009-09-27 16:28:04 +0100 Make things run again with aggregation disabled. r11838@t0mlaptop (orig r11803): t0m | 2009-11-12 01:39:56 +0000 Patch up changes to tests into new location. This merges parts of the following commits which were missed by svk: -r11456:11457 http://dev.catalyst.perl.org/repos/Catalyst/Catalyst-Runtime/5.80/trunk -r11467:11468 http://dev.catalyst.perl.org/repos/Catalyst/Catalyst-Runtime/5.80/trunk r11841@t0mlaptop (orig r11806): bricas | 2009-11-12 17:58:02 +0000 remove duplicate changelog entry r11847@t0mlaptop (orig r11812): t0m | 2009-11-12 23:57:15 +0000 r11668@t0mlaptop (orig r11633): t0m | 2009-10-19 17:53:27 +0100 Branch for uri encoding things in uri_for in some way that means you can round trip path parts like '24/7', but without totally breaking backward compatibility this time hopefully. r11669@t0mlaptop (orig r11634): t0m | 2009-10-19 17:54:08 +0100 Well, this fixes my current issue, and doesn't seem to break any tests.. This likely means that the tests are still shit r11769@t0mlaptop (orig r11734): t0m | 2009-11-04 19:17:33 +0000 Needed for authors to run optional http test r11833@t0mlaptop (orig r11798): t0m | 2009-11-12 00:22:06 +0000 Tests, fix args as well as captureargs and be less violent - only encode / r11840@t0mlaptop (orig r11805): rafl | 2009-11-12 16:08:57 +0000 trailing whitespace r11843@t0mlaptop (orig r11808): t0m | 2009-11-12 23:41:17 +0000 Tidy up a bit r11845@t0mlaptop (orig r11810): t0m | 2009-11-12 23:46:28 +0000 Changelog r11846@t0mlaptop (orig r11811): t0m | 2009-11-12 23:56:36 +0000 Don't fail the live tests by only looking for http://localhost/etc.. r11858@t0mlaptop (orig r11823): t0m | 2009-11-14 17:26:04 +0000 Pod patch r11860@t0mlaptop (orig r11825): t0m | 2009-11-14 17:30:26 +0000 Pod fixes re RT#51489 r11914@t0mlaptop (orig r11879): rafl | 2009-11-17 23:00:32 +0000 Merge branch 'exception_interface' * exception_interface: Use MooseX::Role::WithOverloading. Add Exception::Interface and Exception::Basic. Make ::Base, ::Go and ::Detach use them. Create branch exception_interface r11953@t0mlaptop (orig r11918): t0m | 2009-11-19 21:58:59 +0000 Add Pod for all the new exception classes r11954@t0mlaptop (orig r11919): t0m | 2009-11-19 22:00:27 +0000 Rename http server test as it is not optional for authors r11978@t0mlaptop (orig r11943): rafl | 2009-11-20 06:22:44 +0000 Fix a doc typo. Also trim some trailing whitespace. r11979@t0mlaptop (orig r11944): rafl | 2009-11-20 06:22:51 +0000 Remove some docs for Exception::Go and ::Detach. Users really shouldn't care. r11980@t0mlaptop (orig r11945): rafl | 2009-11-20 07:05:08 +0000 Depend on MX::Role::WithOverloading 0.03 to make sure things work out on 5.8.8 and older. r11986@t0mlaptop (orig r11951): rafl | 2009-11-21 01:30:07 +0000 Remove duplicate changelog entry. r11987@t0mlaptop (orig r11952): rafl | 2009-11-21 01:43:12 +0000 Improve Exception::Interface docs. r11988@t0mlaptop (orig r11953): rafl | 2009-11-21 01:43:28 +0000 More changelogging. r11989@t0mlaptop (orig r11954): rafl | 2009-11-21 01:43:57 +0000 Refer to the right ticket in Changes. r11990@t0mlaptop (orig r11955): rafl | 2009-11-21 02:31:02 +0000 Version 5.80014. r11996@t0mlaptop (orig r11961): zby | 2009-11-21 13:03:43 +0000 warning for plugins inheriting from Catayst::Component r11998@t0mlaptop (orig r11963): t0m | 2009-11-22 12:57:30 +0000 Chop out that crap, not needed r11999@t0mlaptop (orig r11964): t0m | 2009-11-22 13:01:09 +0000 Do not be @ISA Controller, that's hideous dumb and now warns r12000@t0mlaptop (orig r11965): t0m | 2009-11-22 13:01:48 +0000 Do not use NEXT, like it says in the comments r12001@t0mlaptop (orig r11966): t0m | 2009-11-22 13:04:50 +0000 Fix unicode issues in CGI and FastCGI engines r12002@t0mlaptop (orig r11967): t0m | 2009-11-22 13:08:47 +0000 Changelog, adjust warning text, bump versions for a dev release. The 'we do get Class::C3::Adopt::NEXT warnings test is now broken, no idea why, will look later. r12003@t0mlaptop (orig r11968): t0m | 2009-11-22 19:42:30 +0000 Different phrasing for different versions r12004@t0mlaptop (orig r11969): t0m | 2009-11-22 19:53:00 +0000 Whoops, fix typo r12005@t0mlaptop (orig r11970): t0m | 2009-11-22 19:58:31 +0000 It actually wants 'true', make that more explicit r12006@t0mlaptop (orig r11971): t0m | 2009-11-22 19:59:04 +0000 release 5.80014_01 r12008@t0mlaptop (orig r11973): t0m | 2009-11-22 20:08:28 +0000 Notabs is author only r12009@t0mlaptop (orig r11974): t0m | 2009-11-22 20:11:17 +0000 Pod tests are also author only r12010@t0mlaptop (orig r11975): t0m | 2009-11-22 20:13:06 +0000 Changelog r12013@t0mlaptop (orig r11978): t0m | 2009-11-23 21:25:19 +0000 Don't do bytes::length, just use length, tests to demonstrate the issue r12014@t0mlaptop (orig r11979): t0m | 2009-11-23 21:45:55 +0000 Nasty hack for fastcgi, fixes gitalist r12021@t0mlaptop (orig r11986): t0m | 2009-11-23 22:57:40 +0000 Have a new conflict statement r12035@t0mlaptop (orig r12000): t0m | 2009-11-24 09:50:07 +0000 Trivial Pod fixes r12055@t0mlaptop (orig r12020): t0m | 2009-11-26 01:07:08 +0000 Remove test spraff r12057@t0mlaptop (orig r12022): t0m | 2009-11-26 01:21:22 +0000 Back out 11979 until I work out why IPC::Run is getting hold of the FCGI file handle r12070@t0mlaptop (orig r12035): t0m | 2009-11-26 21:29:32 +0000 Fix test on bleadperl RT#52100 r12095@t0mlaptop (orig r12060): gshank | 2009-11-27 22:43:11 +0000 testcase for Chained bug - dispatches to wrong action r12108@t0mlaptop (orig r12073): rafl | 2009-11-29 16:43:17 +0000 Depend on a recent leakchecker to stop everything from crapping over itself if PadWalker is too old. r12110@t0mlaptop (orig r12075): t0m | 2009-11-29 17:16:40 +0000 r11583@nc10 (orig r10642): dhoss | 2009-06-24 22:18:13 +0100 created better scripts branch r11584@nc10 (orig r10643): dhoss | 2009-06-24 22:21:03 +0100 initial script commit r11585@nc10 (orig r10644): dhoss | 2009-06-24 23:56:42 +0100 initial ScriptRunner checkin r11588@nc10 (orig r10647): dhoss | 2009-06-25 01:54:12 +0100 added a test application to get the new scripts working created Catalyst::ScriptRunner, Catalyst::Script::* got Catalyst::Script::FastCGI running wrote a test for Catalyst::Script::FastCGI, but it fails for some reason r11590@nc10 (orig r10649): dhoss | 2009-06-25 02:10:57 +0100 added dev_server test, poked Catalyst::Script::Create r11591@nc10 (orig r10650): dhoss | 2009-06-25 02:21:18 +0100 fixed test server, blech r11592@nc10 (orig r10651): dhoss | 2009-06-25 02:28:41 +0100 pulled crap out of testapp_server r11593@nc10 (orig r10652): dhoss | 2009-06-25 02:41:39 +0100 fixed server start r11594@nc10 (orig r10653): dhoss | 2009-06-25 03:03:00 +0100 fixed Server and testapp_server.pl. Test still wonky r11595@nc10 (orig r10654): dhoss | 2009-06-25 03:15:18 +0100 poked at t/start_dev_server.t corrected Server to start with HTTP not CGI r11597@nc10 (orig r10656): dhoss | 2009-06-25 03:30:41 +0100 updated testapp_cgi.pl updated CGI r11598@nc10 (orig r10657): dhoss | 2009-06-25 04:11:14 +0100 added more to Test, added testapp_test, and worked on start_fcgi r11604@nc10 (orig r10663): dhoss | 2009-06-25 11:37:12 +0100 updated Makefil.PL r11624@nc10 (orig r10683): dhoss | 2009-06-26 20:46:17 +0100 updated so that if their class doesn't load, we use ours. r11650@nc10 (orig r10709): dhoss | 2009-06-28 21:33:41 +0100 added name to contributors list r11660@nc10 (orig r10719): t0m | 2009-06-29 00:12:11 +0100 Kind of, sort of make the server work, except it doesn't r11685@nc10 (orig r10744): dhoss | 2009-06-30 19:28:47 +0100 fixed Server r11726@nc10 (orig r10785): dhoss | 2009-07-04 01:41:40 +0100 help option now has a short option r11727@nc10 (orig r10786): dhoss | 2009-07-04 01:44:15 +0100 fork now has a short option r11728@nc10 (orig r10787): dhoss | 2009-07-04 01:45:19 +0100 listen now has a short option r11729@nc10 (orig r10788): dhoss | 2009-07-04 01:49:39 +0100 doez haz pidfile short opt r11730@nc10 (orig r10789): dhoss | 2009-07-04 01:51:12 +0100 doez haz keepalive short opt r11731@nc10 (orig r10790): dhoss | 2009-07-04 01:51:35 +0100 changed pf => pid r11732@nc10 (orig r10791): dhoss | 2009-07-04 01:53:16 +0100 background now has a short opshun r11733@nc10 (orig r10792): dhoss | 2009-07-04 01:54:29 +0100 restart has short option r11734@nc10 (orig r10793): dhoss | 2009-07-04 01:56:16 +0100 restart_delay HAZ OPSHUN r11735@nc10 (orig r10794): dhoss | 2009-07-04 01:57:11 +0100 restart regex has a short option r11736@nc10 (orig r10795): dhoss | 2009-07-04 01:58:02 +0100 follow_symlinks has short option r11737@nc10 (orig r10796): dhoss | 2009-07-04 03:01:44 +0100 Updated testapp_server broke Script::Server, why?! r11738@nc10 (orig r10797): dhoss | 2009-07-04 03:57:13 +0100 added namespace::autoclean to all the helper classes removed a redundant use Catalyst::Engine::HTTP r11739@nc10 (orig r10798): dhoss | 2009-07-04 04:25:25 +0100 added warn to setup. sigh. doesn't appear it's getting called, unless i'm way off. r11740@nc10 (orig r10799): dhoss | 2009-07-04 04:27:41 +0100 untarded! r11741@nc10 (orig r10800): dhoss | 2009-07-04 04:28:15 +0100 really untarded r11778@nc10 (orig r10837): dhoss | 2009-07-11 00:27:12 +0100 removed except meta stuff since we're using autoclean r11779@nc10 (orig r10838): dhoss | 2009-07-11 01:06:53 +0100 fixed Catalyst::Script::Server so app doesn't have to be a cmd line opt r11780@nc10 (orig r10839): dhoss | 2009-07-11 01:14:43 +0100 removed all required => 0 r11781@nc10 (orig r10840): dhoss | 2009-07-11 01:18:23 +0100 removed "broken" commetn r11782@nc10 (orig r10841): dhoss | 2009-07-11 01:19:41 +0100 removed debug warn r11783@nc10 (orig r10842): dhoss | 2009-07-11 01:31:58 +0100 removed default => 0s r11784@nc10 (orig r10843): dhoss | 2009-07-11 01:34:54 +0100 added debug option r11785@nc10 (orig r10844): dhoss | 2009-07-11 02:50:11 +0100 fasterized r11786@nc10 (orig r10845): dhoss | 2009-07-11 03:21:41 +0100 added restarter code r11787@nc10 (orig r10846): dhoss | 2009-07-11 03:24:02 +0100 fixed follow_symlinks option in restarter code r11788@nc10 (orig r10847): dhoss | 2009-07-11 03:33:44 +0100 cleaned up sub runner r11793@nc10 (orig r10852): t0m | 2009-07-11 19:10:02 +0100 Strip trailing spaces r11801@nc10 (orig r10860): autarch | 2009-07-11 20:32:11 +0100 Get the restarter running r11809@nc10 (orig r10868): t0m | 2009-07-12 18:15:09 +0100 Too slow r11810@nc10 (orig r10869): t0m | 2009-07-12 18:27:36 +0100 And unfuck so the app name is passed properly r11831@nc10 (orig r10890): dhoss | 2009-07-15 22:41:11 +0100 -d and --debug work for me r11834@nc10 (orig r10893): dhoss | 2009-07-16 10:25:47 +0100 added Deploy prototype r11843@nc10 (orig r10902): dhoss | 2009-07-17 01:52:56 +0100 untarded and added documentation r11844@nc10 (orig r10903): dhoss | 2009-07-17 01:53:38 +0100 don't need -except => [ qw(meta) ] with autoclean r11845@nc10 (orig r10904): dhoss | 2009-07-17 02:00:54 +0100 added documentation, surely needs refining r11846@nc10 (orig r10905): dhoss | 2009-07-17 02:01:25 +0100 removed -except => qw[meta] r11847@nc10 (orig r10906): dhoss | 2009-07-17 02:04:12 +0100 cleaned up r11848@nc10 (orig r10907): dhoss | 2009-07-17 02:12:07 +0100 added documentation r11849@nc10 (orig r10908): dhoss | 2009-07-17 02:13:28 +0100 fasterized r11850@nc10 (orig r10909): dhoss | 2009-07-17 02:15:04 +0100 added MX::Types::Moose r11851@nc10 (orig r10910): dhoss | 2009-07-17 02:24:44 +0100 added MX::Types::Moose, cleaned up moar r11852@nc10 (orig r10911): dhoss | 2009-07-17 02:43:29 +0100 created proof of working app r11853@nc10 (orig r10912): dhoss | 2009-07-17 02:44:07 +0100 removed proof of working tests r11966@nc10 (orig r11025): dhoss | 2009-08-04 01:00:57 +0100 removed MooseX::Command::* stuff for now r11967@nc10 (orig r11026): dhoss | 2009-08-04 01:01:43 +0100 removed MooseX::App::CMD* stuff from ScriptRunner r11968@nc10 (orig r11027): dhoss | 2009-08-04 01:22:27 +0100 split helper into app generation helper and component generation helper (initial split, at least) r11976@nc10 (orig r11035): dhoss | 2009-08-05 21:07:12 +0100 had this stuff in the wrong branch, blech r12162@nc10 (orig r11221): dhoss | 2009-08-23 21:32:34 +0100 added command directory structure for MooseX::App::Cmd r12236@nc10 (orig r11295): t0m | 2009-09-02 01:48:38 +0100 r11288@t0mlaptop: t0m | 2009-09-02 00:26:10 +0100 Remove unused TestApp r12237@nc10 (orig r11296): t0m | 2009-09-02 01:48:43 +0100 r11289@t0mlaptop: t0m | 2009-09-02 00:33:55 +0100 Remove DBIC deploy script, this should not be in core runtime r12238@nc10 (orig r11297): t0m | 2009-09-02 01:48:47 +0100 r11290@t0mlaptop: t0m | 2009-09-02 01:09:31 +0100 Remove empty directories r12239@nc10 (orig r11298): t0m | 2009-09-02 01:48:54 +0100 r11291@t0mlaptop: t0m | 2009-09-02 01:14:00 +0100 Factor stuff out into a script role, clean up all the script code r12254@nc10 (orig r11313): t0m | 2009-09-05 16:16:00 +0100 r11320@tomas-dorans-macbook-pro: t0m | 2009-09-05 12:38:54 +0100 Fix passing correct key, re-add getopt trait as this is needed, my bad r12255@nc10 (orig r11314): t0m | 2009-09-05 16:16:04 +0100 r11321@tomas-dorans-macbook-pro: t0m | 2009-09-05 12:42:20 +0100 Make ScriptRunner include the lib path. r12256@nc10 (orig r11315): t0m | 2009-09-05 16:16:08 +0100 r11322@tomas-dorans-macbook-pro: t0m | 2009-09-05 12:47:39 +0100 Fix FastCGI script r12257@nc10 (orig r11316): t0m | 2009-09-05 16:16:13 +0100 r11323@tomas-dorans-macbook-pro: t0m | 2009-09-05 12:48:58 +0100 Fix CGI script r12258@nc10 (orig r11317): t0m | 2009-09-05 16:16:15 +0100 r11324@tomas-dorans-macbook-pro: t0m | 2009-09-05 12:56:01 +0100 Add a short TODO list to complete before this branch is merged r12259@nc10 (orig r11318): t0m | 2009-09-05 16:16:20 +0100 r11325@tomas-dorans-macbook-pro: t0m | 2009-09-05 12:57:21 +0100 Default run methods not required, can be provided by the role r12260@nc10 (orig r11319): t0m | 2009-09-05 16:16:25 +0100 r11326@tomas-dorans-macbook-pro: t0m | 2009-09-05 13:00:17 +0100 Documentation dinks r12261@nc10 (orig r11320): t0m | 2009-09-05 16:16:30 +0100 r11327@tomas-dorans-macbook-pro: t0m | 2009-09-05 13:01:00 +0100 Gawd, that is out of date r12262@nc10 (orig r11321): t0m | 2009-09-05 16:16:33 +0100 r11328@tomas-dorans-macbook-pro: t0m | 2009-09-05 13:06:34 +0100 More POD r12263@nc10 (orig r11322): t0m | 2009-09-05 16:16:37 +0100 r11329@tomas-dorans-macbook-pro: t0m | 2009-09-05 13:08:41 +0100 We need to depend on MX::Types, and ::StashChange not needed any more r12264@nc10 (orig r11323): t0m | 2009-09-05 16:16:41 +0100 r11330@tomas-dorans-macbook-pro: t0m | 2009-09-05 13:09:11 +0100 We also need autoclean r12265@nc10 (orig r11324): t0m | 2009-09-05 16:16:48 +0100 r11331@tomas-dorans-macbook-pro: t0m | 2009-09-05 13:43:25 +0100 Basic tests for ScriptRunner, more needed r12320@nc10 (orig r11379): t0m | 2009-09-17 22:47:22 +0100 Skeleton testapp for testing the args thrown to the run method by scripts r12321@nc10 (orig r11380): t0m | 2009-09-17 23:10:46 +0100 Meh, that shows what I mean. This can be done waaaay more elegantly by abstracting the testing logic.. r12377@nc10 (orig r11436): zts | 2009-09-27 20:12:39 +0100 Further tests for Server script option parsing. Also, first pass at abstracting the test logic. Currently very ugly. r12402@nc10 (orig r11461): t0m | 2009-10-05 23:17:11 +0100 And start the app correctly(ish) under the restarter - really not sure args are perserved correctly? r12908@nc10 (orig r11777): dhoss | 2009-11-06 17:12:25 +0000 fixed dev server options so that test now passes r12911@nc10 (orig r11780): dhoss | 2009-11-06 17:25:35 +0000 unfucked test server options and made test pass f'real this time r13011@nc10 (orig r11880): t0m | 2009-11-18 00:51:29 +0000 Beat somewhat into shape by comparing the old and new docs. Need to write basic tests for the other scripts. r13052@nc10 (orig r11921): t0m | 2009-11-19 22:23:58 +0000 Move to aggregate r13053@nc10 (orig r11922): t0m | 2009-11-19 23:32:24 +0000 Unified help display, at the cost of having lost the info about what you fucked up. Neither of these are particularly helpful, but this is at least uniform r13054@nc10 (orig r11923): t0m | 2009-11-19 23:48:42 +0000 Cleanup and some moar tests r13055@nc10 (orig r11924): t0m | 2009-11-20 00:00:02 +0000 More tests for help, proving it's still bork r13056@nc10 (orig r11925): t0m | 2009-11-20 00:13:53 +0000 Basic tests for fcgi script r13057@nc10 (orig r11926): t0m | 2009-11-20 00:44:35 +0000 Fix script_test.pl r13058@nc10 (orig r11927): t0m | 2009-11-20 00:45:13 +0000 Pass Pod coverage r13059@nc10 (orig r11928): t0m | 2009-11-20 01:00:24 +0000 Nested TAP and Test::Aggregate don't play nice together. It was cute, but screw it, sorry zts r13060@nc10 (orig r11929): t0m | 2009-11-20 01:01:47 +0000 Fugly test for myapp_test.pl. If someone fancies rewriting the IO redirection to be less gross then I loveyoulongtime r13061@nc10 (orig r11930): t0m | 2009-11-20 01:07:04 +0000 Update todo on this branch r13123@nc10 (orig r11992): t0m | 2009-11-23 23:40:57 +0000 Fix duplicate short options issue r13124@nc10 (orig r11993): t0m | 2009-11-23 23:43:32 +0000 Chomp trailing space r13125@nc10 (orig r11994): t0m | 2009-11-23 23:49:10 +0000 And do that in a way which actually works r13126@nc10 (orig r11995): t0m | 2009-11-23 23:56:49 +0000 Fix test r13127@nc10 (orig r11996): t0m | 2009-11-24 00:15:45 +0000 Add tests for the create script and fix the bugs that this shows up r13146@nc10 (orig r12015): t0m | 2009-11-25 22:32:11 +0000 Fix warnings from ScriptRunner r13147@nc10 (orig r12016): t0m | 2009-11-25 22:51:28 +0000 Fix big bug in test r13148@nc10 (orig r12017): t0m | 2009-11-26 00:25:01 +0000 Get useful help about which option you fucked up back r13149@nc10 (orig r12018): t0m | 2009-11-26 00:35:31 +0000 Remove most of the horrible r13150@nc10 (orig r12019): t0m | 2009-11-26 01:02:52 +0000 Tidy up help and TODO tests r13161@nc10 (orig r12030): t0m | 2009-11-26 01:53:20 +0000 Fix up docs r13162@nc10 (orig r12031): t0m | 2009-11-26 02:23:00 +0000 Factor restarter arg assembly out into it's own routine for ease of testing. Use $self->ARGV instead of $ARGV r13165@nc10 (orig r12034): t0m | 2009-11-26 21:02:57 +0000 Fix typo, bricas++, add simple test for restarter arguments r13175@nc10 (orig r12044): t0m | 2009-11-26 23:40:27 +0000 Pass app name into constructor r13185@nc10 (orig r12054): t0m | 2009-11-27 02:08:33 +0000 Bump version in runtime branch r13192@nc10 (orig r12061): t0m | 2009-11-28 12:38:12 +0000 Adding the files you need for the tests you've committed helps them pass, idiot :) r13194@nc10 (orig r12063): rafl | 2009-11-29 14:00:12 +0000 Depend on a new CMOP because we rely on its new load_class error messages. r13195@nc10 (orig r12064): rafl | 2009-11-29 14:00:19 +0000 Make follow_symlinks more consistent with the other restarter args. r13196@nc10 (orig r12065): rafl | 2009-11-29 14:00:25 +0000 Properly validate restart regexen. r13197@nc10 (orig r12066): rafl | 2009-11-29 14:00:31 +0000 Tidy up some attr definitions. r13198@nc10 (orig r12067): rafl | 2009-11-29 14:00:38 +0000 Port numbers need to be > 0. r13199@nc10 (orig r12068): rafl | 2009-11-29 14:00:43 +0000 Remove useless lexical. r13200@nc10 (orig r12069): rafl | 2009-11-29 14:00:51 +0000 Less trailing whitespace. r13201@nc10 (orig r12070): rafl | 2009-11-29 15:33:48 +0000 This is not a release. r13202@nc10 (orig r12071): rafl | 2009-11-29 15:33:55 +0000 Tidy things up a little and fix pod usage. r12121@t0mlaptop (orig r12086): t0m | 2009-11-30 22:59:15 +0000 Require new M::I r12126@t0mlaptop (orig r12091): t0m | 2009-12-01 00:09:19 +0000 r12113@t0mlaptop (orig r12078): t0m | 2009-11-30 18:25:57 +0000 Branch for path_info fixes. This may be short lived, but worth doing.. r12114@t0mlaptop (orig r12079): t0m | 2009-11-30 18:26:34 +0000 Commit miyagawa's fix for PATH_INFO decoding. I think that this also implies changes / fixes in the fcgi _fix_env stuff r12116@t0mlaptop (orig r12081): t0m | 2009-11-30 20:44:16 +0000 And yea, these test cases now pass r12118@t0mlaptop (orig r12083): t0m | 2009-11-30 21:02:14 +0000 I think the nginx hackery can just die with the new code in ::Engine::CGI r12119@t0mlaptop (orig r12084): t0m | 2009-11-30 22:05:41 +0000 Back out r12083, also clarify the docs - like this works for me now, and the bottom para seems the wrong way round...? r12122@t0mlaptop (orig r12087): t0m | 2009-11-30 23:17:33 +0000 Require new HTTP::Request::AsCGI r12124@t0mlaptop (orig r12089): t0m | 2009-11-30 23:23:38 +0000 Rewrite changelog entry to be more complete r12127@t0mlaptop (orig r12092): t0m | 2009-12-01 00:52:57 +0000 TODO out gshanks chained tests r12128@t0mlaptop (orig r12093): t0m | 2009-12-01 00:54:23 +0000 Bump deps and changelog for another dev release with new scripts and scary path resolving changes so I can have another call to test. --- cc8a4eb9a08483f5fe80f674d19c612acc12a94d diff --combined lib/Catalyst.pm index 4db4a69,fbad850..9e74bee --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@@ -4,7 -4,6 +4,6 @@@ use Moose use Moose::Meta::Class (); extends 'Catalyst::Component'; use Moose::Util qw/find_meta/; - use bytes; use B::Hooks::EndOfScope (); use Catalyst::Exception; use Catalyst::Exception::Detach; @@@ -27,11 -26,12 +26,12 @@@ use URI::https use Tree::Simple qw/use_weak_refs/; use Tree::Simple::Visitor::FindByUID; use Class::C3::Adopt::NEXT; + use List::MoreUtils qw/uniq/; use attributes; use utf8; use Carp qw/croak carp shortmess/; - BEGIN { require 5.008001; } + BEGIN { require 5.008004; } has stack => (is => 'ro', default => sub { [] }); has stash => (is => 'rw', default => sub { {} }); @@@ -78,7 -78,7 +78,7 @@@ __PACKAGE__->stats_class('Catalyst::Sta # Remember to update this in Catalyst::Runtime as well! - our $VERSION = '5.80007'; + our $VERSION = '5.80014_02'; { my $dev_version = $VERSION =~ /_\d{2}$/; @@@ -335,9 -335,11 +335,11 @@@ call to forward $c->forward(qw/MyApp::Model::DBIC::Foo do_stuff/); $c->forward('MyApp::View::TT'); - Note that forward implies an C<> around the call (actually - C does), thus de-fatalizing all 'dies' within the called - action. If you want C to propagate you need to do something like: + Note that L<< forward|/"$c->forward( $action [, \@arguments ] )" >> implies + an C<< eval { } >> around the call (actually + L<< execute|/"$c->execute( $class, $coderef )" >> does), thus de-fatalizing + all 'dies' within the called action. If you want C to propagate you + need to do something like: $c->forward('foo'); die $c->error if $c->error; @@@ -346,6 -348,21 +348,21 @@@ Or make sure to always return true valu your code like this: $c->forward('foo') || return; + + Another note is that C<< $c->forward >> always returns a scalar because it + actually returns $c->state which operates in a scalar context. + Thus, something like: + + return @array; + + in an action that is forwarded to is going to return a scalar, + i.e. how many items are in that array, which is probably not what you want. + If you need to return an array then return a reference to it, + or stash it like so: + + $c->stash->{array} = \@array; + + and access it from the stash. =cut @@@ -357,8 -374,8 +374,8 @@@ sub forward { my $c = shift; no warning =head2 $c->detach() - The same as C, but doesn't return to the previous action when - processing is finished. + The same as L<< forward|/"$c->forward( $action [, \@arguments ] )" >>, but + doesn't return to the previous action when processing is finished. When called with no arguments it escapes the processing chain entirely. @@@ -370,23 -387,27 +387,27 @@@ sub detach { my $c = shift; $c->dispatc =head2 $c->visit( $class, $method, [, \@captures, \@arguments ] ) - Almost the same as C, but does a full dispatch, instead of just - calling the new C<$action> / C<$class-E$method>. This means that C, - C and the method you go to are called, just like a new request. + Almost the same as L<< forward|/"$c->forward( $action [, \@arguments ] )" >>, + but does a full dispatch, instead of just calling the new C<$action> / + C<< $class->$method >>. This means that C, C and the method + you go to are called, just like a new request. In addition both C<< $c->action >> and C<< $c->namespace >> are localized. - This means, for example, that $c->action methods such as C, C and - C return information for the visited action when they are invoked - within the visited action. This is different from the behavior of C - which continues to use the $c->action object from the caller action even when + This means, for example, that C<< $c->action >> methods such as + L, L and + L return information for the visited action + when they are invoked within the visited action. This is different from the + behavior of L<< forward|/"$c->forward( $action [, \@arguments ] )" >>, which + continues to use the $c->action object from the caller action even when invoked from the callee. - C<$c-Estash> is kept unchanged. + C<< $c->stash >> is kept unchanged. - In effect, C allows you to "wrap" another action, just as it - would have been called by dispatching from a URL, while the analogous - C allows you to transfer control to another action as if it had - been reached directly from a URL. + In effect, L<< visit|/"$c->visit( $action [, \@captures, \@arguments ] )" >> + allows you to "wrap" another action, just as it would have been called by + dispatching from a URL, while the analogous + L<< go|/"$c->go( $action [, \@captures, \@arguments ] )" >> allows you to + transfer control to another action as if it had been reached directly from a URL. =cut @@@ -396,12 -417,15 +417,15 @@@ sub visit { my $c = shift; $c->dispatch =head2 $c->go( $class, $method, [, \@captures, \@arguments ] ) - Almost the same as C, but does a full dispatch like C, - instead of just calling the new C<$action> / - C<$class-E$method>. This means that C, C and the - method you visit are called, just like a new request. - - C<$c-Estash> is kept unchanged. + The relationship between C and + L<< visit|/"$c->visit( $action [, \@captures, \@arguments ] )" >> is the same as + the relationship between + L<< forward|/"$c->forward( $class, $method, [, \@arguments ] )" >> and + L<< detach|/"$c->detach( $action [, \@arguments ] )" >>. Like C<< $c->visit >>, + C<< $c->go >> will perform a full dispatch on the specified action or method, + with localized C<< $c->action >> and C<< $c->namespace >>. Like C, + C escapes the processing of the current request chain on completion, and + does not return to its caller. =cut @@@ -480,7 -504,9 +504,9 @@@ sub error =head2 $c->state - Contains the return value of the last executed action. + Contains the return value of the last executed action. + Note that << $c->state >> operates in a scalar context which means that all + values it returns are scalar. =head2 $c->clear_errors @@@ -525,6 -551,10 +551,10 @@@ sub _comp_names_search_prefixes # if we were given a regexp to search against, we're done. return if ref $name; + # skip regexp fallback if configured + return + if $appclass->config->{disable_component_resolution_regex_fallback}; + # regexp fallback $query = qr/$name/i; @result = grep { $eligible{ $_ } =~ m{$query} } keys %eligible; @@@ -542,7 -572,8 +572,8 @@@ (join '", "', @result) . "'. Relying on regexp fallback behavior for " . "component resolution is unreliable and unsafe."; my $short = $result[0]; - $short =~ s/.*?Model:://; + # remove the component namespace prefix + $short =~ s/.*?(Model|Controller|View):://; my $shortmess = Carp::shortmess(''); if ($shortmess =~ m#Catalyst/Plugin#) { $msg .= " You probably need to set '$short' instead of '${name}' in this " . @@@ -551,7 -582,7 +582,7 @@@ $msg .= " You probably need to set '$short' instead of '${name}' in this " . "component's config"; } else { - $msg .= " You probably meant \$c->${warn_for}('$short') instead of \$c->${warn_for}({'${name}'}), " . + $msg .= " You probably meant \$c->${warn_for}('$short') instead of \$c->${warn_for}('${name}'), " . "but if you really wanted to search, pass in a regexp as the argument " . "like so: \$c->${warn_for}(qr/${name}/)"; } @@@ -639,7 -670,7 +670,7 @@@ If you want to search for models, pass sub model { my ( $c, $name, @args ) = @_; - + my $appclass = ref($c) || $c; if( $name ) { my @result = $c->_comp_search_prefixes( $name, qw/Model M/ ); return map { $c->_filter_component( $_, @args ) } @result if ref $name; @@@ -652,14 -683,14 +683,14 @@@ return $c->model( $c->stash->{current_model} ) if $c->stash->{current_model}; } - return $c->model( $c->config->{default_model} ) - if $c->config->{default_model}; + return $c->model( $appclass->config->{default_model} ) + if $appclass->config->{default_model}; my( $comp, $rest ) = $c->_comp_search_prefixes( undef, qw/Model M/); if( $rest ) { $c->log->warn( Carp::shortmess('Calling $c->model() will return a random model unless you specify one of:') ); - $c->log->warn( '* $c->config->{default_model} # the name of the default model to use' ); + $c->log->warn( '* $c->config(default_model => "the name of the default model to use")' ); $c->log->warn( '* $c->stash->{current_model} # the name of the model to use for this request' ); $c->log->warn( '* $c->stash->{current_model_instance} # the instance of the model to use for this request' ); $c->log->warn( 'NB: in version 5.81, the "random" behavior will not work at all.' ); @@@ -693,6 -724,7 +724,7 @@@ If you want to search for views, pass i sub view { my ( $c, $name, @args ) = @_; + my $appclass = ref($c) || $c; if( $name ) { my @result = $c->_comp_search_prefixes( $name, qw/View V/ ); return map { $c->_filter_component( $_, @args ) } @result if ref $name; @@@ -705,14 -737,14 +737,14 @@@ return $c->view( $c->stash->{current_view} ) if $c->stash->{current_view}; } - return $c->view( $c->config->{default_view} ) - if $c->config->{default_view}; + return $c->view( $appclass->config->{default_view} ) + if $appclass->config->{default_view}; my( $comp, $rest ) = $c->_comp_search_prefixes( undef, qw/View V/); if( $rest ) { $c->log->warn( 'Calling $c->view() will return a random view unless you specify one of:' ); - $c->log->warn( '* $c->config->{default_view} # the name of the default view to use' ); + $c->log->warn( '* $c->config(default_view => "the name of the default view to use")' ); $c->log->warn( '* $c->stash->{current_view} # the name of the view to use for this request' ); $c->log->warn( '* $c->stash->{current_view_instance} # the instance of the view to use for this request' ); $c->log->warn( 'NB: in version 5.81, the "random" behavior will not work at all.' ); @@@ -767,6 -799,12 +799,12 @@@ should be used instead If C<$name> is a regexp, a list of components matched against the full component name will be returned. + If Catalyst can't find a component by name, it will fallback to regex + matching by default. To disable this behaviour set + disable_component_resolution_regex_fallback to a true value. + + __PACKAGE__->config( disable_component_resolution_regex_fallback => 1 ); + =cut sub component { @@@ -818,11 -856,11 +856,11 @@@ Returns or takes a hashref containing t __PACKAGE__->config( { db => 'dsn:SQLite:foo.db' } ); - You can also use a C, C or C config file - like myapp.conf in your applications home directory. See + You can also use a C, C or L config file + like C in your applications home directory. See L. - =head3 Cascading configuration. + =head3 Cascading configuration The config method is present on all Catalyst components, and configuration will be merged when an application is started. Configuration loaded with @@@ -918,7 -956,7 +956,7 @@@ Returns the engine instance. See L with C<< $c->config->{home} >> and returns a L object. Note you can usually use this object as a filename, but sometimes you will have to explicitly stringify it - yourself by calling the C<<->stringify>> method. + yourself by calling the C<< ->stringify >> method. For example: @@@ -1106,7 -1144,6 +1144,6 @@@ EO my $name = $class->config->{name} || 'Application'; $class->log->info("$name powered by Catalyst $Catalyst::VERSION"); } - $class->log->_flush() if $class->log->can('_flush'); # Make sure that the application class becomes immutable at this point, B::Hooks::EndOfScope::on_scope_end { @@@ -1126,11 -1163,21 +1163,21 @@@ . "Class::Accessor(::Fast)?\nPlease pass " . "(replace_constructor => 1)\nwhen making your class immutable.\n"; } - $meta->make_immutable(replace_constructor => 1) - unless $meta->is_immutable; + $meta->make_immutable( + replace_constructor => 1, + ) unless $meta->is_immutable; }; + if ($class->config->{case_sensitive}) { + $class->log->warn($class . "->config->{case_sensitive} is set."); + $class->log->warn("This setting is deprecated and planned to be removed in Catalyst 5.81."); + } + $class->setup_finalize; + # Should be the last thing we do so that user things hooking + # setup_finalize can log.. + $class->log->_flush() if $class->log->can('_flush'); + return 1; # Explicit return true as people have __PACKAGE__->setup as the last thing in their class. HATE. } @@@ -1158,40 -1205,63 +1205,63 @@@ sub setup_finalize $class->setup_finished(1); } - =head2 $c->uri_for( $action, \@captures?, @args?, \%query_values? ) - - =head2 $c->uri_for( $path, @args?, \%query_values? ) - - =over - - =item $action - - A Catalyst::Action object representing the Catalyst action you want to - create a URI for. To get one for an action in the current controller, - use C<< $c->action('someactionname') >>. To get one from different - controller, fetch the controller using C<< $c->controller() >>, then - call C on it. + =head2 $c->uri_for( $path?, @args?, \%query_values? ) - You can maintain the arguments captured by an action (e.g.: Regex, Chained) - using C<< $c->req->captures >>. + =head2 $c->uri_for( $action, \@captures?, @args?, \%query_values? ) - # For the current action - $c->uri_for($c->action, $c->req->captures); + Constructs an absolute L object based on the application root, the + provided path, and the additional arguments and query parameters provided. + When used as a string, provides a textual URI. + + If no arguments are provided, the URI for the current action is returned. + To return the current action and also provide @args, use + C<< $c->uri_for( $c->action, @args ) >>. + + If the first argument is a string, it is taken as a public URI path relative + to C<< $c->namespace >> (if it doesn't begin with a forward slash) or + relative to the application root (if it does). It is then merged with + C<< $c->request->base >>; any C<@args> are appended as additional path + components; and any C<%query_values> are appended as C parameters. + + If the first argument is a L it represents an action which + will have its path resolved using C<< $c->dispatcher->uri_for_action >>. The + optional C<\@captures> argument (an arrayref) allows passing the captured + variables that are needed to fill in the paths of Chained and Regex actions; + once the path is resolved, C continues as though a path was + provided, appending any arguments or parameters and creating an absolute + URI. + + The captures for the current request can be found in + C<< $c->request->captures >>, and actions can be resolved using + C<< Catalyst::Controller->action_for($name) >>. If you have a private action + path, use C<< $c->uri_for_action >> instead. + + # Equivalent to $c->req->uri + $c->uri_for($c->action, $c->req->captures, + @{ $c->req->args }, $c->req->params); # For the Foo action in the Bar controller - $c->uri_for($c->controller('Bar')->action_for('Foo'), $c->req->captures); + $c->uri_for($c->controller('Bar')->action_for('Foo')); - =back + # Path to a static resource + $c->uri_for('/static/images/logo.png'); =cut sub uri_for { my ( $c, $path, @args ) = @_; + if (blessed($path) && $path->isa('Catalyst::Controller')) { + $path = $path->path_prefix; + $path =~ s{/+\z}{}; + $path .= '/'; + } + if ( blessed($path) ) { # action object - my $captures = ( scalar @args && ref $args[0] eq 'ARRAY' - ? shift(@args) - : [] ); + my $captures = [ map { s|/|%2F|; $_; } + ( scalar @args && ref $args[0] eq 'ARRAY' + ? @{ shift(@args) } + : ()) ]; my $action = $path; $path = $c->dispatcher->uri_for_action($action, $captures); if (not defined $path) { @@@ -1209,6 -1279,7 +1279,7 @@@ carp "uri_for called with undef argument" if grep { ! defined $_ } @args; s/([^$URI::uric])/$URI::Escape::escapes{$1}/go for @args; + s|/|%2F| for @args; unshift(@args, $path); @@@ -1541,9 -1612,9 +1612,9 @@@ sub execute sub _stats_start_execute { my ( $c, $code ) = @_; - + my $appclass = ref($c) || $c; return if ( ( $code->name =~ /^_.*/ ) - && ( !$c->config->{show_internal_actions} ) ); + && ( !$appclass->config->{show_internal_actions} ) ); my $action_name = $code->reverse(); $c->counter->{$action_name}++; @@@ -1571,9 -1642,10 +1642,10 @@@ # is this a root-level call or a forwarded call? if ( $callsub =~ /forward$/ ) { + my $parent = $c->stack->[-1]; # forward, locate the caller - if ( my $parent = $c->stack->[-1] ) { + if ( exists $c->counter->{"$parent"} ) { $c->stats->profile( begin => $action, parent => "$parent" . $c->counter->{"$parent"}, @@@ -1606,25 -1678,6 +1678,6 @@@ sub _stats_finish_execute $c->stats->profile( end => $info ); } - =head2 $c->_localize_fields( sub { }, \%keys ); - - =cut - - #Why does this exist? This is no longer safe and WILL NOT WORK. - # it doesnt seem to be used anywhere. can we remove it? - sub _localize_fields { - my ( $c, $localized, $code ) = ( @_ ); - - my $request = delete $localized->{request} || {}; - my $response = delete $localized->{response} || {}; - - local @{ $c }{ keys %$localized } = values %$localized; - local @{ $c->request }{ keys %$request } = values %$request; - local @{ $c->response }{ keys %$response } = values %$response; - - $code->(); - } - =head2 $c->finalize Finalizes the request. @@@ -1662,8 -1715,6 +1715,8 @@@ sub finalize $c->finalize_body; } + $c->log_response; + if ($c->use_stats) { my $elapsed = sprintf '%f', $c->stats->elapsed; my $av = $elapsed == 0 ? '??' : sprintf '%.3f', 1 / $elapsed; @@@ -1741,7 -1792,7 +1794,7 @@@ sub finalize_headers } else { # everything should be bytes at this point, but just in case - $response->content_length( bytes::length( $response->body ) ); + $response->content_length( length( $response->body ) ); } } @@@ -1878,7 -1929,7 +1931,7 @@@ sub prepare $c->prepare_read; # Parse the body unless the user wants it on-demand - unless ( $c->config->{parse_on_demand} ) { + unless ( ref($c)->config->{parse_on_demand} ) { $c->prepare_body; } } @@@ -1888,7 -1939,8 +1941,7 @@@ $path = '/' unless length $path; my $address = $c->req->address || ''; - $c->log->debug(qq/"$method" request for "$path" from "$address"/) - if $c->debug; + $c->log_request; $c->prepare_action; @@@ -1918,6 -1970,17 +1971,6 @@@ sub prepare_body $c->engine->prepare_body( $c, @_ ); $c->prepare_parameters; $c->prepare_uploads; - - if ( $c->debug && keys %{ $c->req->body_parameters } ) { - my $t = Text::SimpleTable->new( [ 35, 'Parameter' ], [ 36, 'Value' ] ); - for my $key ( sort keys %{ $c->req->body_parameters } ) { - my $param = $c->req->body_parameters->{$key}; - my $value = defined($param) ? $param : ''; - $t->row( $key, - ref $value eq 'ARRAY' ? ( join ', ', @$value ) : $value ); - } - $c->log->debug( "Body Parameters are:\n" . $t->draw ); - } } =head2 $c->prepare_body_chunk( $chunk ) @@@ -2001,328 -2064,55 +2054,328 @@@ sub prepare_query_parameters my $c = shift; $c->engine->prepare_query_parameters( $c, @_ ); +} - if ( $c->debug && keys %{ $c->request->query_parameters } ) { - my $t = Text::SimpleTable->new( [ 35, 'Parameter' ], [ 36, 'Value' ] ); - for my $key ( sort keys %{ $c->req->query_parameters } ) { - my $param = $c->req->query_parameters->{$key}; - my $value = defined($param) ? $param : ''; - $t->row( $key, - ref $value eq 'ARRAY' ? ( join ', ', @$value ) : $value ); +=head2 $c->apply_parameter_debug_filters($params) + +=cut + +sub _apply_parameter_debug_filters { + my $c = shift; + my $type = shift; + my $params = shift; + + # take a copy since we don't want to modify the original + my $filtered_params = {%$params}; + + my @filters; + + my $filter_param_config = $c->config->{Debug}->{param_filters}; + if ( ref($filter_param_config) eq 'HASH' ) { + + # filters broken out by parameter type (i.e. body, query, all) + my $type_filters = $filter_param_config->{$type} || []; + $type_filters = [$type_filters] if ref $type_filters ne 'ARRAY'; + + my $all_filters = $filter_param_config->{'all'} || []; + $all_filters = [$all_filters] if ref $all_filters ne 'ARRAY'; + + @filters = $c->_normalize_debug_filters( [ @$type_filters, @$all_filters ] ); + } elsif ($filter_param_config) { + @filters = $c->_normalize_debug_filters($filter_param_config); + } + + # allow callback to modify each parameter + foreach my $k ( keys %$filtered_params ) { + + # apply filters to each param + foreach my $f (@filters) { + + # take a copy of the key to avoid the callback inadvertantly + # modifying things + my $copy_key = $k; + + my $returned = $f->( $copy_key => $filtered_params->{$k} ); + + if ( defined $returned ) { + + # if no value is returned, we assume the filter chose not to modify anything + # otherwise, the returned value is the logged value + $filtered_params->{$k} = $returned; + + last; # skip the rest of the filters since this one matched + } } - $c->log->debug( "Query Parameters are:\n" . $t->draw ); } + return $filtered_params; } -=head2 $c->prepare_read +# turn debug filters into a list of CodeRef's +sub _normalize_debug_filters { + my $c = shift; -Prepares the input for reading. + my @filters = ref( $_[0] ) eq 'ARRAY' ? @{ $_[0] } : grep { defined $_ } @_; -=cut + my @normalized = map { _make_filter_callback($_) } @filters; -sub prepare_read { my $c = shift; $c->engine->prepare_read( $c, @_ ) } + return @normalized; +} -=head2 $c->prepare_request +sub _make_filter_callback { + my $filter = shift; -Prepares the engine request. + my $filter_str = '[FILTERED]'; + if ( ref($filter) eq 'Regexp' ) { + return sub { return $_[0] =~ $filter ? $filter_str : undef }; + } elsif ( ref($filter) eq 'CODE' ) { + return $filter; + } else { + return sub { return $_[0] eq $filter ? $filter_str : undef }; + } +} + +=head2 $c->log_request + +Writes information about the request to the debug logs. This includes: + +=over 4 + +=item * Request method, path, and remote IP address + +=item * Query keywords (see L) + +=item * Request parameters (see L) + +=item * File uploads + +=back =cut -sub prepare_request { my $c = shift; $c->engine->prepare_request( $c, @_ ) } +sub log_request { + my $c = shift; -=head2 $c->prepare_uploads + return unless $c->debug; -Prepares uploads. + my ( $method, $path, $address ) = ( $c->req->method, $c->req->path, $c->req->address ); + $method ||= ''; + $path = '/' unless length $path; + $address ||= ''; + $c->log->debug(qq/"$method" request for "$path" from "$address"/); + + if ( my $keywords = $c->req->query_keywords ) { + $c->log->debug("Query keywords are: $keywords"); + } + + $c->log_request_parameters( query => $c->req->query_parameters, body => $c->req->body_parameters ); + + $c->log_request_uploads; +} + +=head2 $c->log_response + +Writes information about the response to the debug logs. This includes: + +=over 4 + +=item * Response status code + +=item * Response headers (see L) + +=back + +This logging is not enabled by default. To enable it, you must set a flag in your Catalyst config: + + __PACKAGE__->config( Debug => { log_response => 1 } ); =cut -sub prepare_uploads { +sub log_response { my $c = shift; - $c->engine->prepare_uploads( $c, @_ ); + return unless $c->debug && $c->config->{Debug}->{log_response}; + + $c->log->debug('Response Status: ' . $c->response->status); + $c->log_headers('response', $c->response->headers); +} + +=head2 $c->log_request_parameters( query => {}, body => {} ) + +Logs request parameters to debug logs + +If you have sensitive data that you do not want written to the Catalyst +debug logs, you can set options in your config to filter those values out. +There are a few different ways you can set these up depending on what +exactly you need to filter. + +=head3 Filtering parameters by name + +The most basic means of filtering is to add an entry into your config +as shown below. You can have a simple scalar to just filter a +single parameter or an ARRAY ref to filter out multiple params. + + # filters a single param + __PACKAGE__->config( Debug => { param_filters => 'param_name' } ); + + # filters multiple params + __PACKAGE__->config( Debug => { param_filters => [qw(param1 param2)] } ); + +When the debug logs are generated for a given request, any parameters +(query or body) that exactly match the specified value(s) will have +their values replaced with '[FILTERED]'. For instance: + + [debug] Query Parameters are: + .-------------------------------------+--------------------------------------. + | Parameter | Value | + +-------------------------------------+--------------------------------------+ + | password | [FILTERED] | + .-------------------------------------+--------------------------------------. + +=head3 Filtering parameters by regular expression + +If you have a set of parameters you need to filter, you can specify a +regular expression that will be used to match against parameter names. + + # filters parameters starting with "private." + __PACKAGE__->config( Debug => { param_filters => qr/^private\./ } ); - if ( $c->debug && keys %{ $c->request->uploads } ) { + # filters parameters named "param1" or starting with "private." or "secret." + __PACKAGE__->config( Debug => { param_filters => [ 'param1', qr/^private\./, qr/^secret\./ ] } ); + +Notice on the second example, the arrayref contains a string as well +as two regular expressions. This should DWIM and filter parameters that +match any of the filters specified. + +=head3 Filtering parameters by callback + +If you want even more flexible filtering, you can specify an anonymous +subroutine. The subroutine is given the parameter name and value and +is expected to return the new value that will be shown in the debug log. +An C return value indicates that no change should be made to +the value. + + # transform any "password" param to "********" + __PACKAGE__->config( + Debug => { + param_filters => sub { my ( $k, $v ) = @_; return unless $k eq 'password'; return '*' x 8; } + } + ); + + # combine several param filtering methods + __PACKAGE__->config( + Debug => { + param_filters => [ + 'simple_param_name', + qr/^private\./, + sub { my ( $k, $v ) = @_; return unless $k eq 'password'; return '*' x 8; }, + ] + } + ); + +An example of the debug log for a request with +C would be: + + [debug] Body Parameters are: + .-------------------------------------+--------------------------------------. + | Parameter | Value | + +-------------------------------------+--------------------------------------+ + | some_other_param | some_other_value | + | password | ******** | + .-------------------------------------+--------------------------------------. + +=head3 Filtering by parameter location + +If you have different filters that depend on whether a param was passed +as a query or body param (or as either), you can specify a hashref with +different sets of filters: + + # filters all body parameters + __PACKAGE__->config( Debug => { param_filters => { body => qr// } } ); + + # filters query parameters starting with 'private'. + __PACKAGE__->config( Debug => { param_filters => { query => qr/^private\./ } } ); + + # filters all parameters (query or body) through the specified callback + __PACKAGE__->config( + Debug => { + param_filters => { + all => sub { return unless $_[0] eq 'fizzbuzz'; return 'FIZZBUZZ FILTER' } + } + } + ); + +Of course, you can use any of the above filtering methods with these +"location-specific" filters: + + # body parameter filters + __PACKAGE__->config( + Debug => { + param_filters => { + body => [ + 'some_param', + qr/^private\./, + sub { return 'XXX' if shift eq 'other_param' } + ] + } + } + ); + + # query parameter filters + __PACKAGE__->config( + Debug => { + param_filters => { + body => [ + 'some_param', + qr/^private\./, + sub { return 'XXX' if shift eq 'other_param' } + ] + } + } + ); + + # query parameter filters + __PACKAGE__->config( Debug => { param_filters => { all => [qw(foo bar)] } } ); + +=cut + +sub log_request_parameters { + my $c = shift; + my %all_params = @_; + + my $column_width = Catalyst::Utils::term_width() - 44; + foreach my $type (qw(query body)) { + my $filtered_params = $c->_apply_parameter_debug_filters( $type, $all_params{$type} || {} ); + next unless keys %$filtered_params; + my $t = Text::SimpleTable->new( [ 35, 'Parameter' ], [ $column_width, 'Value' ] ); + for my $key ( sort keys %$filtered_params ) { + my $param = $filtered_params->{$key}; + my $value = defined($param) ? $param : ''; + $t->row( $key, ref $value eq 'ARRAY' ? ( join ', ', @$value ) : $value ); + } + $c->log->debug( ucfirst($type) . " Parameters are:\n" . $t->draw ); + } +} + +=head2 $c->log_request_uploads + +Logs file uploads included in the request to the debug logs. +The parameter name, filename, file type, and file size are all included in +the debug logs. + +=cut + +sub log_request_uploads { + my $c = shift; + my $uploads = $c->req->uploads; + if ( keys %$uploads ) { my $t = Text::SimpleTable->new( [ 12, 'Parameter' ], [ 26, 'Filename' ], [ 18, 'Type' ], [ 9, 'Size' ] ); - for my $key ( sort keys %{ $c->request->uploads } ) { - my $upload = $c->request->uploads->{$key}; + for my $key ( sort keys %$uploads ) { + my $upload = $uploads->{$key}; for my $u ( ref $upload eq 'ARRAY' ? @{$upload} : ($upload) ) { $t->row( $key, $u->filename, $u->type, $u->size ); } @@@ -2331,106 -2121,6 +2384,106 @@@ } } +=head2 $c->log_headers($type => $headers) + +Writes HTTP::Headers to debug logs, applying filters as configured. + +Similarly to how L is configured, you can +configure Catalyst to filter response header values to avoid writing +sensitive data to your logs (e.g. cookie values, etc.). The configuration +works in virtually the same way as the examples in +L. Here are a few specific examples: + + # filters all "Set-Cookie" headers from response logging + __PACKAGE__->config(Debug => { response_header_filters => 'Set-Cookie' } ); + + # filters only the value of the cookie (and leaves the name, path, expiration) + __PACKAGE__->config( + Debug => { + response_header_filters => sub { + my ( $n, $v ) = @_; + return unless $n eq 'Set-Cookie'; + $v =~ s/^.*?;//; + return $v; + }, + } + ); + +=cut + +sub log_headers { + my $c = shift; + my $type = shift; + my $headers = shift; # an HTTP::Headers instance + + my $filtered = $c->_apply_header_debug_filters( $type, $headers ); + + my $t = Text::SimpleTable->new( [ 35, 'Header Name' ], [ 40, 'Value' ] ); + $filtered->scan( + sub { + my ( $name, $value ) = @_; + $t->row( $name, $value ); + } + ); + $c->log->debug( ucfirst($type) . " Headers:\n" . $t->draw ); +} + +# Applies debug filters to $headers and returns a new HTTP::Headers object which has (potentially) filtered values. +sub _apply_header_debug_filters { + my $c = shift; + my $type = shift; + my $headers = shift; + + my @header_filters = $c->_normalize_debug_filters( $c->config->{Debug}->{ $type . '_header_filters' } ); + my $filtered_headers = HTTP::Headers->new(); + foreach my $name ( $headers->header_field_names ) { + my @values = $headers->header($name); + + # headers can be multi-valued + foreach my $value (@values) { + foreach my $f (@header_filters) { + my $new_value = $f->( $name, $value ); + + # if a defined value is returned, we use that + if ( defined $new_value ) { + $value = $new_value; + last; # skip the rest of the filters + } + } + $filtered_headers->push_header( $name, $value ); + } + } + return $filtered_headers; +} + +=head2 $c->prepare_read + +Prepares the input for reading. + +=cut + +sub prepare_read { my $c = shift; $c->engine->prepare_read( $c, @_ ) } + +=head2 $c->prepare_request + +Prepares the engine request. + +=cut + +sub prepare_request { my $c = shift; $c->engine->prepare_request( $c, @_ ) } + +=head2 $c->prepare_uploads + +Prepares uploads. + +=cut + +sub prepare_uploads { + my $c = shift; + + $c->engine->prepare_uploads( $c, @_ ); +} + =head2 $c->prepare_write Prepares the output for writing. @@@ -2453,7 -2143,7 +2506,7 @@@ Reads a chunk of data from the request be used in a while loop, reading C<$maxlength> bytes on every call. C<$maxlength> defaults to the size of the request if not specified. - You have to set C<< MyApp->config->{parse_on_demand} >> to use this + You have to set C<< MyApp->config(parse_on_demand => 1) >> to use this directly. Warning: If you use read(), Catalyst will not process the body, @@@ -2490,40 -2180,32 +2543,32 @@@ sub setup_actions { my $c = shift; $c-> =head2 $c->setup_components - Sets up components. Specify a C config option to pass - additional options directly to L. To add additional - search paths, specify a key named C as an array - reference. Items in the array beginning with C<::> will have the - application class name prepended to them. + This method is called internally to set up the application's components. + + It finds modules by calling the L method, expands them to + package names with the L method, and then installs + each component into the application. - All components found will also have any - L loaded and set up as components. - Note, that modules which are B an I of the main - file namespace loaded will not be instantiated as components. + The C config option is passed to both of the above methods. + + Installation of each component is performed by the L method, + below. =cut sub setup_components { my $class = shift; - my @paths = qw( ::Controller ::C ::Model ::M ::View ::V ); my $config = $class->config->{ setup_components }; - my $extra = delete $config->{ search_extra } || []; - - push @paths, @$extra; - - my $locator = Module::Pluggable::Object->new( - search_path => [ map { s/^(?=::)/$class/; $_; } @paths ], - %$config - ); - my @comps = sort { length $a <=> length $b } $locator->plugins; + my @comps = sort { length $a <=> length $b } + $class->locate_components($config); my %comps = map { $_ => 1 } @comps; - my $deprecated_component_names = grep { /::[CMV]::/ } @comps; + my $deprecatedcatalyst_component_names = grep { /::[CMV]::/ } @comps; $class->log->warn(qq{Your application is using the deprecated ::[MVC]:: type naming scheme.\n}. qq{Please switch your class names to ::Model::, ::View:: and ::Controller: as appropriate.\n} - ) if $deprecated_component_names; + ) if $deprecatedcatalyst_component_names; for my $component ( @comps ) { @@@ -2532,30 -2214,76 +2577,76 @@@ # we know M::P::O found a file on disk so this is safe Catalyst::Utils::ensure_class_loaded( $component, { ignore_loaded => 1 } ); - #Class::MOP::load_class($component); - - my $module = $class->setup_component( $component ); - my %modules = ( - $component => $module, - map { - $_ => $class->setup_component( $_ ) - } grep { - not exists $comps{$_} - } Devel::InnerPackage::list_packages( $component ) - ); - for my $key ( keys %modules ) { - $class->components->{ $key } = $modules{ $key }; + # Needs to be done as soon as the component is loaded, as loading a sub-component + # (next time round the loop) can cause us to get the wrong metaclass.. + $class->_controller_init_base_classes($component); + } + + for my $component (@comps) { + $class->components->{ $component } = $class->setup_component($component); + for my $component ($class->expand_component_module( $component, $config )) { + next if $comps{$component}; + $class->_controller_init_base_classes($component); # Also cover inner packages + $class->components->{ $component } = $class->setup_component($component); } } } + =head2 $c->locate_components( $setup_component_config ) + + This method is meant to provide a list of component modules that should be + setup for the application. By default, it will use L. + + Specify a C config option to pass additional options directly + to L. To add additional search paths, specify a key named + C as an array reference. Items in the array beginning with C<::> + will have the application class name prepended to them. + + =cut + + sub locate_components { + my $class = shift; + my $config = shift; + + my @paths = qw( ::Controller ::C ::Model ::M ::View ::V ); + my $extra = delete $config->{ search_extra } || []; + + push @paths, @$extra; + + my $locator = Module::Pluggable::Object->new( + search_path => [ map { s/^(?=::)/$class/; $_; } @paths ], + %$config + ); + + my @comps = $locator->plugins; + + return @comps; + } + + =head2 $c->expand_component_module( $component, $setup_component_config ) + + Components found by C will be passed to this method, which + is expected to return a list of component (package) names to be set up. + + =cut + + sub expand_component_module { + my ($class, $module) = @_; + return Devel::InnerPackage::list_packages( $module ); + } + =head2 $c->setup_component =cut + # FIXME - Ugly, ugly hack to ensure the we force initialize non-moose base classes + # nearest to Catalyst::Controller first, no matter what order stuff happens + # to be loaded. There are TODO tests in Moose for this, see + # f2391d17574eff81d911b97be15ea51080500003 sub _controller_init_base_classes { my ($app_class, $component) = @_; + return unless $component->isa('Catalyst::Controller'); foreach my $class ( reverse @{ mro::get_linear_isa($component) } ) { Moose::Meta::Class->initialize( $class ) unless find_meta($class); @@@ -2569,16 -2297,12 +2660,12 @@@ sub setup_component return $component; } - # FIXME - Ugly, ugly hack to ensure the we force initialize non-moose base classes - # nearest to Catalyst::Controller first, no matter what order stuff happens - # to be loaded. There are TODO tests in Moose for this, see - # f2391d17574eff81d911b97be15ea51080500003 - if ($component->isa('Catalyst::Controller')) { - $class->_controller_init_base_classes($component); - } - my $suffix = Catalyst::Utils::class2classsuffix( $component ); my $config = $class->config->{ $suffix } || {}; + # Stash catalyst_component_name in the config here, so that custom COMPONENT + # methods also pass it. local to avoid pointlessly shitting in config + # for the debug screen, as $component is already the key name. + local $config->{catalyst_component_name} = $component; my $instance = eval { $component->COMPONENT( $class, $config ); }; @@@ -2862,7 -2586,8 +2949,8 @@@ the plugin name does not begin with Clog->warn( "$plugin inherits from 'Catalyst::Component' - this is decated and will not work in 5.81" ) + if $plugin->isa( 'Catalyst::Component' ); $proto->_plugins->{$plugin} = 1; unless ($instant) { no strict 'refs'; @@@ -2953,23 -2678,80 +3041,80 @@@ messages in template systems sub version { return $Catalyst::VERSION } - =head1 INTERNAL ACTIONS + =head1 CONFIGURATION - Catalyst uses internal actions like C<_DISPATCH>, C<_BEGIN>, C<_AUTO>, - C<_ACTION>, and C<_END>. These are by default not shown in the private - action table, but you can make them visible with a config parameter. + There are a number of 'base' config variables which can be set: + + =over + + =item * + + C - The default model picked if you say C<< $c->model >>. See Lmodel($name)>. + + =item * + + C - The default view to be rendered or returned when C<< $c->view >>. See Lview($name)>. + is called. + + =item * + + C - Turns + off the deprecated component resolution functionality so + that if any of the component methods (e.g. C<< $c->controller('Foo') >>) + are called then regex search will not be attempted on string values and + instead C will be returned. + + =item * + + C - The application home directory. In an uninstalled application, + this is the top level application directory. In an installed application, + this will be the directory containing C<< MyApp.pm >>. + + =item * + + C - See L + + =item * + + C - The name of the application in debug messages and the debug and + welcome screens + + =item * + + C - The request body (for example file uploads) will not be parsed + until it is accessed. This allows you to (for example) check authentication (and reject + the upload) before actually recieving all the data. See L + + =item * + + C - The root directory for templates. Usually this is just a + subdirectory of the home directory, but you can set it to change the + templates to a different directory. + + =item * - MyApp->config->{show_internal_actions} = 1; + C - Array reference passed to Module::Pluggable to for additional + namespaces from which components will be loaded (and constructed and stored in + C<< $c->components >>). - =head1 CASE SENSITIVITY + =item * - By default Catalyst is not case sensitive, so C is - mapped to C. You can activate case sensitivity with a config - parameter. + C - If true, causes internal actions such as C<< _DISPATCH >> + to be shown in hit debug tables in the test server. - MyApp->config->{case_sensitive} = 1; + =item * - This causes C to map to C. + C - See L. + + =back + + =head1 INTERNAL ACTIONS + + Catalyst uses internal actions like C<_DISPATCH>, C<_BEGIN>, C<_AUTO>, + C<_ACTION>, and C<_END>. These are by default not shown in the private + action table, but you can make them visible with a config parameter. + + MyApp->config(show_internal_actions => 1); =head1 ON-DEMAND PARSER @@@ -2977,7 -2759,7 +3122,7 @@@ The request body is usually parsed at t but if you want to handle input yourself, you can enable on-demand parsing with a config parameter. - MyApp->config->{parse_on_demand} = 1; + MyApp->config(parse_on_demand => 1); =head1 PROXY SUPPORT @@@ -2998,6 -2780,18 +3143,18 @@@ changes are made to the request The host value for $c->req->base and $c->req->uri is set to the real host, as read from the HTTP X-Forwarded-Host header. + Additionally, you may be running your backend application on an insecure + connection (port 80) while your frontend proxy is running under SSL. If there + is a discrepancy in the ports, use the HTTP header C to + tell Catalyst what port the frontend listens on. This will allow all URIs to + be created properly. + + In the case of passing in: + + X-Forwarded-Port: 443 + + All calls to C will result in an https link, as is expected. + Obviously, your web server must support these headers for this to work. In a more complex server farm environment where you may have your @@@ -3005,11 -2799,11 +3162,11 @@@ frontend proxy server(s) on different m configuration option to tell Catalyst to read the proxied data from the headers. - MyApp->config->{using_frontend_proxy} = 1; + MyApp->config(using_frontend_proxy => 1); If you do not wish to use the proxy support at all, you may set: - MyApp->config->{ignore_frontend_proxy} = 1; + MyApp->config(ignore_frontend_proxy => 1); =head1 THREAD SAFETY @@@ -3046,7 -2840,7 +3203,7 @@@ Wiki =head2 L - The Catalyst Manual - =head2 L, L - Base classes for components + =head2 L, L - Base classes for components =head2 L - Core engine @@@ -3068,9 -2862,11 +3225,11 @@@ abw: Andy Wardle acme: Leon Brocard + abraxxa: Alexander Hartmaier + Andrew Bramble - Andrew Ford + Andrew Ford EA.Ford@ford-mason.co.ukE Andrew Ruthven @@@ -3086,8 -2882,18 +3245,18 @@@ chansen: Christian Hanse chicks: Christopher Hicks + Chisel Wright C + + Danijel Milicevic C + + David Kamholz Edkamholz@cpan.orgE + + David Naughton, C + David E. Wheeler + dhoss: Devin Austin + dkubb: Dan Kubb Drew Taylor @@@ -3098,16 -2904,26 +3267,26 @@@ esskar: Sascha Kiefe fireartist: Carl Franks + frew: Arthur Axel "fREW" Schmidt + gabb: Danijel Milicevic Gary Ashton Jones + Gavin Henry C + Geoff Richards + groditi: Guillermo Roditi + + hobbs: Andrew Rodland + ilmari: Dagfinn Ilmari Mannsåker jcamacho: Juan Camacho + jester: Jesse Sheidlower C + jhannah: Jay Hannah Jody Belka @@@ -3116,6 -2932,12 +3295,12 @@@ Johan Lindstro jon: Jon Schutz + Jonathan Rockway C<< >> + + Kieren Diment C + + konobi: Scott McWhirter + marcus: Marcus Ramberg miyagawa: Tatsuhiko Miyagawa @@@ -3144,16 -2966,22 +3329,22 @@@ rafl: Florian Ragwitz - sky: Arthur Bergman + Robert Sedlacek C<< >> - the_jester: Jesse Sheidlower + sky: Arthur Bergman t0m: Tomas Doran Ulf Edvinsson + Viljo Marrandi C + + Will Hawes C + willert: Sebastian Willert + Yuval Kogman, C + =head1 LICENSE This library is free software. You can redistribute it and/or modify it under