diff --git a/packages/apollo-cli/src/commands/schema/download.ts b/packages/apollo-cli/src/commands/schema/download.ts index d5b5b1cf27..9de56566c9 100644 --- a/packages/apollo-cli/src/commands/schema/download.ts +++ b/packages/apollo-cli/src/commands/schema/download.ts @@ -35,6 +35,10 @@ export default class SchemaDownload extends Command { description: "The URL of the server to fetch the schema from or path to ./your/local/schema.graphql" }), + skipSSLValidation: flags.boolean({ + char: "k", + description: "Allow connections to a SSL site without certs" + }), ...engineFlags }; diff --git a/packages/apollo-cli/src/config.ts b/packages/apollo-cli/src/config.ts index a01b84a4fe..8ae8fb58b9 100644 --- a/packages/apollo-cli/src/config.ts +++ b/packages/apollo-cli/src/config.ts @@ -11,6 +11,7 @@ export interface EndpointConfig { url?: string; // main HTTP endpoint subscriptions?: string; // WS endpoint for subscriptions headers?: Object; // headers to send when performing operations + skipSSLValidation?: boolean; // bypass the SSL validation on a HTTPS request } export interface SchemaDependency { diff --git a/packages/apollo-cli/src/fetch-schema.ts b/packages/apollo-cli/src/fetch-schema.ts index bf10459c90..eccba875a3 100644 --- a/packages/apollo-cli/src/fetch-schema.ts +++ b/packages/apollo-cli/src/fetch-schema.ts @@ -1,20 +1,15 @@ +import { extractDocumentFromJavascript } from "apollo-codegen-core/lib/loading"; import { fs } from "apollo-codegen-core/lib/localfs"; -import * as path from "path"; -import fetch from "node-fetch"; -import gql from "graphql-tag"; -import { - buildSchema, - introspectionQuery, - GraphQLSchema, - Source, - buildClientSchema -} from "graphql"; import { execute, toPromise } from "apollo-link"; -import { createHttpLink } from "apollo-link-http"; - -import { extractDocumentFromJavascript } from "apollo-codegen-core/lib/loading"; +import { createHttpLink, HttpLink } from "apollo-link-http"; +import { buildClientSchema, buildSchema, GraphQLSchema, introspectionQuery, Source } from "graphql"; +import gql from "graphql-tag"; +import { Agent, AgentOptions } from 'https'; +import fetch from "node-fetch"; +import * as path from "path"; +import { URL } from 'url'; import { EndpointConfig } from "./config"; -import { getIdFromKey, engineLink } from "./engine"; +import { engineLink, getIdFromKey } from "./engine"; import { SCHEMA_QUERY } from "./operations/schema"; const introspection = gql(introspectionQuery); @@ -55,16 +50,35 @@ export async function fromFile( } export const fetchSchema = async ( - { url, headers }: EndpointConfig, + { url, headers, skipSSLValidation }: EndpointConfig, projectFolder?: string ): Promise => { if (!url) throw new Error("No endpoint provided when fetching schema"); const filePath = projectFolder ? path.resolve(projectFolder, url) : url; if (fs.existsSync(filePath)) return fromFile(filePath); + var options: HttpLink.Options = { uri: url, fetch } + + if (skipSSLValidation) { + const urlObject = new URL(url) + const host = urlObject.host + const port = +urlObject.port || 443 + + const agentOptions: AgentOptions = { + host: host, + port: port, + rejectUnauthorized: false + }; + + const agent = new Agent(agentOptions); + + options.fetchOptions = { agent: agent } + } + return toPromise( - // XXX node-fetch isn't compatiable typescript wise here? - execute(createHttpLink({ uri: url, fetch } as any), { + + // XXX node-fetch isn't compatible typescript wise here? + execute(createHttpLink(options), { query: introspection, context: { headers } }) diff --git a/packages/apollo-cli/src/load-config.ts b/packages/apollo-cli/src/load-config.ts index f5f828ac8a..1e9d4a7a32 100644 --- a/packages/apollo-cli/src/load-config.ts +++ b/packages/apollo-cli/src/load-config.ts @@ -1,9 +1,5 @@ -import { - loadConfigFromFile, - findAndLoadConfig, - SchemaDependency -} from "./config"; import { ListrTask } from "listr"; +import { findAndLoadConfig, loadConfigFromFile, SchemaDependency } from "./config"; export function loadConfigStep( flags: any, @@ -87,6 +83,15 @@ export function loadConfigStep( ctx.config.engineEndpoint = flags.engine; } + if (flags.skipSSLValidation) { + if (Object.keys(ctx.config.schemas).length == 1) { + const endpointConfiguration = (Object.values(ctx.config.schemas)[0] as SchemaDependency).endpoint + if (endpointConfiguration) { + endpointConfiguration.skipSSLValidation = flags.skipSSLValidation + } + } + } + if (ctx.config.queries.length == 0 && ctx.config.schemas.default) { ctx.config.queries.push({ schema: "default", diff --git a/packages/apollo-cli/src/load-schema.ts b/packages/apollo-cli/src/load-schema.ts index 6cb21cc716..ded954c73b 100644 --- a/packages/apollo-cli/src/load-schema.ts +++ b/packages/apollo-cli/src/load-schema.ts @@ -1,6 +1,6 @@ -import { SchemaDependency, ApolloConfig } from "./config"; -import { fetchSchema, fetchSchemaFromEngine } from "./fetch-schema"; import { GraphQLSchema } from "graphql"; +import { ApolloConfig, SchemaDependency } from "./config"; +import { fetchSchema, fetchSchemaFromEngine } from "./fetch-schema"; export async function loadSchema( dependency: SchemaDependency,