redocly-cli icon indicating copy to clipboard operation
redocly-cli copied to clipboard

Working behind proxy

Open joaonlopes opened this issue 3 years ago • 9 comments

Is your feature request related to a problem? Please describe.

We need our continuous integration to upload the openapi yaml to the Redocly API registry, but we always get time out, we think the reason for this timeout is that we are behind an enterprise proxy.

FetchError: request to https://api.redoc.ly/registry failed, reason: connect ETIMEDOUT 34.238.30.35:44 at ClientRequest.<anonymous> (C:\ (...) \AppData\Roaming\npm\node_modules\@redocly\openapi-cli\node_modules\node-fetch\lib\index.js:1491:11) at ClientRequest.emit (node:events:390:28) at TLSSocket.socketErrorListener (node:_http_client:447:9) at TLSSocket.emit (node:events:390:28) at emitErrorNT (node:internal/streams/destroy:157:8) at emitErrorCloseNT (node:internal/streams/destroy:122:3) at processTicksAndRejections (node:internal/process/task_queues:83:21) { type: 'system', errno: 'ETIMEDOUT', code: 'ETIMEDOUT' }

Authorization failed. Please check if you entered a valid API key.

Describe the solution you'd like

We would like openapi cli working behind a proxy server.

Describe alternatives you've considered

We did a quick modification to your code in registry-api.ts to handle the proxy connection:

const HttpsProxyAgent = require('https-proxy-agent');
private async request(path = '', options: RequestInit = {}, region?: Region) {
    const headers = Object.assign({}, options.headers || {}, { 'x-redocly-cli-version': version });
    if (!headers.hasOwnProperty('authorization')) { throw new Error('Unauthorized'); }
const proxyAgent = new HttpsProxyAgent('XXX:XXX/');
    const response = await fetch(`${this.getBaseUrl(region)}${path}`,  Object.assign({}, options, { headers }, { agent: proxyAgent}) );
    if (response.status === 401) { throw new Error('Unauthorized'); }
    if (response.status === 404) {
      const body: RegistryApiTypes.NotFoundProblemResponse = await response.json();
      throw new Error(body.code);
    }
    return response;
  }

(see: https://www.scrapingbee.com/blog/proxy-node-fetch/)

This seems to work for the login command but still timesout for the push command:

FetchError: request to (...) host failed, reason: connect ETIMEDOUT 52.216.108.107:443 at ClientRequest.<anonymous> ( (...) \openapi-cli\node_modules\node-fetch\lib\index.js:1491:11) at ClientRequest.emit (node:events:390:28) at ClientRequest.emit (node:domain:475:12) at TLSSocket.socketErrorListener (node:_http_client:447:9) at TLSSocket.emit (node:events:390:28) at TLSSocket.emit (node:domain:475:12) at emitErrorNT (node:internal/streams/destroy:157:8) at emitErrorCloseNT (node:internal/streams/destroy:122:3) at processTicksAndRejections (node:internal/process/task_queues:83:21) { type: 'system', errno: 'ETIMEDOUT', code: 'ETIMEDOUT' }

Additional context

I don't know if it matters but we do have an enterprise license for Redocly.

joaonlopes avatar Jan 25 '22 08:01 joaonlopes

Hi @joaonlopes,

Thank your for the feature request. Could you also shoot an email to [email protected] so we can track and prioritize it appropriately.

RomanHotsiy avatar Jan 25 '22 08:01 RomanHotsiy

It's done.

Thank you

joaonlopes avatar Jan 25 '22 08:01 joaonlopes

Hello,

just an update on this. I managed to successfully push the files after modifying your code in push.ts.

const HttpsProxyAgent = require('https-proxy-agent');
function uploadFileToS3(url: string, filePathOrBuffer: string | Buffer) {
  const fileSizeInBytes =
    typeof filePathOrBuffer === 'string'
      ? fs.statSync(filePathOrBuffer).size
      : filePathOrBuffer.byteLength;
  let readStream =
    typeof filePathOrBuffer === 'string' ? fs.createReadStream(filePathOrBuffer) : filePathOrBuffer;

	const proxyAgent = new HttpsProxyAgent('XXX:XXX/');

  return fetch(url, {
	agent: proxyAgent,
    method: 'PUT',
    headers: {
      'Content-Length': fileSizeInBytes.toString(),
    },
    body: readStream,
  });
}

Hope this helps.

Thank you

joaonlopes avatar Jan 25 '22 10:01 joaonlopes

Thanks @joaonlopes! This definitely helps!

RomanHotsiy avatar Jan 25 '22 10:01 RomanHotsiy

Thanks @joaonlopes, I'll prepare the pull request.

tatomyr avatar Jan 25 '22 10:01 tatomyr

Hi @joaonlopes,

We introduced the changes in openapi-cli version 1.0.0-beta.81 but have to revert them in 1.0.0-beta.82 due to related issues. We will come back to this enhancement later. Meanwhile, please use your local fix. Sorry for the inconvenience.

tatomyr avatar Feb 15 '22 11:02 tatomyr

Hello @tatomyr,

thank you very much for the notice. For us version 1.0.0-beta.81 works fine.

The commands preview-docs, linter and push are working fine so we can use that for the time being.

joaonlopes avatar Feb 17 '22 08:02 joaonlopes

Sure @joaonlopes, Thanks for the update. Glad to hear it works for you. Do you use the REDOCLY_PROXY env variable for working out your proxy? Just curious if it works for you as we expected.

tatomyr avatar Feb 17 '22 10:02 tatomyr

We just use the REDOCLY_PROXY environment variable and it works fine.

joaonlopes avatar Feb 17 '22 10:02 joaonlopes

Can we add a note on what the related issues were that caused this to be reverted? The extra information will help us to implement.

lornajane avatar Apr 03 '23 07:04 lornajane

Here is the corresponding issue: https://github.com/Redocly/redocly-cli/issues/555

RomanHotsiy avatar May 22 '23 07:05 RomanHotsiy

Hello everyone,

thank you very much for the support you provided for this issue. We are still using beta 81 as part of our deployment, because that version works behind the proxy.

Since you decided to rollback, do you plan on implementing/fixing this? Is it ok to continue to work with beta 81?

Thank you very much

Joao

joaonlopes avatar May 22 '23 07:05 joaonlopes

We plan to fix it. We were trying to remember what was the issue that made us rollback. We'll be updating any progress here.

It's okay to use 81 for now.

RomanHotsiy avatar May 22 '23 07:05 RomanHotsiy

Tangentially related: https://github.com/Redocly/redocly-cli/issues/1146. It would be good to check it when resolving the current one.

tatomyr avatar Jul 17 '23 11:07 tatomyr

Hello everyone,

we are stuck in version 1.0.0-beta.81 and this is starting to cause issues on our side.

For example when using AllOf we are getting a all bunch of validation warnings that don't appear in the latest version:

  _Example value must conform to the schema: `Person` property must NOT have additional properties `DeliveryProof`._

Our problem is that we are working behind a proxy. Is there a workaround for when we want to publish the documentation and we are behind a proxy? I can't believe we are the only users in this situation.

Thanks

joaonlopes avatar Jan 18 '24 09:01 joaonlopes

I created a fork (https://github.com/joaonlopes/redocly-cli-behind-proxy) with my hack to enable using the CLI behind a proxy. If somebody is having the same difficulties as I do you can use it. It's very rough solution but it works.

The principle is: install a recent version of the redocly cli and replace with the modified versions of registry-api.ts and push.ts

joaonlopes avatar Jan 18 '24 16:01 joaonlopes

Hi @joaonlopes! Sorry, I somehow missed your messages. We're going to make some changes related to that part of the functionality, and I'd like to incorporate your changes as well. Not sure how this will go though 😅

tatomyr avatar Jan 24 '24 08:01 tatomyr

We had to revert the fix unfortunately as it was causing major issues in our other projects.

We will merge it again soon.

RomanHotsiy avatar Feb 29 '24 15:02 RomanHotsiy