diff --git a/doc/configuration.md b/doc/configuration.md index 9847ce58..237cb160 100644 --- a/doc/configuration.md +++ b/doc/configuration.md @@ -96,6 +96,8 @@ Listed below are all configuration options. * `http_read_timeout`:The number of seconds to wait for HTTP response data. Default option value is `nil`. If not specified effected value is `60` +* `http_proxy`: A proxy to send requests through. Formatted like + `'http://proxy.com:1234'`. Default option value is `nil` * `create_table_on_save`: if `true` then Dynamoid creates a corresponding table in DynamoDB at model persisting if the table doesn't exist yet. Default is `true` diff --git a/lib/dynamoid/adapter_plugin/aws_sdk_v3.rb b/lib/dynamoid/adapter_plugin/aws_sdk_v3.rb index 4b7a6c70..fd03a7e6 100644 --- a/lib/dynamoid/adapter_plugin/aws_sdk_v3.rb +++ b/lib/dynamoid/adapter_plugin/aws_sdk_v3.rb @@ -44,71 +44,7 @@ class AwsSdkV3 } BATCH_WRITE_ITEM_REQUESTS_LIMIT = 25 - CONNECTION_CONFIG_OPTIONS = %i[endpoint region http_continue_timeout http_idle_timeout http_open_timeout http_read_timeout].freeze - - # See https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html - # rubocop:disable-next Metrics/CollectionLiteralLength - RESERVED_WORDS = Set.new( - %i[ - ABORT ABSOLUTE ACTION ADD AFTER AGENT AGGREGATE ALL ALLOCATE ALTER ANALYZE - AND ANY ARCHIVE ARE ARRAY AS ASC ASCII ASENSITIVE ASSERTION ASYMMETRIC AT - ATOMIC ATTACH ATTRIBUTE AUTH AUTHORIZATION AUTHORIZE AUTO AVG BACK BACKUP - BASE BATCH BEFORE BEGIN BETWEEN BIGINT BINARY BIT BLOB BLOCK BOOLEAN BOTH - BREADTH BUCKET BULK BY BYTE CALL CALLED CALLING CAPACITY CASCADE CASCADED - CASE CAST CATALOG CHAR CHARACTER CHECK CLASS CLOB CLOSE CLUSTER CLUSTERED - CLUSTERING CLUSTERS COALESCE COLLATE COLLATION COLLECTION COLUMN COLUMNS - COMBINE COMMENT COMMIT COMPACT COMPILE COMPRESS CONDITION CONFLICT CONNECT - CONNECTION CONSISTENCY CONSISTENT CONSTRAINT CONSTRAINTS CONSTRUCTOR - CONSUMED CONTINUE CONVERT COPY CORRESPONDING COUNT COUNTER CREATE CROSS - CUBE CURRENT CURSOR CYCLE DATA DATABASE DATE DATETIME DAY DEALLOCATE DEC - DECIMAL DECLARE DEFAULT DEFERRABLE DEFERRED DEFINE DEFINED DEFINITION - DELETE DELIMITED DEPTH DEREF DESC DESCRIBE DESCRIPTOR DETACH DETERMINISTIC - DIAGNOSTICS DIRECTORIES DISABLE DISCONNECT DISTINCT DISTRIBUTE DO DOMAIN - DOUBLE DROP DUMP DURATION DYNAMIC EACH ELEMENT ELSE ELSEIF EMPTY ENABLE - END EQUAL EQUALS ERROR ESCAPE ESCAPED EVAL EVALUATE EXCEEDED EXCEPT - EXCEPTION EXCEPTIONS EXCLUSIVE EXEC EXECUTE EXISTS EXIT EXPLAIN EXPLODE - EXPORT EXPRESSION EXTENDED EXTERNAL EXTRACT FAIL FALSE FAMILY FETCH FIELDS - FILE FILTER FILTERING FINAL FINISH FIRST FIXED FLATTERN FLOAT FOR FORCE - FOREIGN FORMAT FORWARD FOUND FREE FROM FULL FUNCTION FUNCTIONS GENERAL - GENERATE GET GLOB GLOBAL GO GOTO GRANT GREATER GROUP GROUPING HANDLER HASH - HAVE HAVING HEAP HIDDEN HOLD HOUR IDENTIFIED IDENTITY IF IGNORE IMMEDIATE - IMPORT IN INCLUDING INCLUSIVE INCREMENT INCREMENTAL INDEX INDEXED INDEXES - INDICATOR INFINITE INITIALLY INLINE INNER INNTER INOUT INPUT INSENSITIVE - INSERT INSTEAD INT INTEGER INTERSECT INTERVAL INTO INVALIDATE IS ISOLATION - ITEM ITEMS ITERATE JOIN KEY KEYS LAG LANGUAGE LARGE LAST LATERAL LEAD - LEADING LEAVE LEFT LENGTH LESS LEVEL LIKE LIMIT LIMITED LINES LIST LOAD - LOCAL LOCALTIME LOCALTIMESTAMP LOCATION LOCATOR LOCK LOCKS LOG LOGED LONG - LOOP LOWER MAP MATCH MATERIALIZED MAX MAXLEN MEMBER MERGE METHOD METRICS - MIN MINUS MINUTE MISSING MOD MODE MODIFIES MODIFY MODULE MONTH MULTI - MULTISET NAME NAMES NATIONAL NATURAL NCHAR NCLOB NEW NEXT NO NONE NOT NULL - NULLIF NUMBER NUMERIC OBJECT OF OFFLINE OFFSET OLD ON ONLINE ONLY OPAQUE - OPEN OPERATOR OPTION OR ORDER ORDINALITY OTHER OTHERS OUT OUTER OUTPUT - OVER OVERLAPS OVERRIDE OWNER PAD PARALLEL PARAMETER PARAMETERS PARTIAL - PARTITION PARTITIONED PARTITIONS PATH PERCENT PERCENTILE PERMISSION - PERMISSIONS PIPE PIPELINED PLAN POOL POSITION PRECISION PREPARE PRESERVE - PRIMARY PRIOR PRIVATE PRIVILEGES PROCEDURE PROCESSED PROJECT PROJECTION - PROPERTY PROVISIONING PUBLIC PUT QUERY QUIT QUORUM RAISE RANDOM RANGE RANK - RAW READ READS REAL REBUILD RECORD RECURSIVE REDUCE REF REFERENCE - REFERENCES REFERENCING REGEXP REGION REINDEX RELATIVE RELEASE REMAINDER - RENAME REPEAT REPLACE REQUEST RESET RESIGNAL RESOURCE RESPONSE RESTORE - RESTRICT RESULT RETURN RETURNING RETURNS REVERSE REVOKE RIGHT ROLE ROLES - ROLLBACK ROLLUP ROUTINE ROW ROWS RULE RULES SAMPLE SATISFIES SAVE SAVEPOINT - SCAN SCHEMA SCOPE SCROLL SEARCH SECOND SECTION SEGMENT SEGMENTS SELECT SELF - SEMI SENSITIVE SEPARATE SEQUENCE SERIALIZABLE SESSION SET SETS SHARD SHARE - SHARED SHORT SHOW SIGNAL SIMILAR SIZE SKEWED SMALLINT SNAPSHOT SOME SOURCE - SPACE SPACES SPARSE SPECIFIC SPECIFICTYPE SPLIT SQL SQLCODE SQLERROR - SQLEXCEPTION SQLSTATE SQLWARNING START STATE STATIC STATUS STORAGE STORE - STORED STREAM STRING STRUCT STYLE SUB SUBMULTISET SUBPARTITION SUBSTRING - SUBTYPE SUM SUPER SYMMETRIC SYNONYM SYSTEM TABLE TABLESAMPLE TEMP TEMPORARY - TERMINATED TEXT THAN THEN THROUGHPUT TIME TIMESTAMP TIMEZONE TINYINT TO - TOKEN TOTAL TOUCH TRAILING TRANSACTION TRANSFORM TRANSLATE TRANSLATION - TREAT TRIGGER TRIM TRUE TRUNCATE TTL TUPLE TYPE UNDER UNDO UNION UNIQUE UNIT - UNKNOWN UNLOGGED UNNEST UNPROCESSED UNSIGNED UNTIL UPDATE UPPER URL USAGE - USE USER USERS USING UUID VACUUM VALUE VALUED VALUES VARCHAR VARIABLE - VARIANCE VARINT VARYING VIEW VIEWS VIRTUAL VOID WAIT WHEN WHENEVER WHERE - WHILE WINDOW WITH WITHIN WITHOUT WORK WRAPPED WRITE YEAR ZONE - ] - ).freeze + CONNECTION_CONFIG_OPTIONS = %i[endpoint region http_continue_timeout http_idle_timeout http_open_timeout http_read_timeout http_proxy].freeze attr_reader :table_cache diff --git a/lib/dynamoid/config.rb b/lib/dynamoid/config.rb index 38e45da7..5755397c 100644 --- a/lib/dynamoid/config.rb +++ b/lib/dynamoid/config.rb @@ -62,6 +62,7 @@ module Config option :http_idle_timeout, default: nil # - default: 5 option :http_open_timeout, default: nil # - default: 15 option :http_read_timeout, default: nil # - default: 60 + option :http_proxy, default: nil option :create_table_on_save, default: true # The default logger for Dynamoid: either the Rails logger or just stdout. diff --git a/spec/dynamoid/adapter_plugin/aws_sdk_v3_spec.rb b/spec/dynamoid/adapter_plugin/aws_sdk_v3_spec.rb index 3dc95d33..09d319b0 100644 --- a/spec/dynamoid/adapter_plugin/aws_sdk_v3_spec.rb +++ b/spec/dynamoid/adapter_plugin/aws_sdk_v3_spec.rb @@ -1397,11 +1397,18 @@ def dynamo_request(table_name, conditions = [], options = {}) before do Dynamoid.configure.http_open_timeout = 30 + Dynamoid.configure.http_proxy = 'http://proxy' + end + + after do + Dynamoid.configure.http_open_timeout = nil + Dynamoid.configure.http_proxy = nil end it 'not nil options entried' do - expect(subject.keys).to contain_exactly(:endpoint, :log_formatter, :log_level, :logger, :http_open_timeout) + expect(subject.keys).to contain_exactly(:endpoint, :log_formatter, :log_level, :logger, :http_open_timeout, :http_proxy) expect(subject[:http_open_timeout]).to eq 30 + expect(subject[:http_proxy]).to eq 'http://proxy' end end end diff --git a/spec/dynamoid/config_spec.rb b/spec/dynamoid/config_spec.rb index f361dd88..54169176 100644 --- a/spec/dynamoid/config_spec.rb +++ b/spec/dynamoid/config_spec.rb @@ -52,4 +52,40 @@ expect(buffer.string).to match(/\[Aws::DynamoDB::Client 200 .+\] create_table \n/) end end + + describe 'http_proxy' do + let(:http_proxy) { nil } + + before do + @http_proxy_old = Dynamoid.config.http_proxy + Dynamoid.config.http_proxy = http_proxy + Dynamoid.adapter.connect! # clear cached client + end + + after do + Dynamoid.config.http_proxy = @http_proxy_old + Dynamoid.adapter.connect! # clear cached client + end + + it 'is nil by default' do + Dynamoid.config.reset_http_proxy + expect(Dynamoid.config.http_proxy).to be_nil + end + + context 'when String is provided' do + let(:http_proxy) { 'http://localhost:8080' } + + it 'passes http_proxy to a client connection' do + expect(Dynamoid.adapter.client.config.http_proxy).to eq 'http://localhost:8080' + end + end + + context 'when URI is provided' do + let(:http_proxy) { URI.parse('http://localhost:8080') } + + it 'passes http_proxy URI to a client connection' do + expect(Dynamoid.adapter.client.config.http_proxy).to eq URI.parse('http://localhost:8080') + end + end + end end