// Make a request to API.
    // Syntax: .request(method, uri, [query], callback)
    private request(method: string, uri: string, argsOrCallback?: any | RequestCallback, callback?: RequestCallback): void {
        let args: any;

        if (callback) {
            args = argsOrCallback;
        } else {
            callback = argsOrCallback;
            args = {};
        }

        let url = apiBaseUri + (uri[0] === "/" ? "" : "/") + uri;

        if (method === "GET" || method === "DELETE") {
            url += "?" + querystring.stringify(this.parseQuery(uri, args));
        }

        let options: request.Options = {
            url: url,
            method: method,
            oauth: {
                consumer_key: config.get("externalApp.consumer_key"),
                consumer_secret: config.get("externalApp.consumer_secret"),
                token: config.get("externalAppUser.token"),
                token_secret: config.get("externalAppUser.token_secret"),
            },
            json: true,
        };

        let requestCallback = function (err: any, response: any, body: any): void {
            if (!err && response.statusCode >= 400) {
                err = new Error(body);
                err.statusCode = response.statusCode;
                err.responseBody = body;
                err.statusMessage = http.STATUS_CODES[response.statusCode];
            }

            callback(err, body);
        };

        switch (method.toLowerCase())
        {
            case "get":
                request.get(options, requestCallback);
                break;
            case "post":
                request.post(options, requestCallback);
                break;
            case "put":
                request.put(options, requestCallback);
                break;
            case "delete":
                request.delete(options, requestCallback);
                break;
        }
    };
    // Make a request to API.
    // Syntax: .request(method, uri, [query], callback)
    private request(method: string, url: string, argsOrCallback?: any | RequestCallback, callback?: RequestCallback): void {
        let args: any;

        if (callback) {
            args = argsOrCallback;
        } else {
            callback = argsOrCallback;
            args = {};
        }

        let options: request.Options = {
            url: url,
            method: method,
            headers: {
                "authorization": "bearer " + args.vsts_access_token,
            },
        };

        let requestCallback = function (err: any, response: any, body: any): void {
            if (!err && response.statusCode >= 400) {
                err = new Error(body);
                err.statusCode = response.statusCode;
                err.responseBody = body;
                err.statusMessage = http.STATUS_CODES[response.statusCode];
            }

            callback(err, body);
        };

        switch (method.toLowerCase())
        {
            case "get":
                request.get(options, requestCallback);
                break;
            case "post":
                request.post(options, requestCallback);
                break;
            case "put":
                request.put(options, requestCallback);
                break;
            case "delete":
                request.delete(options, requestCallback);
                break;
        }
    };
    // Make a request to API.
    // Syntax: .request(method, uri, [query], callback)
    private request(method: string, url: string, headers: any, bodyOrCallback?: any | RequestCallback, callback?: RequestCallback): void {
        let body: any;

        if (callback) {
            body = bodyOrCallback;
        } else {
            callback = bodyOrCallback;
            body = {};
        }

        let options: request.Options = {
            url: url,
            method: method,
            headers: headers,
            form: body,
        };

        let requestCallback = function (err: any, response: any, responseBody: any): void {
            if (!err && response.statusCode >= 400) {
                err = new Error(responseBody);
                err.statusCode = response.statusCode;
                err.responseBody = responseBody;
                err.statusMessage = http.STATUS_CODES[response.statusCode];
            }

            callback(err, responseBody);
        };

        switch (method.toLowerCase())
        {
            case "get":
                request.get(options, requestCallback);
                break;
            case "post":
                request.post(options, requestCallback);
                break;
            case "put":
                request.put(options, requestCallback);
                break;
            case "delete":
                request.delete(options, requestCallback);
                break;
        }
    };