void throw_server_error_or_response_code()

in binding-cpp/gym_binding.cpp [170:196]


	void throw_server_error_or_response_code(const std::string& answer, Json::Value& j)
	{
		long response_code;
		CURLcode r = curl_easy_getinfo(h.get(), CURLINFO_RESPONSE_CODE, &response_code);
		if (r) throw std::runtime_error(curl_error_buf.data());
		if (verbose) printf("%i\n%s\n", (int)response_code, answer.c_str());

		std::string parse_error;
		Json::Reader jr;
		if (!jr.parse(answer, j, false)) {
			parse_error  = jr.getFormattedErrorMessages();
			parse_error += "original json that caused error: " + answer;
		} else if (!j.isObject()) {
			parse_error  = "top level json is not an object";
			parse_error += "original json that caused error: " + answer;
		}

		if (response_code != 200 && j.isObject() && j.isMember("message")) {
			throw std::runtime_error(j["message"].asString());
		} else if (response_code != 200) {
			throw std::runtime_error("bad HTTP response code, and also cannot parse server message: " + answer);
		} else {
			// 200, but maybe invalid json
			if (!parse_error.empty())
				throw std::runtime_error(parse_error);
		}
	}