jets.benforeva 3.0.17.pre.mount.pre.fix
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.circleci/config.yml +92 -0
- data/.cody/README.md +13 -0
- data/.cody/docs/bin/build.sh +7 -0
- data/.cody/docs/bin/bundler_setup.sh +8 -0
- data/.cody/docs/bin/cli_docs.sh +6 -0
- data/.cody/docs/bin/git_commit.sh +27 -0
- data/.cody/docs/bin/git_setup.sh +12 -0
- data/.cody/docs/bin/subnav.sh +14 -0
- data/.cody/docs/buildspec.yml +10 -0
- data/.cody/docs/project.rb +10 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +84 -0
- data/.github/ISSUE_TEMPLATE/documentation.md +27 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +64 -0
- data/.github/ISSUE_TEMPLATE/question.md +14 -0
- data/.github/ISSUE_TEMPLATE.md +7 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +50 -0
- data/.gitignore +24 -0
- data/.gitmodules +0 -0
- data/.python-version +1 -0
- data/.rspec +4 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +1035 -0
- data/CONDUCT.md +1 -0
- data/CONTRIBUTING.md +1 -0
- data/Dockerfile +16 -0
- data/Dockerfile.base +53 -0
- data/Gemfile +14 -0
- data/Guardfile +22 -0
- data/LICENSE.txt +22 -0
- data/Procfile +2 -0
- data/README.md +212 -0
- data/Rakefile +24 -0
- data/backers.md +20 -0
- data/bin/release +9 -0
- data/exe/jets.benforeva +14 -0
- data/jets.benforeva.gemspec +71 -0
- data/lib/jets/application/defaults.rb +200 -0
- data/lib/jets/application.rb +240 -0
- data/lib/jets/authorizer/base.rb +36 -0
- data/lib/jets/authorizer/dsl.rb +69 -0
- data/lib/jets/authorizer/helpers/iam_helper.rb +47 -0
- data/lib/jets/autoloaders.rb +112 -0
- data/lib/jets/aws_info.rb +111 -0
- data/lib/jets/aws_services/global_memoist.rb +57 -0
- data/lib/jets/aws_services/s3_bucket.rb +34 -0
- data/lib/jets/aws_services/stack_status.rb +64 -0
- data/lib/jets/aws_services.rb +95 -0
- data/lib/jets/booter.rb +167 -0
- data/lib/jets/builders/code_builder.rb +410 -0
- data/lib/jets/builders/code_size.rb +57 -0
- data/lib/jets/builders/gem_replacer.rb +89 -0
- data/lib/jets/builders/handler_generator.rb +186 -0
- data/lib/jets/builders/lambda_layer.rb +68 -0
- data/lib/jets/builders/md5.rb +60 -0
- data/lib/jets/builders/md5_zip.rb +61 -0
- data/lib/jets/builders/purger.rb +35 -0
- data/lib/jets/builders/rack_packager.rb +51 -0
- data/lib/jets/builders/rackup_wrappers/rackup +19 -0
- data/lib/jets/builders/rackup_wrappers/rackup.rb +7 -0
- data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +16 -0
- data/lib/jets/builders/reconfigure_rails.rb +114 -0
- data/lib/jets/builders/ruby_packager.rb +235 -0
- data/lib/jets/builders/shim_vars/app.rb +78 -0
- data/lib/jets/builders/shim_vars/base.rb +25 -0
- data/lib/jets/builders/shim_vars/shared.rb +37 -0
- data/lib/jets/builders/templates/handler.rb +12 -0
- data/lib/jets/builders/tidy.rb +107 -0
- data/lib/jets/builders/util.rb +31 -0
- data/lib/jets/bundle.rb +88 -0
- data/lib/jets/camelizer.rb +4 -0
- data/lib/jets/cfn/builders/api_deployment_builder.rb +56 -0
- data/lib/jets/cfn/builders/api_gateway_builder.rb +123 -0
- data/lib/jets/cfn/builders/api_resources_builder.rb +44 -0
- data/lib/jets/cfn/builders/authorizer_builder.rb +67 -0
- data/lib/jets/cfn/builders/base_child_builder.rb +69 -0
- data/lib/jets/cfn/builders/controller_builder.rb +50 -0
- data/lib/jets/cfn/builders/function_builder.rb +14 -0
- data/lib/jets/cfn/builders/interface.rb +133 -0
- data/lib/jets/cfn/builders/job_builder.rb +14 -0
- data/lib/jets/cfn/builders/parent_builder/stagger.rb +34 -0
- data/lib/jets/cfn/builders/parent_builder.rb +130 -0
- data/lib/jets/cfn/builders/rule_builder.rb +24 -0
- data/lib/jets/cfn/builders/shared_builder.rb +14 -0
- data/lib/jets/cfn/builders/util/source.rb +21 -0
- data/lib/jets/cfn/built_template.rb +15 -0
- data/lib/jets/cfn/ship.rb +188 -0
- data/lib/jets/cfn/status.rb +10 -0
- data/lib/jets/cfn/template_source.rb +61 -0
- data/lib/jets/cfn/upload.rb +157 -0
- data/lib/jets/cli.rb +208 -0
- data/lib/jets/commands/base.rb +145 -0
- data/lib/jets/commands/build.rb +252 -0
- data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
- data/lib/jets/commands/call/autoload_guesser.rb +136 -0
- data/lib/jets/commands/call/base_guesser.rb +62 -0
- data/lib/jets/commands/call/guesser.rb +48 -0
- data/lib/jets/commands/call.rb +182 -0
- data/lib/jets/commands/clean/base.rb +24 -0
- data/lib/jets/commands/clean/build.rb +13 -0
- data/lib/jets/commands/clean/log.rb +111 -0
- data/lib/jets/commands/clean.rb +19 -0
- data/lib/jets/commands/configure.rb +51 -0
- data/lib/jets/commands/console.rb +12 -0
- data/lib/jets/commands/db/environment-task.rake +3 -0
- data/lib/jets/commands/db/tasks/dummy/app.rb +25 -0
- data/lib/jets/commands/db/tasks/dummy/config.rb +14 -0
- data/lib/jets/commands/db/tasks.rb +34 -0
- data/lib/jets/commands/db.rb +13 -0
- data/lib/jets/commands/dbconsole.rb +134 -0
- data/lib/jets/commands/delete.rb +136 -0
- data/lib/jets/commands/deploy.rb +137 -0
- data/lib/jets/commands/dotenv.rb +9 -0
- data/lib/jets/commands/dynamodb/migrate.rb +9 -0
- data/lib/jets/commands/dynamodb/migrator.rb +36 -0
- data/lib/jets/commands/dynamodb.rb +19 -0
- data/lib/jets/commands/gems.rb +13 -0
- data/lib/jets/commands/help/build.md +6 -0
- data/lib/jets/commands/help/call.md +69 -0
- data/lib/jets/commands/help/clean/build.md +5 -0
- data/lib/jets/commands/help/clean/log.md +5 -0
- data/lib/jets/commands/help/console.md +18 -0
- data/lib/jets/commands/help/db/generate.md +8 -0
- data/lib/jets/commands/help/dbconsole.md +9 -0
- data/lib/jets/commands/help/degenerate.md +16 -0
- data/lib/jets/commands/help/delete.md +22 -0
- data/lib/jets/commands/help/deploy.md +32 -0
- data/lib/jets/commands/help/dynamodb/generate.md +52 -0
- data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
- data/lib/jets/commands/help/gems/check.md +6 -0
- data/lib/jets/commands/help/generate.md +28 -0
- data/lib/jets/commands/help/import/rack.md +13 -0
- data/lib/jets/commands/help/import/rails.md +11 -0
- data/lib/jets/commands/help/new.md +42 -0
- data/lib/jets/commands/help/routes.md +16 -0
- data/lib/jets/commands/help/runner.md +17 -0
- data/lib/jets/commands/help/server.md +15 -0
- data/lib/jets/commands/help/status.md +14 -0
- data/lib/jets/commands/help/upgrade.md +7 -0
- data/lib/jets/commands/help/url.md +6 -0
- data/lib/jets/commands/help.rb +9 -0
- data/lib/jets/commands/import/base.rb +49 -0
- data/lib/jets/commands/import/cheatsheet.rb +35 -0
- data/lib/jets/commands/import/rack.rb +16 -0
- data/lib/jets/commands/import/rails.rb +74 -0
- data/lib/jets/commands/import/sequence.rb +90 -0
- data/lib/jets/commands/import/templates/config/database.yml +30 -0
- data/lib/jets/commands/import/templates/submodules-cheatsheet.md +89 -0
- data/lib/jets/commands/import.rb +12 -0
- data/lib/jets/commands/main.rb +166 -0
- data/lib/jets/commands/markdown/creator.rb +58 -0
- data/lib/jets/commands/markdown/index.rb +27 -0
- data/lib/jets/commands/markdown/page.rb +125 -0
- data/lib/jets/commands/markdown/shell.rb +11 -0
- data/lib/jets/commands/new.rb +173 -0
- data/lib/jets/commands/rake_command.rb +61 -0
- data/lib/jets/commands/rake_tasks.rb +50 -0
- data/lib/jets/commands/runner.rb +16 -0
- data/lib/jets/commands/sequence.rb +105 -0
- data/lib/jets/commands/stack_info.rb +30 -0
- data/lib/jets/commands/templates/skeleton/.env.development.tt +3 -0
- data/lib/jets/commands/templates/skeleton/.env.test +3 -0
- data/lib/jets/commands/templates/skeleton/.env.tt +3 -0
- data/lib/jets/commands/templates/skeleton/.gitignore +12 -0
- data/lib/jets/commands/templates/skeleton/.jetskeep +1 -0
- data/lib/jets/commands/templates/skeleton/.rspec +3 -0
- data/lib/jets/commands/templates/skeleton/Gemfile.tt +39 -0
- data/lib/jets/commands/templates/skeleton/Procfile +7 -0
- data/lib/jets/commands/templates/skeleton/README.md +11 -0
- data/lib/jets/commands/templates/skeleton/Rakefile +2 -0
- data/lib/jets/commands/templates/skeleton/app/controllers/application_controller.rb +2 -0
- data/lib/jets/commands/templates/skeleton/app/helpers/application_helper.rb +2 -0
- data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +4 -0
- data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +2 -0
- data/lib/jets/commands/templates/skeleton/app/models/application_record.rb +3 -0
- data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +26 -0
- data/lib/jets/commands/templates/skeleton/config/application.rb.tt +71 -0
- data/lib/jets/commands/templates/skeleton/config/database.yml.tt +27 -0
- data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +22 -0
- data/lib/jets/commands/templates/skeleton/config/environments/development.rb +7 -0
- data/lib/jets/commands/templates/skeleton/config/environments/production.rb +9 -0
- data/lib/jets/commands/templates/skeleton/config/environments/test.rb +7 -0
- data/lib/jets/commands/templates/skeleton/config/routes.rb +9 -0
- data/lib/jets/commands/templates/skeleton/config.ru +5 -0
- data/lib/jets/commands/templates/skeleton/db/.gitkeep +0 -0
- data/lib/jets/commands/templates/skeleton/public/404.html +67 -0
- data/lib/jets/commands/templates/skeleton/public/422.html +67 -0
- data/lib/jets/commands/templates/skeleton/public/500.html +66 -0
- data/lib/jets/commands/templates/skeleton/public/favicon.ico +0 -0
- data/lib/jets/commands/templates/skeleton/public/index.html.tt +91 -0
- data/lib/jets/commands/templates/skeleton/spec/controllers/posts_controller_spec.rb +15 -0
- data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-index.json +51 -0
- data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-show.json +53 -0
- data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +30 -0
- data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +23 -0
- data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -0
- data/lib/jets/commands/upgrade/templates/bin/webpack +19 -0
- data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +19 -0
- data/lib/jets/commands/upgrade/version1.rb +136 -0
- data/lib/jets/commands/upgrade.rb +105 -0
- data/lib/jets/commands/url.rb +69 -0
- data/lib/jets/commands/webpacker_template.rb +18 -0
- data/lib/jets/controller/authorization.rb +91 -0
- data/lib/jets/controller/base.rb +175 -0
- data/lib/jets/controller/callbacks.rb +73 -0
- data/lib/jets/controller/cookies/jar.rb +269 -0
- data/lib/jets/controller/cookies.rb +38 -0
- data/lib/jets/controller/error/invalid_authenticity_token.rb +6 -0
- data/lib/jets/controller/error.rb +4 -0
- data/lib/jets/controller/forgery_protection.rb +43 -0
- data/lib/jets/controller/layout.rb +17 -0
- data/lib/jets/controller/middleware/cors.rb +60 -0
- data/lib/jets/controller/middleware/local/api_gateway.rb +93 -0
- data/lib/jets/controller/middleware/local/mimic_aws_call.rb +38 -0
- data/lib/jets/controller/middleware/local/route_matcher.rb +22 -0
- data/lib/jets/controller/middleware/local.rb +120 -0
- data/lib/jets/controller/middleware/main.rb +53 -0
- data/lib/jets/controller/middleware/reloader.rb +15 -0
- data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
- data/lib/jets/controller/parameters_filter.rb +29 -0
- data/lib/jets/controller/params.rb +117 -0
- data/lib/jets/controller/rack/adapter.rb +94 -0
- data/lib/jets/controller/rack/env.rb +122 -0
- data/lib/jets/controller/redirection.rb +51 -0
- data/lib/jets/controller/rendering/rack_renderer.rb +267 -0
- data/lib/jets/controller/rendering.rb +96 -0
- data/lib/jets/controller/request.rb +29 -0
- data/lib/jets/controller/response.rb +61 -0
- data/lib/jets/controller/stage.rb +34 -0
- data/lib/jets/controller.rb +3 -0
- data/lib/jets/core.rb +157 -0
- data/lib/jets/core_ext/bundler.rb +7 -0
- data/lib/jets/core_ext/kernel.rb +13 -0
- data/lib/jets/db.rb +15 -0
- data/lib/jets/dotenv/show.rb +11 -0
- data/lib/jets/dotenv/ssm.rb +64 -0
- data/lib/jets/dotenv.rb +48 -0
- data/lib/jets/erb.rb +51 -0
- data/lib/jets/generator/templates/active_job/job/templates/application_job.rb.tt +6 -0
- data/lib/jets/generator/templates/active_job/job/templates/job.rb.tt +8 -0
- data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
- data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +34 -0
- data/lib/jets/generator/templates/erb/scaffold/edit.html.erb +6 -0
- data/lib/jets/generator/templates/erb/scaffold/index.html.erb +29 -0
- data/lib/jets/generator/templates/erb/scaffold/new.html.erb +5 -0
- data/lib/jets/generator/templates/erb/scaffold/show.html.erb +9 -0
- data/lib/jets/generator/templates/rails/assets/javascript.js +2 -0
- data/lib/jets/generator/templates/rails/assets/stylesheet.css +4 -0
- data/lib/jets/generator/templates/rails/controller/controller.rb +13 -0
- data/lib/jets/generator/templates/rails/helper/helper.rb +4 -0
- data/lib/jets/generator/templates/rails/scaffold/scaffold.css +80 -0
- data/lib/jets/generator/templates/rails/scaffold_controller/api_controller.rb +62 -0
- data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +79 -0
- data/lib/jets/generator.rb +112 -0
- data/lib/jets/inflections.rb +32 -0
- data/lib/jets/internal/app/controllers/jets/bare_controller.rb +16 -0
- data/lib/jets/internal/app/controllers/jets/mailers_controller.rb +97 -0
- data/lib/jets/internal/app/controllers/jets/mount_controller.rb +63 -0
- data/lib/jets/internal/app/controllers/jets/public_controller.rb +31 -0
- data/lib/jets/internal/app/controllers/jets/rack_controller.rb +12 -0
- data/lib/jets/internal/app/functions/jets/base_path.rb +18 -0
- data/lib/jets/internal/app/functions/jets/base_path_mapping.rb +100 -0
- data/lib/jets/internal/app/helpers/jets/mailers_helper.rb +9 -0
- data/lib/jets/internal/app/jobs/jets/preheat_job.rb +70 -0
- data/lib/jets/internal/app/shared/functions/jets/s3_bucket_config.rb +33 -0
- data/lib/jets/internal/app/views/jets/mailers/email.html.erb +145 -0
- data/lib/jets/internal/app/views/jets/mailers/index.html.erb +8 -0
- data/lib/jets/internal/app/views/jets/mailers/mailer.html.erb +6 -0
- data/lib/jets/internal/turbines/jets/mailer.rb +52 -0
- data/lib/jets/job/base.rb +49 -0
- data/lib/jets/job/dsl/dynamodb_event.rb +67 -0
- data/lib/jets/job/dsl/event_source_mapping.rb +11 -0
- data/lib/jets/job/dsl/iot_event.rb +24 -0
- data/lib/jets/job/dsl/kinesis_event.rb +46 -0
- data/lib/jets/job/dsl/log_event.rb +15 -0
- data/lib/jets/job/dsl/rule_event.rb +75 -0
- data/lib/jets/job/dsl/s3_event.rb +36 -0
- data/lib/jets/job/dsl/sns_event.rb +54 -0
- data/lib/jets/job/dsl/sqs_event.rb +96 -0
- data/lib/jets/job/dsl.rb +40 -0
- data/lib/jets/job/helpers/kinesis_event_helper.rb +13 -0
- data/lib/jets/job/helpers/log_event_helper.rb +17 -0
- data/lib/jets/job/helpers/s3_event_helper.rb +13 -0
- data/lib/jets/klass.rb +109 -0
- data/lib/jets/lambda/dsl.rb +404 -0
- data/lib/jets/lambda/function.rb +29 -0
- data/lib/jets/lambda/function_constructor.rb +55 -0
- data/lib/jets/lambda/functions.rb +39 -0
- data/lib/jets/lambda/task.rb +111 -0
- data/lib/jets/logger.rb +21 -0
- data/lib/jets/mega/hash_converter.rb +25 -0
- data/lib/jets/mega/request/source.rb +21 -0
- data/lib/jets/mega/request.rb +163 -0
- data/lib/jets/middleware/configurator.rb +84 -0
- data/lib/jets/middleware/default_stack.rb +53 -0
- data/lib/jets/middleware/layer.rb +34 -0
- data/lib/jets/middleware/stack.rb +77 -0
- data/lib/jets/middleware.rb +33 -0
- data/lib/jets/naming.rb +63 -0
- data/lib/jets/overrides/lambda/marshaller.rb +31 -0
- data/lib/jets/overrides/lambda.rb +1 -0
- data/lib/jets/overrides/rails/action_controller.rb +13 -0
- data/lib/jets/overrides/rails/asset_tag_helper.rb +114 -0
- data/lib/jets/overrides/rails/common_methods.rb +13 -0
- data/lib/jets/overrides/rails/migration_checker.rb +34 -0
- data/lib/jets/overrides/rails/rendering_helper.rb +27 -0
- data/lib/jets/overrides/rails/url_helper.rb +88 -0
- data/lib/jets/overrides/rails.rb +6 -0
- data/lib/jets/poly_fun/base_executor.rb +125 -0
- data/lib/jets/poly_fun/lambda_executor.rb +16 -0
- data/lib/jets/poly_fun/node_error.rb +8 -0
- data/lib/jets/poly_fun/node_executor.rb +54 -0
- data/lib/jets/poly_fun/python_error.rb +8 -0
- data/lib/jets/poly_fun/python_executor.rb +23 -0
- data/lib/jets/poly_fun.rb +73 -0
- data/lib/jets/preheat.rb +117 -0
- data/lib/jets/processors/deducer.rb +65 -0
- data/lib/jets/processors/main_processor.rb +61 -0
- data/lib/jets/rack_server.rb +86 -0
- data/lib/jets/rdoc.rb +30 -0
- data/lib/jets/resource/api_gateway/authorizer.rb +82 -0
- data/lib/jets/resource/api_gateway/base_path/function.rb +49 -0
- data/lib/jets/resource/api_gateway/base_path/mapping.rb +44 -0
- data/lib/jets/resource/api_gateway/base_path/role.rb +76 -0
- data/lib/jets/resource/api_gateway/cors.rb +61 -0
- data/lib/jets/resource/api_gateway/deployment.rb +80 -0
- data/lib/jets/resource/api_gateway/domain_name.rb +65 -0
- data/lib/jets/resource/api_gateway/method/authorization.rb +41 -0
- data/lib/jets/resource/api_gateway/method.rb +102 -0
- data/lib/jets/resource/api_gateway/resource.rb +82 -0
- data/lib/jets/resource/api_gateway/rest_api/change_detection.rb +10 -0
- data/lib/jets/resource/api_gateway/rest_api/logical_id/message.rb +49 -0
- data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +98 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +136 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/media_types.rb +36 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/page.rb +93 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/to.rb +25 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/variable.rb +35 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +16 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/collision.rb +121 -0
- data/lib/jets/resource/api_gateway/rest_api/routes.rb +7 -0
- data/lib/jets/resource/api_gateway/rest_api.rb +64 -0
- data/lib/jets/resource/associated.rb +37 -0
- data/lib/jets/resource/base.rb +28 -0
- data/lib/jets/resource/child_stack/api_deployment.rb +58 -0
- data/lib/jets/resource/child_stack/api_gateway.rb +23 -0
- data/lib/jets/resource/child_stack/api_resource/page.rb +20 -0
- data/lib/jets/resource/child_stack/api_resource.rb +54 -0
- data/lib/jets/resource/child_stack/app_class.rb +149 -0
- data/lib/jets/resource/child_stack/authorizer.rb +40 -0
- data/lib/jets/resource/child_stack/base.rb +24 -0
- data/lib/jets/resource/child_stack/common_parameters.rb +14 -0
- data/lib/jets/resource/child_stack/shared.rb +85 -0
- data/lib/jets/resource/config/config_rule.rb +74 -0
- data/lib/jets/resource/config/managed_rule.rb +15 -0
- data/lib/jets/resource/events/rule.rb +31 -0
- data/lib/jets/resource/iam/application_role.rb +27 -0
- data/lib/jets/resource/iam/base_role_definition.rb +47 -0
- data/lib/jets/resource/iam/class_role.rb +74 -0
- data/lib/jets/resource/iam/function_role.rb +54 -0
- data/lib/jets/resource/iam/managed_policy.rb +22 -0
- data/lib/jets/resource/iam/policy_document.rb +41 -0
- data/lib/jets/resource/iot/topic_rule.rb +34 -0
- data/lib/jets/resource/lambda/event_source_mapping.rb +31 -0
- data/lib/jets/resource/lambda/function/environment.rb +62 -0
- data/lib/jets/resource/lambda/function.rb +221 -0
- data/lib/jets/resource/lambda/gem_layer.rb +17 -0
- data/lib/jets/resource/lambda/layer_version.rb +44 -0
- data/lib/jets/resource/logs/subscription_filter.rb +31 -0
- data/lib/jets/resource/permission.rb +45 -0
- data/lib/jets/resource/replacer.rb +85 -0
- data/lib/jets/resource/route53/record_set.rb +98 -0
- data/lib/jets/resource/s3/bucket.rb +24 -0
- data/lib/jets/resource/sns/subscription.rb +29 -0
- data/lib/jets/resource/sns/topic.rb +35 -0
- data/lib/jets/resource/sns/topic_policy.rb +40 -0
- data/lib/jets/resource/sqs/queue.rb +21 -0
- data/lib/jets/resource/standardizer.rb +42 -0
- data/lib/jets/resource.rb +71 -0
- data/lib/jets/router/dsl/mount.rb +13 -0
- data/lib/jets/router/dsl.rb +144 -0
- data/lib/jets/router/error.rb +4 -0
- data/lib/jets/router/finder.rb +47 -0
- data/lib/jets/router/helpers/core_helper.rb +27 -0
- data/lib/jets/router/helpers/named_routes_helper.rb +8 -0
- data/lib/jets/router/helpers.rb +4 -0
- data/lib/jets/router/matcher.rb +81 -0
- data/lib/jets/router/method_creator/code.rb +99 -0
- data/lib/jets/router/method_creator/edit.rb +12 -0
- data/lib/jets/router/method_creator/generic.rb +11 -0
- data/lib/jets/router/method_creator/index.rb +48 -0
- data/lib/jets/router/method_creator/new.rb +12 -0
- data/lib/jets/router/method_creator/root.rb +15 -0
- data/lib/jets/router/method_creator/show.rb +12 -0
- data/lib/jets/router/method_creator.rb +50 -0
- data/lib/jets/router/resources/base.rb +7 -0
- data/lib/jets/router/resources/filter.rb +15 -0
- data/lib/jets/router/resources/options.rb +13 -0
- data/lib/jets/router/route/authorizer.rb +57 -0
- data/lib/jets/router/route.rb +230 -0
- data/lib/jets/router/scope.rb +95 -0
- data/lib/jets/router/util.rb +38 -0
- data/lib/jets/router.rb +180 -0
- data/lib/jets/rule/base.rb +19 -0
- data/lib/jets/rule/dsl.rb +109 -0
- data/lib/jets/spec_helpers/controllers/params.rb +8 -0
- data/lib/jets/spec_helpers/controllers/request.rb +101 -0
- data/lib/jets/spec_helpers/controllers/response.rb +10 -0
- data/lib/jets/spec_helpers/controllers.rb +47 -0
- data/lib/jets/spec_helpers/fixtures.rb +11 -0
- data/lib/jets/spec_helpers.rb +21 -0
- data/lib/jets/stack/builder.rb +43 -0
- data/lib/jets/stack/definition.rb +50 -0
- data/lib/jets/stack/depends/item.rb +26 -0
- data/lib/jets/stack/depends.rb +34 -0
- data/lib/jets/stack/function.rb +69 -0
- data/lib/jets/stack/main/dsl/base.rb +63 -0
- data/lib/jets/stack/main/dsl/cloudwatch.rb +19 -0
- data/lib/jets/stack/main/dsl/iam.rb +8 -0
- data/lib/jets/stack/main/dsl/kinesis.rb +15 -0
- data/lib/jets/stack/main/dsl/lambda.rb +83 -0
- data/lib/jets/stack/main/dsl/s3.rb +12 -0
- data/lib/jets/stack/main/dsl/sns.rb +16 -0
- data/lib/jets/stack/main/dsl/sqs.rb +10 -0
- data/lib/jets/stack/main/dsl.rb +17 -0
- data/lib/jets/stack/main.rb +4 -0
- data/lib/jets/stack/output/dsl.rb +19 -0
- data/lib/jets/stack/output/lookup.rb +36 -0
- data/lib/jets/stack/output.rb +35 -0
- data/lib/jets/stack/parameter/dsl.rb +42 -0
- data/lib/jets/stack/parameter.rb +37 -0
- data/lib/jets/stack/resource/dsl.rb +19 -0
- data/lib/jets/stack/resource.rb +31 -0
- data/lib/jets/stack/s3_event.rb +87 -0
- data/lib/jets/stack.rb +88 -0
- data/lib/jets/tmp_loader.rb +53 -0
- data/lib/jets/turbine.rb +41 -0
- data/lib/jets/turbo/database_yaml.rb +41 -0
- data/lib/jets/turbo/project/.gitignore +12 -0
- data/lib/jets/turbo/project/.jetskeep +1 -0
- data/lib/jets/turbo/project/Gemfile +16 -0
- data/lib/jets/turbo/project/Rakefile +2 -0
- data/lib/jets/turbo/project/app/controllers/application_controller.rb +2 -0
- data/lib/jets/turbo/project/app/helpers/application_helper.rb +2 -0
- data/lib/jets/turbo/project/app/jobs/application_job.rb +4 -0
- data/lib/jets/turbo/project/config/application.rb +5 -0
- data/lib/jets/turbo/project/config/routes.rb +4 -0
- data/lib/jets/turbo/project/config.ru +5 -0
- data/lib/jets/turbo/rails.rb +127 -0
- data/lib/jets/turbo/templates/config/database.yml +30 -0
- data/lib/jets/turbo.rb +56 -0
- data/lib/jets/util.rb +40 -0
- data/lib/jets/version.rb +3 -0
- data/lib/jets.rb +31 -0
- data/readme/prerelease.md +6 -0
- data/readme/testing.md +60 -0
- metadata +1105 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
require 'kramdown'
|
|
2
|
+
|
|
3
|
+
# Handles mimicing of API Gateway to Lambda function call locally
|
|
4
|
+
module Jets::Controller::Middleware
|
|
5
|
+
class Local
|
|
6
|
+
extend Memoist
|
|
7
|
+
|
|
8
|
+
def initialize(app)
|
|
9
|
+
@app = app
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def call(env)
|
|
13
|
+
route = RouteMatcher.new(env).find_route
|
|
14
|
+
unless route
|
|
15
|
+
return [404, {'Content-Type' => 'text/html'}, not_found(env)]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
mimic = MimicAwsCall.new(route, env)
|
|
19
|
+
# Make @controller and @meth instance available so we dont not have to pass it around.
|
|
20
|
+
@controller, @meth, @event = mimic.controller, mimic.meth, mimic.event
|
|
21
|
+
|
|
22
|
+
if route.to == 'jets/rack#process' # megamode
|
|
23
|
+
# Bypass the Jets middlewares since it could interfere with the Rack
|
|
24
|
+
# application's middleware stack.
|
|
25
|
+
#
|
|
26
|
+
# Rails sends back a transfer-encoding=chunked. Curling Rails directly works,
|
|
27
|
+
# but passing the Rails response back through this middleware results in errors.
|
|
28
|
+
# Disable chunking responses by deleting the transfer-encoding response header.
|
|
29
|
+
# Would like to understand why this happens this better, if someone can explain please let me know.
|
|
30
|
+
status, headers, body = @controller.dispatch! # jets/rack_controller
|
|
31
|
+
headers.delete "transfer-encoding"
|
|
32
|
+
[status, headers, body]
|
|
33
|
+
elsif route.to == 'jets/mount#call' # mount route
|
|
34
|
+
status, headers, body = @controller.dispatch! # jets/mount_controller
|
|
35
|
+
[status, headers, body]
|
|
36
|
+
elsif polymorphic_function?
|
|
37
|
+
run_polymophic_function
|
|
38
|
+
else # Normal Jets request
|
|
39
|
+
mimic_aws_lambda!(env, mimic.vars) unless on_aws?(env)
|
|
40
|
+
@app.call(env)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Never hit when calling polymorphic function on AWS Lambda. Can only get called with the local server.
|
|
45
|
+
def polymorphic_function?
|
|
46
|
+
return false if ENV['_HANDLER'] # slight speed improvement on Lambda
|
|
47
|
+
polymorphic_function.task.lang != :ruby
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def polymorphic_function
|
|
51
|
+
# Abusing PolyFun to run polymorphic code, should call LambdaExecutor directly
|
|
52
|
+
# after reworking LambdaExecutor so it has a better interface.
|
|
53
|
+
Jets::PolyFun.new(@controller.class, @meth)
|
|
54
|
+
end
|
|
55
|
+
memoize :polymorphic_function
|
|
56
|
+
|
|
57
|
+
def run_polymophic_function
|
|
58
|
+
resp = polymorphic_function.run(@event, @meth) # polymorphic code
|
|
59
|
+
status = resp['statusCode']
|
|
60
|
+
headers = resp['headers']
|
|
61
|
+
body = StringIO.new(resp['body'])
|
|
62
|
+
[status, headers, body] # triplet
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Modifies env the in the same way real call from AWS lambda would modify env
|
|
66
|
+
def mimic_aws_lambda!(env, vars)
|
|
67
|
+
env.merge!(vars)
|
|
68
|
+
env
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def on_aws?(env)
|
|
72
|
+
return false if Jets.env.test? # usually with test we're passing in full API Gateway fixtures with the HTTP_X_AMZN_TRACE_ID
|
|
73
|
+
return false if ENV['JETS_ELB'] # If we're using an ELB and Jets is inside a container running jets server, we don't want to pretend we're on AWS.
|
|
74
|
+
on_cloud9 = !!(env['HTTP_HOST'] =~ /cloud9\..*\.amazonaws\.com/)
|
|
75
|
+
!!env['HTTP_X_AMZN_TRACE_ID'] && !on_cloud9
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def routes_error_message(env)
|
|
79
|
+
message = "<h2>404 Error: Route #{env['PATH_INFO'].sub('/','')} not found</h2>"
|
|
80
|
+
if Jets.env != "production"
|
|
81
|
+
message << "<p>Here are the routes defined in your application:</p>"
|
|
82
|
+
message << "#{routes_table}"
|
|
83
|
+
end
|
|
84
|
+
message
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def not_found(env)
|
|
88
|
+
message = routes_error_message(env)
|
|
89
|
+
body = <<~HTML
|
|
90
|
+
<!DOCTYPE html>
|
|
91
|
+
<html>
|
|
92
|
+
<head>
|
|
93
|
+
<meta charset="utf-8">
|
|
94
|
+
<title>Route not found</title>
|
|
95
|
+
</head>
|
|
96
|
+
<body>
|
|
97
|
+
#{message}
|
|
98
|
+
</body>
|
|
99
|
+
</html>
|
|
100
|
+
HTML
|
|
101
|
+
StringIO.new(body)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Show pretty route table for user to help with debugging in non-production mode
|
|
105
|
+
def routes_table
|
|
106
|
+
routes = Jets::Router.routes
|
|
107
|
+
|
|
108
|
+
return "Your routes table is empty." if routes.empty?
|
|
109
|
+
|
|
110
|
+
text = "Verb | Path | Controller#action\n"
|
|
111
|
+
text << "--- | --- | ---\n"
|
|
112
|
+
routes.each do |route|
|
|
113
|
+
text << "#{route.method} | #{route.path} | #{route.to}\n"
|
|
114
|
+
end
|
|
115
|
+
html = Kramdown::Document.new(text).to_html
|
|
116
|
+
puts html
|
|
117
|
+
html
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# All roads lead here
|
|
2
|
+
#
|
|
3
|
+
# 1. AWS Lambda: PostsController - Rack::Adapter - Jets.application.call
|
|
4
|
+
# 2. Local server: config.ru - run Jet.application - Jets.application.call
|
|
5
|
+
#
|
|
6
|
+
# Then eventually:
|
|
7
|
+
#
|
|
8
|
+
# Jets.application.call - Middleware stack - Jets::Controller::Middleware::Main
|
|
9
|
+
#
|
|
10
|
+
module Jets::Controller::Middleware
|
|
11
|
+
class Main
|
|
12
|
+
def initialize(env)
|
|
13
|
+
@env = env
|
|
14
|
+
@controller = env['jets.controller']
|
|
15
|
+
@event = env['lambda.event']
|
|
16
|
+
@context = env['lambda.context']
|
|
17
|
+
@meth = env['lambda.meth']
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def call
|
|
21
|
+
ENV['JETS_HOST'] = jets_host # Dirty to use what's essentially a global variable but unsure how else to achieve
|
|
22
|
+
dup.call!
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def call!
|
|
26
|
+
setup
|
|
27
|
+
@controller.dispatch! # Returns triplet
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Common setup logical at this point of middleware processing right before
|
|
31
|
+
# calling any controller actions.
|
|
32
|
+
def setup
|
|
33
|
+
# We already recreated a mimic rack env earlier as part of the very first
|
|
34
|
+
# middleware layer. However, by the time the rack env reaches the main middleware
|
|
35
|
+
# it could had been updated by other middlewares. We update the env here again.
|
|
36
|
+
@controller.request.set_env!(@env)
|
|
37
|
+
# This allows sesison helpers to work. Sessions are managed by
|
|
38
|
+
# the Rack::Session::Cookie middleware by default.
|
|
39
|
+
@controller.session = @env['rack.session'] || {}
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def jets_host
|
|
43
|
+
protocol = @event.dig('headers', 'X-Forwarded-Proto') || @env['rack.url_scheme']
|
|
44
|
+
default = "#{protocol}://#{@env['HTTP_HOST']}"
|
|
45
|
+
Jets.config.helpers.host || default
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def self.call(env)
|
|
49
|
+
instance = new(env)
|
|
50
|
+
instance.call
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require "active_support/parameter_filter"
|
|
2
|
+
|
|
3
|
+
class Jets::Controller
|
|
4
|
+
class ParametersFilter
|
|
5
|
+
attr_reader :filters, :params_filter
|
|
6
|
+
|
|
7
|
+
def initialize(filters)
|
|
8
|
+
@filters = filters
|
|
9
|
+
@params_filter = ActiveSupport::ParameterFilter.new(filters)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def filter(params)
|
|
13
|
+
params && params_filter.filter(params)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def filter_json(json_text)
|
|
17
|
+
return json_text if filters.blank? || json_text.blank?
|
|
18
|
+
|
|
19
|
+
begin
|
|
20
|
+
hash_params = JSON.parse(json_text)
|
|
21
|
+
filtered_params = filter(hash_params)
|
|
22
|
+
JSON.dump(filtered_params)
|
|
23
|
+
rescue JSON::ParserError
|
|
24
|
+
String.new
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
require "action_controller/metal/strong_parameters"
|
|
2
|
+
require "action_dispatch"
|
|
3
|
+
require "rack"
|
|
4
|
+
|
|
5
|
+
class Jets::Controller
|
|
6
|
+
module Params
|
|
7
|
+
extend Memoist
|
|
8
|
+
|
|
9
|
+
# Merge all the parameters together for convenience. Users still have
|
|
10
|
+
# access via events.
|
|
11
|
+
#
|
|
12
|
+
# Precedence:
|
|
13
|
+
# 1. path parameters have highest precdence
|
|
14
|
+
# 2. query string parameters
|
|
15
|
+
# 3. body parameters
|
|
16
|
+
def params(raw: false, path_parameters: true, body_parameters: true)
|
|
17
|
+
params = {}
|
|
18
|
+
params = params.deep_merge(body_params) if body_parameters
|
|
19
|
+
params = params.deep_merge(unescape_recursively(query_params)) # always
|
|
20
|
+
params = params.deep_merge(path_params) if path_parameters
|
|
21
|
+
|
|
22
|
+
if raw
|
|
23
|
+
params
|
|
24
|
+
else
|
|
25
|
+
params = ActionDispatch::Request::Utils.normalize_encode_params(params) # for file uploads
|
|
26
|
+
ActionController::Parameters.new(params)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def unescape_recursively(obj)
|
|
31
|
+
case obj
|
|
32
|
+
when Hash then obj.map { |k, v| [k, unescape_recursively(v)] }.to_h
|
|
33
|
+
when Array then obj.map { |v| unescape_recursively(v) }
|
|
34
|
+
else CGI.unescape(obj.to_s)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def filtered_parameters(**kwargs)
|
|
39
|
+
parameter_filter.filter params(**kwargs, raw: true) # Always filter raw hash
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def path_params
|
|
43
|
+
path_params = event["pathParameters"] || {}
|
|
44
|
+
path_params = path_params.map { |k, path| [k, CGI.unescape(path)] }.to_h
|
|
45
|
+
end
|
|
46
|
+
alias_method :path_parameters, :path_params
|
|
47
|
+
|
|
48
|
+
def query_params
|
|
49
|
+
event["queryStringParameters"] || {}
|
|
50
|
+
end
|
|
51
|
+
alias_method :query_parameters, :query_params
|
|
52
|
+
|
|
53
|
+
def request_params
|
|
54
|
+
{
|
|
55
|
+
controller: controller_name,
|
|
56
|
+
action: action_name,
|
|
57
|
+
}
|
|
58
|
+
end
|
|
59
|
+
alias_method :request_parameters, :request_params
|
|
60
|
+
|
|
61
|
+
def body_params
|
|
62
|
+
body = event['isBase64Encoded'] ? base64_decode(event["body"]) : event["body"]
|
|
63
|
+
return {} if body.nil?
|
|
64
|
+
|
|
65
|
+
parsed_json = parse_json(body)
|
|
66
|
+
return parsed_json if parsed_json
|
|
67
|
+
|
|
68
|
+
headers = event["headers"] || {}
|
|
69
|
+
# API Gateway seems to use either: content-type or Content-Type
|
|
70
|
+
headers = headers.transform_keys { |key| key.downcase }
|
|
71
|
+
content_type = headers["content-type"]
|
|
72
|
+
|
|
73
|
+
if content_type.to_s.include?("application/x-www-form-urlencoded")
|
|
74
|
+
return ::Rack::Utils.parse_nested_query(body)
|
|
75
|
+
elsif content_type.to_s.include?("multipart/form-data")
|
|
76
|
+
return parse_multipart(body)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
{} # fallback to empty Hash
|
|
80
|
+
end
|
|
81
|
+
memoize :body_params
|
|
82
|
+
alias_method :body_parameters, :body_params
|
|
83
|
+
|
|
84
|
+
private
|
|
85
|
+
|
|
86
|
+
def parse_multipart(body)
|
|
87
|
+
boundary = ::Rack::Multipart::Parser.parse_boundary(headers["content-type"])
|
|
88
|
+
options = multipart_options(body, boundary)
|
|
89
|
+
env = ::Rack::MockRequest.env_for("/", options)
|
|
90
|
+
::Rack::Multipart.parse_multipart(env) # params Hash
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def multipart_options(data, boundary = "AaB03x")
|
|
94
|
+
type = %(multipart/form-data; boundary=#{boundary})
|
|
95
|
+
length = data.bytesize
|
|
96
|
+
|
|
97
|
+
{ "CONTENT_TYPE" => type,
|
|
98
|
+
"CONTENT_LENGTH" => length.to_s,
|
|
99
|
+
:input => StringIO.new(data) }
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def parse_json(text)
|
|
103
|
+
JSON.parse(text)
|
|
104
|
+
rescue JSON::ParserError
|
|
105
|
+
nil
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def base64_decode(body)
|
|
109
|
+
return nil if body.nil?
|
|
110
|
+
Base64.decode64(body)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def parameter_filter
|
|
114
|
+
@parameter_filter ||= ParametersFilter.new Jets.config.controllers.filtered_parameters
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
require 'base64'
|
|
2
|
+
|
|
3
|
+
module Jets::Controller::Rack
|
|
4
|
+
class Adapter
|
|
5
|
+
extend Memoist
|
|
6
|
+
|
|
7
|
+
# Returns back API Gateway response hash structure
|
|
8
|
+
def self.process(event, context, meth)
|
|
9
|
+
adapter = new(event, context, meth)
|
|
10
|
+
adapter.process
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def initialize(event, context, meth)
|
|
14
|
+
@event, @context, @meth = event, context, meth
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# 1. Convert API Gateway event event to Rack env
|
|
18
|
+
# 2. Process using full Rack middleware stack
|
|
19
|
+
# 3. Convert back to API gateway response structure payload
|
|
20
|
+
def process
|
|
21
|
+
status, headers, body = Jets.application.call(env)
|
|
22
|
+
convert_to_api_gateway(status, headers, body)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def env
|
|
26
|
+
Env.new(@event, @context, adapter: true).convert # convert to Rack env
|
|
27
|
+
end
|
|
28
|
+
memoize :env
|
|
29
|
+
|
|
30
|
+
# Transform the structure to AWS_PROXY compatible structure
|
|
31
|
+
# http://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-output-format
|
|
32
|
+
def convert_to_api_gateway(status, headers, body)
|
|
33
|
+
base64 = headers["x-jets-base64"] == 'yes'
|
|
34
|
+
body = body.respond_to?(:read) ? body.read : body
|
|
35
|
+
body = Base64.encode64(body) if base64
|
|
36
|
+
|
|
37
|
+
{}.tap do |resp|
|
|
38
|
+
resp['statusCode'] = status
|
|
39
|
+
resp['body'] = body
|
|
40
|
+
resp['isBase64Encoded'] = base64
|
|
41
|
+
add_response_headers(resp, headers)
|
|
42
|
+
adjust_for_elb(resp)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def add_response_headers(resp, headers)
|
|
47
|
+
resp['headers'] = headers.reject { |_, val| val.is_a?(Array) }
|
|
48
|
+
multi_value_headers = headers.select { |_, val| val.is_a?(Array) }
|
|
49
|
+
|
|
50
|
+
resp['multiValueHeaders'] = multi_value_headers unless multi_value_headers.blank?
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Note: ELB is not officially support. This is just in case users wish to manually
|
|
54
|
+
# connect ELBs to the functions created by Jets.
|
|
55
|
+
def adjust_for_elb(resp)
|
|
56
|
+
return resp unless from_elb?
|
|
57
|
+
|
|
58
|
+
# ELB requires statusCode to be an Integer whereas API Gateway requires statusCode to be a String
|
|
59
|
+
status = resp["statusCode"] = resp["statusCode"].to_i
|
|
60
|
+
|
|
61
|
+
# ELB also requires statusDescription attribute
|
|
62
|
+
status_desc = Rack::Utils::HTTP_STATUS_CODES[status]
|
|
63
|
+
status_desc = status_desc.nil? ? status.to_s : "#{status} #{status_desc}"
|
|
64
|
+
resp["statusDescription"] = status_desc
|
|
65
|
+
|
|
66
|
+
resp
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def from_elb?
|
|
70
|
+
# NOTE: @event["requestContext"]["elb"] is set when the request is coming from an elb
|
|
71
|
+
# Can set JETS_ELB=1 for local testing
|
|
72
|
+
@event["requestContext"] && @event["requestContext"]["elb"] || ENV['JETS_ELB']
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Called from Jets::Controller::Base.process. Example:
|
|
76
|
+
#
|
|
77
|
+
# adapter.rack_vars(
|
|
78
|
+
# 'jets.controller' => self,
|
|
79
|
+
# 'lambda.context' => context,
|
|
80
|
+
# 'lambda.event' => event,
|
|
81
|
+
# 'lambda.meth' => meth,
|
|
82
|
+
# )
|
|
83
|
+
#
|
|
84
|
+
# Passes a these special variables so we have access to them in the middleware.
|
|
85
|
+
# The controller instance is called in the Main middleware.
|
|
86
|
+
# The lambda.* info is used by the Rack::Local middleware to create a mimiced
|
|
87
|
+
# controller for the local server.
|
|
88
|
+
#
|
|
89
|
+
def rack_vars(vars)
|
|
90
|
+
env.merge!(vars)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
end
|
|
94
|
+
end
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
require 'rack'
|
|
2
|
+
require 'base64'
|
|
3
|
+
|
|
4
|
+
# Takes an ApiGateway event and converts it to an Rack env that can be used for
|
|
5
|
+
# rack.call(env).
|
|
6
|
+
module Jets::Controller::Rack
|
|
7
|
+
class Env
|
|
8
|
+
def initialize(event, context, options={})
|
|
9
|
+
@event, @context, @options = event, context, options
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def convert
|
|
13
|
+
options = {}
|
|
14
|
+
options = add_top_level(options)
|
|
15
|
+
options = add_http_headers(options)
|
|
16
|
+
path = path_with_base_path || @event['path'] || '/' # always set by API Gateway but might not be when testing shim, so setting it to make testing easier
|
|
17
|
+
|
|
18
|
+
env = Rack::MockRequest.env_for(path, options)
|
|
19
|
+
if @options[:adapter]
|
|
20
|
+
env['adapter.event'] = @event
|
|
21
|
+
env['adapter.context'] = @context
|
|
22
|
+
end
|
|
23
|
+
env
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
def path_with_base_path
|
|
28
|
+
resource = @event['resource']
|
|
29
|
+
pathParameters = @event['pathParameters']
|
|
30
|
+
|
|
31
|
+
if(!pathParameters.nil? and !resource.nil?)
|
|
32
|
+
resource = pathParameters.reduce(resource) {|resource, parameter|
|
|
33
|
+
key, value = parameter
|
|
34
|
+
resource = resource.gsub("{#{key}+}", value)
|
|
35
|
+
resource = resource.gsub("{#{key}}", value)
|
|
36
|
+
resource
|
|
37
|
+
}
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
resource
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def add_top_level(options)
|
|
44
|
+
map = {
|
|
45
|
+
'CONTENT_TYPE' => content_type,
|
|
46
|
+
'QUERY_STRING' => query_string,
|
|
47
|
+
'REMOTE_ADDR' => headers['X-Forwarded-For'],
|
|
48
|
+
'REMOTE_HOST' => headers['Host'],
|
|
49
|
+
'REQUEST_METHOD' => @event['httpMethod'] || 'GET', # useful to default to GET when testing with Lambda console
|
|
50
|
+
'REQUEST_PATH' => @event['path'],
|
|
51
|
+
'REQUEST_URI' => request_uri,
|
|
52
|
+
'SCRIPT_NAME' => "",
|
|
53
|
+
'SERVER_NAME' => headers['Host'],
|
|
54
|
+
'SERVER_PORT' => headers['X-Forwarded-Port'],
|
|
55
|
+
'SERVER_PROTOCOL' => "HTTP/1.1", # unsure if this should be set
|
|
56
|
+
'SERVER_SOFTWARE' => "WEBrick/1.3.1 (Ruby/2.2.2/2015-04-13)",
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
map['CONTENT_LENGTH'] = content_length if content_length
|
|
60
|
+
# Even if not set, Rack always assigns an StringIO to "rack.input"
|
|
61
|
+
map['rack.input'] = StringIO.new(body) if body
|
|
62
|
+
|
|
63
|
+
options.merge(map)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def content_type
|
|
67
|
+
headers['Content-Type'] || Jets::Controller::DEFAULT_CONTENT_TYPE
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def content_length
|
|
71
|
+
bytesize = body.bytesize.to_s if body
|
|
72
|
+
headers['Content-Length'] || bytesize
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Decoding base64 from API Gateaway if necessary
|
|
76
|
+
# Rack will be none the wiser
|
|
77
|
+
def body
|
|
78
|
+
if @event['isBase64Encoded']
|
|
79
|
+
Base64.decode64(@event['body'])
|
|
80
|
+
else
|
|
81
|
+
@event['body']
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def add_http_headers(options)
|
|
86
|
+
headers.each do |k,v|
|
|
87
|
+
# content-type => HTTP_CONTENT_TYPE
|
|
88
|
+
key = k.gsub('-','_').upcase
|
|
89
|
+
key = "HTTP_#{key}"
|
|
90
|
+
options[key] = v
|
|
91
|
+
end
|
|
92
|
+
options
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def request_uri
|
|
96
|
+
# IE: "http://localhost:8888/posts/tung/edit?foo=bar"
|
|
97
|
+
proto = headers['X-Forwarded-Proto']
|
|
98
|
+
host = headers['Host']
|
|
99
|
+
port = headers['X-Forwarded-Port']
|
|
100
|
+
|
|
101
|
+
# Add port if needed
|
|
102
|
+
if proto == 'https' && port != '443' or
|
|
103
|
+
proto == 'http' && port != '80'
|
|
104
|
+
host = "#{host}:#{port}"
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
path = @event['path']
|
|
108
|
+
qs = "?#{query_string}" unless query_string.empty?
|
|
109
|
+
"#{proto}://#{host}#{path}#{qs}"
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def query_string
|
|
113
|
+
qs_params = @event["queryStringParameters"] || {} # always set with API Gateway but when testing node shim might not be
|
|
114
|
+
hash = Jets::Mega::HashConverter.encode(qs_params)
|
|
115
|
+
hash.to_query
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def headers
|
|
119
|
+
@event['headers'] || {}
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
class Jets::Controller
|
|
2
|
+
module Redirection
|
|
3
|
+
# redirect_to "/posts", :status => 301
|
|
4
|
+
# redirect_to :action=>'atom', :status => 302
|
|
5
|
+
def redirect_to(url, options={})
|
|
6
|
+
unless url.is_a?(String)
|
|
7
|
+
raise "redirect_to url parameter must be a String. Please pass in a string"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
redirect_url = add_stage(url)
|
|
11
|
+
redirect_url = ensure_protocol(redirect_url)
|
|
12
|
+
|
|
13
|
+
aws_proxy = Rendering::RackRenderer.new(self,
|
|
14
|
+
status: options[:status] || 302,
|
|
15
|
+
headers: { "Location" => redirect_url },
|
|
16
|
+
body: "",
|
|
17
|
+
isBase64Encoded: false,
|
|
18
|
+
)
|
|
19
|
+
resp = aws_proxy.render
|
|
20
|
+
# redirect is a type of rendering
|
|
21
|
+
@rendered = true
|
|
22
|
+
@rendered_data = resp
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def redirect_back(fallback_location: '/')
|
|
26
|
+
location = request.headers["referer"] || fallback_location
|
|
27
|
+
redirect_to(location)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def ensure_protocol(url)
|
|
31
|
+
return url if url.starts_with?('http')
|
|
32
|
+
|
|
33
|
+
# annoying but the request payload is different with localhost/rack vs
|
|
34
|
+
# api gateway
|
|
35
|
+
# check out:
|
|
36
|
+
# spec/fixtures/dumps/api_gateway/posts/create.json
|
|
37
|
+
# spec/fixtures/dumps/rack/posts/create.json
|
|
38
|
+
protocol = if headers["x-forwarded-proto"] # API Gateway
|
|
39
|
+
headers["x-forwarded-proto"]
|
|
40
|
+
elsif headers["origin"] # Rack / localhost
|
|
41
|
+
URI.parse(headers["origin"]).scheme
|
|
42
|
+
else
|
|
43
|
+
"http" # fallback. Capybara / Selenium tests
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
raise "Invalid protocol #{protocol}" unless protocol.starts_with?('http')
|
|
47
|
+
|
|
48
|
+
"#{protocol}://#{url}"
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|