aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib
Commit message (Collapse)AuthorAgeFilesLines
...
* | prevent string allocationsAaron Patterson2015-08-061-1/+1
| |
* | reuse the request object in the File serving middlewareAaron Patterson2015-08-061-9/+13
| | | | | | | | | | | | | | Implement `serve` on the middleware. Nothing can be placed between the instance of FileHandler and Static because Static instantiates an instance of FileHandler. IOW there is no reason to implement the `call` API in this case.
* | get the underlying REQUEST_METHOD from the superclassAaron Patterson2015-08-061-1/+1
| |
* | use a request object to reduce string allocations and not know about ENV keysAaron Patterson2015-08-061-6/+7
| |
* | Merge pull request #21061 from yui-knk/refactor/route_setRafael Mendonça França2015-08-061-4/+2
|\ \ | | | | | | Remove duplicated `Array#to_param`
| * | Remove duplicated `Array#to_param`yui-knk2015-08-011-4/+2
| | | | | | | | | | | | | | | `Array#to_param` is defind in active_support/core_ext/object/to_query.rb, so we can call `to_param` if value is_a Array.
* | | Merge pull request #21131 from eagletmt/percent-filenameRafael Mendonça França2015-08-061-1/+7
|\ \ \ | | | | | | | | Fix Encoding::UndefinedConversionError with multibyte UTF-8 filename containing "%" character
| * | | Assume uploaded filename is UTF-8Kohei Suzuki2015-08-051-1/+7
| | |/ | |/|
* | | Adds missing argument handling for ActionController::TestSession toMatthew Gerrior2015-08-061-0/+4
| | | | | | | | | | | | allow testing controllers that use session#fetch with a default value.
* | | remove dead codeAaron Patterson2015-08-061-5/+0
| | | | | | | | | | | | | | | we don't recycle requests anymore, so we shouldn't need to recycle cookie jars
* | | ask the request for the cookie jarAaron Patterson2015-08-061-1/+8
| | | | | | | | | | | | this prevents the middleware from knowing the specific key for the jar
* | | add a setter for the cookie jarAaron Patterson2015-08-062-2/+8
| | |
* | | remove request reference from chained jarsAaron Patterson2015-08-061-22/+25
| | | | | | | | | | | | | | | This changes the chained jars to ask the parent jar for the request object which should eventually call back up to the original jar
* | | remove `@host` ivarAaron Patterson2015-08-052-13/+5
| | |
* | | remove @secure ivarAaron Patterson2015-08-052-7/+4
| | |
* | | CookieJar does not need the key_generator parameter anymoreAaron Patterson2015-08-052-5/+3
| | |
* | | eliminate key_generator ivarAaron Patterson2015-08-051-11/+14
| | |
* | | sop passing host and secure to the build methodAaron Patterson2015-08-052-3/+5
| | | | | | | | | | | | | | | eventually we will make the cookie jar derive these values from the request object rather than save a reference to the values
* | | stop using an options hash with the cookie jarAaron Patterson2015-08-052-39/+31
| | | | | | | | | | | | | | | | | | | | | | | | The cookie jar can just ask the request object for the information it needs. This allows us to stop allocating hashes for options, and also allows us to delay calculating values in advance. Generating the options hash forced us to calculate values that we may never have needed at runtime
* | | move env access to the request object.Aaron Patterson2015-08-053-16/+48
| | | | | | | | | | | | | | | | | | Accessing a request object has nice advantages over accessing a hash. If you use a missing method name, you'll get an exception rather than a `nil` (is one nice feature)
* | | routes in the env via the request objectAaron Patterson2015-08-051-0/+4
| | |
* | | allocate a request object to avoid hash allocationsAaron Patterson2015-08-051-0/+4
|/ / | | | | | | | | This decouples the `call` method from knowing the SCRIPT_NAME key and offloads decisions about how to access script_name
* | Use #start_with? and #[] for speedBenjamin Quorning2015-08-021-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | While the readability may be slightly worse, the speed improvement is significant: Twice as fast when there's no leading "/" to remove, and over 4 times as fast when there is a leading "/". Benchmark: require 'benchmark/ips' def match(controller) if controller if m = controller.match(/\A\/(?<controller_without_leading_slash>.*)/) m[:controller_without_leading_slash] else controller end end end def start_with(controller) if controller if controller.start_with?('/'.freeze) controller[1..-1] else controller end end end Benchmark.ips do |x| x.report("match") { match("no_leading_slash") } x.report("start_with") { start_with("no_leading_slash") } x.compare! end Benchmark.ips do |x| x.report("match") { match("/a_leading_slash") } x.report("start_with") { start_with("/a_leading_slash") } x.compare! end Result (Ruby 2.2.2): Calculating ------------------------------------- match 70.324k i/100ms start_with 111.264k i/100ms ------------------------------------------------- match 1.468M (± 7.1%) i/s - 7.314M start_with 3.787M (± 3.5%) i/s - 18.915M Comparison: start_with: 3787389.4 i/s match: 1467636.4 i/s - 2.58x slower Calculating ------------------------------------- match 36.694k i/100ms start_with 86.071k i/100ms ------------------------------------------------- match 532.795k (± 4.7%) i/s - 2.679M start_with 2.518M (± 5.8%) i/s - 12.566M Comparison: start_with: 2518366.8 i/s match: 532794.5 i/s - 4.73x slower
* | Merge pull request #21088 from yui-knk/doc/to_paramRichard Schneeman2015-08-011-0/+15
|\ \ | | | | | | [ci skip]
| * | [ci skip]yui-knk2015-08-011-0/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Add descriptions about `ActiveRecord::Base#to_param` to * `ActionDispatch::Routing::Base#match` * Overriding Named Route Parameters (guide) When passes `:param` to route definision, always `to_param` method of related model is overridden to constructe an URL by passing these model instance to named_helper.
* | | docs, custom api base controllers shoudl subclass metal. [ci skip]Yves Senn2015-08-011-1/+1
| | | | | | | | | | | | This is a follow up to #21008.
* | | Merge pull request #21008 from svenwin/patch-1Yves Senn2015-08-011-1/+1
|\ \ \ | |/ / |/| | | | | Add documentation to get a running custom base controller [ci skip]
| * | Add documentation to get a running custom base controller [ci skip]Sven Winkler2015-07-231-1/+1
| | |
* | | Array#any? is slower and not the inverse of Array#empty?Jean Boussier2015-07-301-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ``` empty_array = [] small_array = [1] * 30 bigger_array = [1] * 300 Benchmark.ips do |x| x.report('empty !empty?') { !empty_array.empty? } x.report('small !empty?') { !small_array.empty? } x.report('bigger !empty?') { !bigger_array.empty? } x.report('empty any?') { empty_array.any? } x.report('small any?') { small_array.any? } x.report('bigger any?') { bigger_array.any? } end ``` ``` Calculating ------------------------------------- empty !empty? 132.059k i/100ms small !empty? 133.974k i/100ms bigger !empty? 133.848k i/100ms empty any? 106.924k i/100ms small any? 85.525k i/100ms bigger any? 86.663k i/100ms ------------------------------------------------- empty !empty? 8.522M (± 7.9%) i/s - 42.391M small !empty? 8.501M (± 8.5%) i/s - 42.202M bigger !empty? 8.434M (± 8.6%) i/s - 41.894M empty any? 4.161M (± 8.3%) i/s - 20.743M small any? 2.654M (± 5.2%) i/s - 13.256M bigger any? 2.642M (± 6.4%) i/s - 13.173M ``` Ref: https://github.com/rails/rails/pull/21057#discussion_r35902468
* | | Use delete_if instead of each; delete(key)schneems2015-07-301-3/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | It is slightly faster: ``` Calculating ------------------------------------- each; delete 35.166k i/100ms delete_if 36.416k i/100ms ------------------------------------------------- each; delete 478.026k (± 8.5%) i/s - 2.391M delete_if 485.123k (± 7.9%) i/s - 2.440M ```
* | | Remove (another) array allocationschneems2015-07-301-5/+14
| | | | | | | | | | | | | | | | | | We don't always need an array when generating a url with the formatter. We can be lazy about allocating the `missing_keys` array. This saves us: 35,606 bytes and 889 objects per request
* | | Remove array allocationschneems2015-07-301-2/+2
| | | | | | | | | | | | | | | | | | THe only reason we were allocating an array is to get the "missing_keys" variable in scope of the error message generator. Guess what? Arrays kinda take up a lot of memory, so by replacing that with a nil, we save: 35,303 bytes and 886 objects per request
* | | Avoid hash duplication by skipping mutationschneems2015-07-301-2/+2
| | | | | | | | | | | | | | | | | | If we don't mutate the `recall` hash, then there's no reason to duplicate it. While this change doesn't get rid of that many objects, each hash object it gets rid of was massive. Saves 888 string objects per request, 206,013 bytes (thats 0.2 mb which is kinda a lot).
* | | Only allocate new string when neededschneems2015-07-301-1/+7
| | | | | | | | | | | | | | | | | | Instead of calling `sub` on every link_to call for controller, we can detect when the string __needs__ to be allocated and only then create a new string (without the leading slash), otherwise, use the string that is given to us. Saves 888 string objects per request, 35,524 bytes.
* | | Freeze a string in comparatorschneems2015-07-301-1/+1
| | | | | | | | | | | | Saves 888 string objects per request.
* | | Avoid calling to_s on nil in journey/formatterschneems2015-07-301-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | When `defaults[key]` in `generate` in the journey formatter is called, it often returns a `nil` when we call `to_s` on a nil, it allocates an empty string. We can skip this check when the default value is nil. This change buys us 35,431 bytes of memory and 887 fewer objects per request. Thanks to @matthewd for help with the readability
* | | Reduce hash allocations in route_setschneems2015-07-291-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | When generating a url with `url_for` the hash of arguments passed in, is dup-d and merged a TON. I wish I could clean this up better, and might be able to do it in the future. This change removes one dup, since it's literally right after we just dup-d the hash to pass into this constructor. This may be a breaking, change but the tests pass...so :shipit: we can revert if it causes problems This change buys us 205,933 bytes of memory and 887 fewer objects per request.
* | | Decrease route_set allocationsschneems2015-07-291-3/+7
| | | | | | | | | | | | | | | | | | | | | | | | In handle_positional_args `Array#-=` is used which allocates a new array. Instead we can iterate through and delete elements, modifying the array in place. Also `Array#take` allocates a new array. We can build the same by iterating over the other element. This change buys us 106,470 bytes of memory and 2,663 fewer objects per request.
* | | Speed up journey missing_keysschneems2015-07-291-3/+15
| | | | | | | | | | | | | | | | | | | | | | | | Most routes have a `route.path.requirements[key]` of `/[-_.a-zA-Z0-9]+\/[-_.a-zA-Z0-9]+/` yet every time this method is called a new regex is generated on the fly with `/\A#{DEFAULT_INPUT}\Z/`. OBJECT ALLOCATIONS BLERG! This change uses a special module that implements `===` so it can be used in a case statement to pull out the default input. When this happens, we use a pre-generated regex. This change buys us 1,643,465 bytes of memory and 7,990 fewer objects per request.
* | | Speed up journey extract_parameterized_partsschneems2015-07-291-2/+3
| | | | | | | | | | | | | | | | | | | | | | | | Micro optimization: `reverse.drop_while` is slower than `reverse_each.drop_while`. This doesn't save any object allocations. Second, `keys_to_keep` is typically a very small array. The operation `parameterized_parts.keys - keys_to_keep` actually allocates two arrays. It is quicker (I benchmarked) to iterate over each and check inclusion in array manually. This change buys us 1774 fewer objects per request
* | | Decrease string allocations in url_optionsschneems2015-07-291-1/+5
| |/ |/| | | | | | | | | The request.script_name is dup-d which allocates an extra string. It is most commonly an empty string "". We can save a ton of string allocations by checking first if the string is empty, if so we can use a frozen empty string instead of duplicating an empty string. This change buys us 35,714 bytes of memory and 893 fewer objects per request.
* | Tiny documentation edits [ci skip]Robin Dupret2015-07-281-1/+1
| |
* | Add `:nodoc:` for internal testing methods [ci skip]Robin Dupret2015-07-281-1/+1
| |
* | Merge pull request #20590 from vngrs/set_default_charsetRafael Mendonça França2015-07-271-6/+6
|\ \ | | | | | | Document, refactor and create test case for ActionDispatch::Response
| * | Document, refactor and create test case for ↵Mehmet Emin İNAÇ2015-06-171-6/+6
| | | | | | | | | | | | ActionDispatch::Response#charset= method
* | | Merge pull request #21031 from vngrs/fix_params_wrapper_docRafael Mendonça França2015-07-271-3/+3
|\ \ \ | | | | | | | | Fix params_wrapper doc [ci skip]
| * | | Fix params_wrapper doc [ci skip]Mehmet Emin İNAÇ2015-07-261-3/+3
| | |/ | |/| | | | | | | | | | | | | This feature also works with `PUT`, `PATCH` and `DELETE` requests. Also developers can add `:url_encoded_form` and `:multipart_form` into the `:format` for wrapping url encoded or multipart form data.
* / | [ci skip] it should be protect_from_forgeryAditya Kapoor2015-07-271-1/+1
|/ /
* | rm `deep_munge`. You will live on in our hearts (and git history)Aaron Patterson2015-07-213-26/+15
| | | | | | | | | | Now that we have encoding strategies, we can just walk the params hash once to encode as HWIA, and remove nils.
* | push param encoding in to the utils moduleAaron Patterson2015-07-212-14/+30
| | | | | | | | we'll refactor deep munge mostly out of existence shortly