From 8739d73b3c3f8112aebfa54c55caa8355b1d1abd Mon Sep 17 00:00:00 2001 From: Filipe Freire Date: Fri, 12 Jul 2024 18:50:15 +0100 Subject: [PATCH] Add generator for Ruby's Faraday client (#362) Co-authored-by: Lukas_Skywalker --- src/helpers/__snapshots__/utils.test.ts.snap | 6 + src/targets/ruby/faraday/client.ts | 107 ++++++++++++++++++ .../fixtures/application-form-encoded.rb | 18 +++ .../ruby/faraday/fixtures/application-json.rb | 13 +++ src/targets/ruby/faraday/fixtures/cookies.rb | 12 ++ .../ruby/faraday/fixtures/custom-method.rb | 1 + src/targets/ruby/faraday/fixtures/full.rb | 22 ++++ src/targets/ruby/faraday/fixtures/headers.rb | 14 +++ src/targets/ruby/faraday/fixtures/https.rb | 11 ++ .../faraday/fixtures/jsonObj-multiline.rb | 13 +++ .../faraday/fixtures/jsonObj-null-value.rb | 13 +++ .../ruby/faraday/fixtures/multipart-data.rb | 13 +++ .../ruby/faraday/fixtures/multipart-file.rb | 13 +++ .../fixtures/multipart-form-data-no-params.rb | 12 ++ .../faraday/fixtures/multipart-form-data.rb | 13 +++ src/targets/ruby/faraday/fixtures/nested.rb | 14 +++ src/targets/ruby/faraday/fixtures/query.rb | 14 +++ src/targets/ruby/faraday/fixtures/short.rb | 11 ++ .../ruby/faraday/fixtures/text-plain.rb | 13 +++ src/targets/ruby/target.ts | 2 + 20 files changed, 335 insertions(+) create mode 100644 src/targets/ruby/faraday/client.ts create mode 100644 src/targets/ruby/faraday/fixtures/application-form-encoded.rb create mode 100644 src/targets/ruby/faraday/fixtures/application-json.rb create mode 100644 src/targets/ruby/faraday/fixtures/cookies.rb create mode 100644 src/targets/ruby/faraday/fixtures/custom-method.rb create mode 100644 src/targets/ruby/faraday/fixtures/full.rb create mode 100644 src/targets/ruby/faraday/fixtures/headers.rb create mode 100644 src/targets/ruby/faraday/fixtures/https.rb create mode 100644 src/targets/ruby/faraday/fixtures/jsonObj-multiline.rb create mode 100644 src/targets/ruby/faraday/fixtures/jsonObj-null-value.rb create mode 100644 src/targets/ruby/faraday/fixtures/multipart-data.rb create mode 100644 src/targets/ruby/faraday/fixtures/multipart-file.rb create mode 100644 src/targets/ruby/faraday/fixtures/multipart-form-data-no-params.rb create mode 100644 src/targets/ruby/faraday/fixtures/multipart-form-data.rb create mode 100644 src/targets/ruby/faraday/fixtures/nested.rb create mode 100644 src/targets/ruby/faraday/fixtures/query.rb create mode 100644 src/targets/ruby/faraday/fixtures/short.rb create mode 100644 src/targets/ruby/faraday/fixtures/text-plain.rb diff --git a/src/helpers/__snapshots__/utils.test.ts.snap b/src/helpers/__snapshots__/utils.test.ts.snap index 8464d7bd4..6ba3a2d28 100644 --- a/src/helpers/__snapshots__/utils.test.ts.snap +++ b/src/helpers/__snapshots__/utils.test.ts.snap @@ -330,6 +330,12 @@ Array [ "link": "http://ruby-doc.org/stdlib-2.2.1/libdoc/net/http/rdoc/Net/HTTP.html", "title": "net::http", }, + Object { + "description": "Faraday HTTP client", + "key": "faraday", + "link": "https://github.com/lostisland/faraday", + "title": "faraday", + }, ], "default": "native", "extname": ".rb", diff --git a/src/targets/ruby/faraday/client.ts b/src/targets/ruby/faraday/client.ts new file mode 100644 index 000000000..e8e259a4e --- /dev/null +++ b/src/targets/ruby/faraday/client.ts @@ -0,0 +1,107 @@ +import { CodeBuilder } from '../../../helpers/code-builder'; +import { escapeForSingleQuotes } from '../../../helpers/escape'; +import { Client } from '../../targets'; + +export const faraday: Client = { + info: { + key: 'faraday', + title: 'faraday', + link: 'https://github.com/lostisland/faraday', + description: 'Faraday HTTP client', + }, + convert: ({ uriObj, queryObj, method: rawMethod, fullUrl, postData, allHeaders }, options = {}) => { + const { push, blank, join } = new CodeBuilder(); + + // To support custom methods we check for the supported methods + // and if doesn't exist then we build a custom class for it + const method = rawMethod.toUpperCase(); + const methods = [ + 'GET', + 'POST', + 'HEAD', + 'DELETE', + 'PATCH', + 'PUT', + 'OPTIONS', + 'COPY', + 'LOCK', + 'UNLOCK', + 'MOVE', + 'TRACE', + ]; + + if(!methods.includes(method)) { + push(`# Faraday cannot currently run ${method} requests. Please use another client.`) + return join(); + } + + push("require 'faraday'"); + blank(); + + // Write body to beginning of script + if(postData.mimeType === 'application/x-www-form-urlencoded') { + if (postData.params) { + push(`data = {`); + postData.params.forEach(param => { + push(` :${param.name} => ${JSON.stringify(param.value)},`); + }); + push(`}`); + blank(); + } + } + + push(`conn = Faraday.new(`); + push(` url: '${uriObj.protocol}//${uriObj.host}',`); + if(allHeaders['content-type'] || allHeaders['Content-Type']) { + push(` headers: {'Content-Type' => '${allHeaders['content-type'] || allHeaders['Content-Type']}'}`); + } + push(`)`); + + blank(); + push(`response = conn.${method.toLowerCase()}('${uriObj.pathname}') do |req|`); + + const headers = Object.keys(allHeaders); + if (headers.length) { + headers.forEach(key => { + if(key.toLowerCase() !== 'content-type') { + push(` req.headers['${key}'] = '${escapeForSingleQuotes(allHeaders[key])}'`); + } + }); + } + + Object.keys(queryObj).forEach(name => { + const value = queryObj[name]; + if (Array.isArray(value)) { + push(` req.params['${name}'] = ${JSON.stringify(value)}`) + } else { + push(` req.params['${name}'] = '${value}'`) + } + }); + + switch (postData.mimeType) { + case 'application/x-www-form-urlencoded': + if (postData.params) { + push(` req.body = URI.encode_www_form(data)`); + } + break; + + case 'application/json': + if (postData.jsonObj) { + push(` req.body = ${JSON.stringify(postData.text)}`); + } + break; + + default: + if (postData.text) { + push(` req.body = ${JSON.stringify(postData.text)}`); + } + } + + push('end'); + blank() + push('puts response.status'); + push('puts response.body'); + + return join(); + }, +}; diff --git a/src/targets/ruby/faraday/fixtures/application-form-encoded.rb b/src/targets/ruby/faraday/fixtures/application-form-encoded.rb new file mode 100644 index 000000000..9f15c8afa --- /dev/null +++ b/src/targets/ruby/faraday/fixtures/application-form-encoded.rb @@ -0,0 +1,18 @@ +require 'faraday' + +data = { + :foo => "bar", + :hello => "world", +} + +conn = Faraday.new( + url: 'http://mockbin.com', + headers: {'Content-Type' => 'application/x-www-form-urlencoded'} +) + +response = conn.post('/har') do |req| + req.body = URI.encode_www_form(data) +end + +puts response.status +puts response.body \ No newline at end of file diff --git a/src/targets/ruby/faraday/fixtures/application-json.rb b/src/targets/ruby/faraday/fixtures/application-json.rb new file mode 100644 index 000000000..2c22a0eb2 --- /dev/null +++ b/src/targets/ruby/faraday/fixtures/application-json.rb @@ -0,0 +1,13 @@ +require 'faraday' + +conn = Faraday.new( + url: 'http://mockbin.com', + headers: {'Content-Type' => 'application/json'} +) + +response = conn.post('/har') do |req| + req.body = "{\"number\":1,\"string\":\"f\\\"oo\",\"arr\":[1,2,3],\"nested\":{\"a\":\"b\"},\"arr_mix\":[1,\"a\",{\"arr_mix_nested\":{}}],\"boolean\":false}" +end + +puts response.status +puts response.body \ No newline at end of file diff --git a/src/targets/ruby/faraday/fixtures/cookies.rb b/src/targets/ruby/faraday/fixtures/cookies.rb new file mode 100644 index 000000000..5c884d73f --- /dev/null +++ b/src/targets/ruby/faraday/fixtures/cookies.rb @@ -0,0 +1,12 @@ +require 'faraday' + +conn = Faraday.new( + url: 'http://mockbin.com', +) + +response = conn.post('/har') do |req| + req.headers['cookie'] = 'foo=bar; bar=baz' +end + +puts response.status +puts response.body \ No newline at end of file diff --git a/src/targets/ruby/faraday/fixtures/custom-method.rb b/src/targets/ruby/faraday/fixtures/custom-method.rb new file mode 100644 index 000000000..213ada538 --- /dev/null +++ b/src/targets/ruby/faraday/fixtures/custom-method.rb @@ -0,0 +1 @@ +# Faraday cannot currently run PROPFIND requests. Please use another client. \ No newline at end of file diff --git a/src/targets/ruby/faraday/fixtures/full.rb b/src/targets/ruby/faraday/fixtures/full.rb new file mode 100644 index 000000000..00cf3c6a4 --- /dev/null +++ b/src/targets/ruby/faraday/fixtures/full.rb @@ -0,0 +1,22 @@ +require 'faraday' + +data = { + :foo => "bar", +} + +conn = Faraday.new( + url: 'http://mockbin.com', + headers: {'Content-Type' => 'application/x-www-form-urlencoded'} +) + +response = conn.post('/har') do |req| + req.headers['cookie'] = 'foo=bar; bar=baz' + req.headers['accept'] = 'application/json' + req.params['foo'] = ["bar","baz"] + req.params['baz'] = 'abc' + req.params['key'] = 'value' + req.body = URI.encode_www_form(data) +end + +puts response.status +puts response.body \ No newline at end of file diff --git a/src/targets/ruby/faraday/fixtures/headers.rb b/src/targets/ruby/faraday/fixtures/headers.rb new file mode 100644 index 000000000..efaaa37a7 --- /dev/null +++ b/src/targets/ruby/faraday/fixtures/headers.rb @@ -0,0 +1,14 @@ +require 'faraday' + +conn = Faraday.new( + url: 'http://mockbin.com', +) + +response = conn.get('/har') do |req| + req.headers['accept'] = 'application/json' + req.headers['x-foo'] = 'Bar' + req.headers['quoted-value'] = '"quoted" \'string\'' +end + +puts response.status +puts response.body \ No newline at end of file diff --git a/src/targets/ruby/faraday/fixtures/https.rb b/src/targets/ruby/faraday/fixtures/https.rb new file mode 100644 index 000000000..841613679 --- /dev/null +++ b/src/targets/ruby/faraday/fixtures/https.rb @@ -0,0 +1,11 @@ +require 'faraday' + +conn = Faraday.new( + url: 'https://mockbin.com', +) + +response = conn.get('/har') do |req| +end + +puts response.status +puts response.body \ No newline at end of file diff --git a/src/targets/ruby/faraday/fixtures/jsonObj-multiline.rb b/src/targets/ruby/faraday/fixtures/jsonObj-multiline.rb new file mode 100644 index 000000000..e6e66b0da --- /dev/null +++ b/src/targets/ruby/faraday/fixtures/jsonObj-multiline.rb @@ -0,0 +1,13 @@ +require 'faraday' + +conn = Faraday.new( + url: 'http://mockbin.com', + headers: {'Content-Type' => 'application/json'} +) + +response = conn.post('/har') do |req| + req.body = "{\n \"foo\": \"bar\"\n}" +end + +puts response.status +puts response.body \ No newline at end of file diff --git a/src/targets/ruby/faraday/fixtures/jsonObj-null-value.rb b/src/targets/ruby/faraday/fixtures/jsonObj-null-value.rb new file mode 100644 index 000000000..d2ecc57a0 --- /dev/null +++ b/src/targets/ruby/faraday/fixtures/jsonObj-null-value.rb @@ -0,0 +1,13 @@ +require 'faraday' + +conn = Faraday.new( + url: 'http://mockbin.com', + headers: {'Content-Type' => 'application/json'} +) + +response = conn.post('/har') do |req| + req.body = "{\"foo\":null}" +end + +puts response.status +puts response.body \ No newline at end of file diff --git a/src/targets/ruby/faraday/fixtures/multipart-data.rb b/src/targets/ruby/faraday/fixtures/multipart-data.rb new file mode 100644 index 000000000..5dd46a568 --- /dev/null +++ b/src/targets/ruby/faraday/fixtures/multipart-data.rb @@ -0,0 +1,13 @@ +require 'faraday' + +conn = Faraday.new( + url: 'http://mockbin.com', + headers: {'Content-Type' => 'multipart/form-data; boundary=---011000010111000001101001'} +) + +response = conn.post('/har') do |req| + req.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"foo\"; filename=\"hello.txt\"\r\nContent-Type: text/plain\r\n\r\nHello World\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bar\"\r\n\r\nBonjour le monde\r\n-----011000010111000001101001--\r\n" +end + +puts response.status +puts response.body \ No newline at end of file diff --git a/src/targets/ruby/faraday/fixtures/multipart-file.rb b/src/targets/ruby/faraday/fixtures/multipart-file.rb new file mode 100644 index 000000000..4d7168969 --- /dev/null +++ b/src/targets/ruby/faraday/fixtures/multipart-file.rb @@ -0,0 +1,13 @@ +require 'faraday' + +conn = Faraday.new( + url: 'http://mockbin.com', + headers: {'Content-Type' => 'multipart/form-data; boundary=---011000010111000001101001'} +) + +response = conn.post('/har') do |req| + req.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"foo\"; filename=\"hello.txt\"\r\nContent-Type: text/plain\r\n\r\n\r\n-----011000010111000001101001--\r\n" +end + +puts response.status +puts response.body \ No newline at end of file diff --git a/src/targets/ruby/faraday/fixtures/multipart-form-data-no-params.rb b/src/targets/ruby/faraday/fixtures/multipart-form-data-no-params.rb new file mode 100644 index 000000000..fc40bcef7 --- /dev/null +++ b/src/targets/ruby/faraday/fixtures/multipart-form-data-no-params.rb @@ -0,0 +1,12 @@ +require 'faraday' + +conn = Faraday.new( + url: 'http://mockbin.com', + headers: {'Content-Type' => 'multipart/form-data'} +) + +response = conn.post('/har') do |req| +end + +puts response.status +puts response.body \ No newline at end of file diff --git a/src/targets/ruby/faraday/fixtures/multipart-form-data.rb b/src/targets/ruby/faraday/fixtures/multipart-form-data.rb new file mode 100644 index 000000000..fe3e14467 --- /dev/null +++ b/src/targets/ruby/faraday/fixtures/multipart-form-data.rb @@ -0,0 +1,13 @@ +require 'faraday' + +conn = Faraday.new( + url: 'http://mockbin.com', + headers: {'Content-Type' => 'multipart/form-data; boundary=---011000010111000001101001'} +) + +response = conn.post('/har') do |req| + req.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"foo\"\r\n\r\nbar\r\n-----011000010111000001101001--\r\n" +end + +puts response.status +puts response.body \ No newline at end of file diff --git a/src/targets/ruby/faraday/fixtures/nested.rb b/src/targets/ruby/faraday/fixtures/nested.rb new file mode 100644 index 000000000..1a6966d20 --- /dev/null +++ b/src/targets/ruby/faraday/fixtures/nested.rb @@ -0,0 +1,14 @@ +require 'faraday' + +conn = Faraday.new( + url: 'http://mockbin.com', +) + +response = conn.get('/har') do |req| + req.params['foo[bar]'] = 'baz,zap' + req.params['fiz'] = 'buz' + req.params['key'] = 'value' +end + +puts response.status +puts response.body \ No newline at end of file diff --git a/src/targets/ruby/faraday/fixtures/query.rb b/src/targets/ruby/faraday/fixtures/query.rb new file mode 100644 index 000000000..c418c5542 --- /dev/null +++ b/src/targets/ruby/faraday/fixtures/query.rb @@ -0,0 +1,14 @@ +require 'faraday' + +conn = Faraday.new( + url: 'http://mockbin.com', +) + +response = conn.get('/har') do |req| + req.params['foo'] = ["bar","baz"] + req.params['baz'] = 'abc' + req.params['key'] = 'value' +end + +puts response.status +puts response.body \ No newline at end of file diff --git a/src/targets/ruby/faraday/fixtures/short.rb b/src/targets/ruby/faraday/fixtures/short.rb new file mode 100644 index 000000000..8ce34f785 --- /dev/null +++ b/src/targets/ruby/faraday/fixtures/short.rb @@ -0,0 +1,11 @@ +require 'faraday' + +conn = Faraday.new( + url: 'http://mockbin.com', +) + +response = conn.get('/har') do |req| +end + +puts response.status +puts response.body \ No newline at end of file diff --git a/src/targets/ruby/faraday/fixtures/text-plain.rb b/src/targets/ruby/faraday/fixtures/text-plain.rb new file mode 100644 index 000000000..b253cc378 --- /dev/null +++ b/src/targets/ruby/faraday/fixtures/text-plain.rb @@ -0,0 +1,13 @@ +require 'faraday' + +conn = Faraday.new( + url: 'http://mockbin.com', + headers: {'Content-Type' => 'text/plain'} +) + +response = conn.post('/har') do |req| + req.body = "Hello World" +end + +puts response.status +puts response.body \ No newline at end of file diff --git a/src/targets/ruby/target.ts b/src/targets/ruby/target.ts index 7d2e51411..7550bc650 100644 --- a/src/targets/ruby/target.ts +++ b/src/targets/ruby/target.ts @@ -1,5 +1,6 @@ import { Target } from '../targets'; import { native } from './native/client'; +import { faraday } from './faraday/client'; export const ruby: Target = { info: { @@ -10,5 +11,6 @@ export const ruby: Target = { }, clientsById: { native, + faraday }, };