aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_dispatch/middleware
Commit message (Collapse)AuthorAgeFilesLines
* stop inheriting from Rack::RequestAaron Patterson2015-09-043-4/+4
| | | | | | Just include the modules necessary in the Request object to implement the things we need. This should make it easier to build delegate request objects because the API is smaller
* use `Rack::Utils.unescape_path` to unescape pathsAaron Patterson2015-09-041-3/+3
| | | | | | Escaping and unescaping paths is different than query parameters, and we need to respect that. This commit uses the new method in Rack to escape and unescape paths. Fixes #11816
* Fix bug where cookies mutated by request were not persistedeileencodes2015-09-011-0/+7
| | | | | | | | | | | | | | | With changes made in 8363b8 and ae29142 cookies that are mutated on the request like `cookies.signed = x` were not retained in subsequent tests, breaking cookie authentiation in controller tests. The test added demonstrates the issue. The reason we need to select from non-deleted cookies is because without checking the `@delete_cookies` the `cookie_jar` `@cookies` will send the wrong cookies to be updated. The code must check for `@deleted_cookies` before sending an `#update` with the requests cookie_jar cookies. This follows how the cookie_jar cookies from the request were updated before these changes.
* Remove unused requiresMarcin Olichwirowicz2015-08-251-2/+0
| | | | They are already required in `actionpack/lib/action_dispatch.rb` (L25-L26)
* Make `assert_index` privateMarcin Olichwirowicz2015-08-251-3/+1
| | | | | This `protected` keyword looks like some leftover, since we are not using explicit receiver, this should go under `private`
* Remove unused block argumentsamitkumarsuroliya2015-08-251-1/+1
|
* stop using `@env` in the GET / POST methodsAaron Patterson2015-08-241-2/+4
| | | | | I want to implement this with something besides `@env` in the future, so lets stop directly referencing it.
* use methods on the request object instead of accessing envAaron Patterson2015-08-231-7/+7
|
* use `Request#path_info` instead of direct ENV accessAaron Patterson2015-08-231-1/+1
| | | | | we already have a request, so we should use the methods on the request to access the path info information
* remove env access from debug_exceptionsAaron Patterson2015-08-231-10/+9
| | | | Creates fewer request objects and helps to abstract away from internals
* convert more `@env` access to get / set headerAaron Patterson2015-08-231-11/+13
|
* remove usage of `@env`Aaron Patterson2015-08-231-3/+5
| | | | | try to remove dependencies on `@env` so we can have more flexible internals
* use a request object in the session middlewareAaron Patterson2015-08-223-22/+26
| | | | | This commit allows us to use one request object rather than allocating multiple request objects to deal with the session.
* Cleanup ActionDispatch:ParamsParserMarcin Olichwirowicz2015-08-171-2/+11
|
* finish deprecating handling strings and symbolsAaron Patterson2015-08-071-19/+4
| | | | | since we only work with instances of classes, it greatly simplifies the `Middleware` implementation.
* Using strings or symbols for middleware class names is deprecated.Aaron Patterson2015-08-071-18/+25
| | | | | | | | | | Convert things like this: middleware.use "Foo::Bar" to this: middleware.use Foo::Bar
* simplify the Middleware constructorAaron Patterson2015-08-071-10/+13
| | | | | | We should do the hard work outside the constructor. Also fix the tests to not directly construct middleware objects, but to go through the stack object.
* use Proc.new to reduce some conditionalsAaron Patterson2015-08-071-3/+1
| | | | | | Proc.new will pick up the passed in block, but since it's a default param, it won't get evaluated unless someone doesn't pass in an app. It will raise an exception if no block is provided.
* refactor param parsing middleware to use request objectsAaron Patterson2015-08-071-10/+9
| | | | | this is another place that we should stop directly accessing the env hash and let the request object take care of that for us
* move flash hash access to methods on the request objectAaron Patterson2015-08-071-2/+11
|
* use a request object to access info from env in GetIpAaron Patterson2015-08-061-10/+12
| | | | | | | again, we want to hide the contents of `env` from the implementation. Allocate a request object to access the contents of env, but save allocations due to string literal allocations when accessing the env hash.
* ask the request if we should show exceptionsAaron Patterson2015-08-062-4/+6
| | | | | hide the env key in the request object so that other code doesn't need to know.
* ExceptionWrapper doesn't need to know about `env`Aaron Patterson2015-08-063-9/+7
| | | | | | ExceptionWrapper only cares about the backtrace cleaner, so lets just pass the cleaner to the wrapper. It does not need to know that env exists or what key the backtrace cleaner is stored in
* 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.
* use a request object to reduce string allocations and not know about ENV keysAaron Patterson2015-08-061-6/+7
|
* 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-061-1/+7
|
* 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-051-6/+4
|
* remove @secure ivarAaron Patterson2015-08-051-5/+3
|
* CookieJar does not need the key_generator parameter anymoreAaron Patterson2015-08-051-3/+2
|
* eliminate key_generator ivarAaron Patterson2015-08-051-11/+14
|
* sop passing host and secure to the build methodAaron Patterson2015-08-051-2/+4
| | | | | 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-051-38/+30
| | | | | | | | 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-051-13/+45
| | | | | | 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)
* rm `deep_munge`. You will live on in our hearts (and git history)Aaron Patterson2015-07-211-1/+1
| | | | | Now that we have encoding strategies, we can just walk the params hash once to encode as HWIA, and remove nils.
* Freeze string literals when not mutated.schneems2015-07-191-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | I wrote a utility that helps find areas where you could optimize your program using a frozen string instead of a string literal, it's called [let_it_go](https://github.com/schneems/let_it_go). After going through the output and adding `.freeze` I was able to eliminate the creation of 1,114 string objects on EVERY request to [codetriage](codetriage.com). How does this impact execution? To look at memory: ```ruby require 'get_process_mem' mem = GetProcessMem.new GC.start GC.disable 1_114.times { " " } before = mem.mb after = mem.mb GC.enable puts "Diff: #{after - before} mb" ``` Creating 1,114 string objects results in `Diff: 0.03125 mb` of RAM allocated on every request. Or 1mb every 32 requests. To look at raw speed: ```ruby require 'benchmark/ips' number_of_objects_reduced = 1_114 Benchmark.ips do |x| x.report("freeze") { number_of_objects_reduced.times { " ".freeze } } x.report("no-freeze") { number_of_objects_reduced.times { " " } } end ``` We get the results ``` Calculating ------------------------------------- freeze 1.428k i/100ms no-freeze 609.000 i/100ms ------------------------------------------------- freeze 14.363k (± 8.5%) i/s - 71.400k no-freeze 6.084k (± 8.1%) i/s - 30.450k ``` Now we can do some maths: ```ruby ips = 6_226k # iterations / 1 second call_time_before = 1.0 / ips # seconds per iteration ips = 15_254 # iterations / 1 second call_time_after = 1.0 / ips # seconds per iteration diff = call_time_before - call_time_after number_of_objects_reduced * diff * 100 # => 0.4530373333993266 miliseconds saved per request ``` So we're shaving off 1 second of execution time for every 220 requests. Is this going to be an insane speed boost to any Rails app: nope. Should we merge it: yep. p.s. If you know of a method call that doesn't modify a string input such as [String#gsub](https://github.com/schneems/let_it_go/blob/b0e2da69f0cca87ab581022baa43291cdf48638c/lib/let_it_go/core_ext/string.rb#L37) please [give me a pull request to the appropriate file](https://github.com/schneems/let_it_go/blob/b0e2da69f0cca87ab581022baa43291cdf48638c/lib/let_it_go/core_ext/string.rb#L37), or open an issue in LetItGo so we can track and freeze more strings. Keep those strings Frozen ![](https://www.dropbox.com/s/z4dj9fdsv213r4v/let-it-go.gif?dl=1)
* Merge pull request #17102 from matthewd/load-interlockAaron Patterson2015-07-101-0/+21
|\ | | | | Concurrent load interlock (rm Rack::Lock)
| * Fix the Interlock middlewareMatthew Draper2015-07-091-5/+14
| | | | | | | | | | We can't actually lean on Rack::Lock's implementation, so we'll just copy it instead. It's simple enough that that's not too troubling.
| * Soften the lock requirements when eager_load is disabledMatthew Draper2015-07-091-0/+12
| | | | | | | | | | We don't need to fully disable concurrent requests: just ensure that loads are performed in isolation.
* | start disconnecting the parameter parser from the instanceAaron Patterson2015-07-101-3/+3
| | | | | | | | | | pass in the instance variable to start decoupling the meat of the parser from the instance of the middleware
* | drop a conditional by always assigningAaron Patterson2015-07-101-6/+5
| | | | | | | | | | We will always make an assignment to the env hash and eliminate a conditional
* | drop runtime conditionals in parameter parsingAaron Patterson2015-07-091-13/+9
|/ | | | | If we only deal with proc objects, then we can eliminate type checking in the parameter parsing middleware
* Send cookies with requesteileencodes2015-07-071-0/+4
|
* Refactor cookie_jar to decouple it from request objecteileencodes2015-07-051-7/+3
| | | | | | This change decouples `cookie_jar` allocation from the request object. We need this for moving controller tests to integration tests so we can access the `cookie_jar` object separately.
* ActionDispatch::SSL should keep original header's behaviorFumiaki MATSUSHIMA2015-06-141-1/+1
| | | | | | `ActionDispatch::SSL` changes headers to `Hash`. So some headers will be broken if there are some middlewares on ActionDispatch::SSL and if it uses `Rack::Utils::HeaderHash`.
* Handle param-parsing errors from Rack in ExceptionWrapperGrey Baker2015-06-121-1/+3
|
* Change the `index` arg of `ActionDispatch::Static#new` to a kwargYuki Nishijima2015-06-111-4/+3
|
* pass check_ip and proxies to GetIp constructorAaron Patterson2015-06-031-4/+4
| | | | | The `GetIp` class doesn't need to keep a reference to the middleware, so there is no reason to pass the middleware instance to the `GetIp` class