I have a Java program that starts an HTTP connection using the GET method. It looks like this:
String urlString = "http://10.205.110.250/cgiApp?envVariable";
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
I know that this code does in fact work, but this is where it gets tricky…I have a CGI app written in C++ that looks like this:
int main() {
char* url = getenv("QUERY_STRING");
int pipe = open(PATH_TO_FIFO, O_WRONLY);
write(pipe,url,256);
close(pipe);
return 0;
}
And also a program that runs to receive the QUERY_STRING and print it out:
int main () {
char url[256];
int pipe;
pipe = open(PATH_TO_FIFO, O_RDONLY);
read(pipe,url,256);
close(pipe);
cout << url << endl;
return 0;
}
I have confirmed that the C++ apps work correctly when I type the HTTP request into a browser. For example if I type
http://10.205.110.250/cgiApp?envVariable
into a browser, and the receive program is running, it will print out “envVariable”
However, when I run the Java program, it either prints out jibberish, or nothing at all (but still returns). From the preliminary research I’ve done it looks like it’s possible the Java String variable isn’t compatible with C++, or it isn’t encoded the same way. So my question is, why can’t my C++ program print out “envVariable” when sent from the Java program, but can when sent from a browser, and how can I go about fixing it?
Your CGI script knows nothing about whether it is being called from Java, hit by the browser, or otherwise accessed — it should just know “Hey, I got an HTTP GET request.” It has nothing to do with the encoding of the Java
Stringtype.Reading the documentation of URLConnection, you need to call the
connect()method after opening the connection and setting the request type. You’re most likely getting gibberish when you run the CGI script because it is pointing to some uninitialized block of memory. You can use a tool like Wireshark or Charles Proxy to view the actual HTTP requests.