3

I'm building a plugin in intellij and want to make a curl request. The plugin is written in kotlin.

The following curl request works:

            val comd = arrayOf(
                "curl",
                "-X",
                "GET",
                "-H",
                "Authorization: AUTH_TOKEN",
                "https://api.bitrise.io/v0.1/me"
            )

But the following POST request with data doesn't:

            val comd = arrayOf(
                "curl",
                "-X",
                "POST",
                "https://api.bitrise.io/v0.1/apps/appslug/builds",
                "-H",
                "Authorization: AUTH_TOKEN",
                " -d $data"
            )

I'm using this function to run the request:

    private fun executeCommandLine(project: Project, comd: Array<String>) {
        val process = Runtime.getRuntime().exec(comd)
        val processHandler: ProcessHandler = OSProcessHandler(process, "clear", Charset.forName("UTF-8"))
        consoleView.attachToProcess(processHandler)
        processHandler.startNotify()
    }

It just throws an error:

curl: (3) nested brace in URL position 18:
 -d {"hook_info":{"type":"bitrise"},"build_params":{"branch":"master"}}

I've tried running the request with -g switch for globbing error. But then I run into another one:

curl: (3) URL using bad/illegal format or missing URL

What am I missing here?

PS: I've had to break my curl command into an array otherwise it doesn't work. Check this: Unable to execute CURL command through java Runtime.getRuntime().exec()

Thanks in advance :)

1 Answer 1

1

Return the curl command to a string and then try using this function from @leondepeon's answer

    /** Run a system-level command.
 * Note: This is a system independent java exec (e.g. | doesn't work). For shell: prefix with "bash -c"
 * Inputting the string in stdIn (if any), and returning stdout and stderr as a string. */
fun exec(cmd: String, stdIn: String = "", captureOutput:Boolean = false, workingDir: File = File(".")): String? {
    try {
        val process = ProcessBuilder(*cmd.split("\\s".toRegex()).toTypedArray())
                .directory(workingDir)
                .redirectOutput(if (captureOutput) ProcessBuilder.Redirect.PIPE else ProcessBuilder.Redirect.INHERIT)
                .redirectError(if (captureOutput) ProcessBuilder.Redirect.PIPE else ProcessBuilder.Redirect.INHERIT)
                .start().apply {
                    if (stdIn != "") {
                        outputStream.bufferedWriter().apply {
                            write(stdIn)
                            flush()
                            close()
                        }
                    }
                    waitFor(60, TimeUnit.SECONDS)
                }
        if (captureOutput) {
            return process.inputStream.bufferedReader().readText()
        }
    } catch (e: IOException) {
        e.printStackTrace()
    }
    return null
}

Also, if working on Windows, be wary of the single quote.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.