- InetAddress addr;
- try { addr = InetAddress.getByName(host); }
- catch (UnknownHostException uhe) { throw new JavaScriptException("could not resolve hostname \"" + host + "\""); }
- byte[] quadbyte = addr.getAddress();
-
- if (quadbyte[0] == 10 ||
- (quadbyte[0] == 192 && quadbyte[1] == 168) ||
- (quadbyte[0] == 172 && (quadbyte[1] & 0xF0) == 16) &&
- !addr.equals(Main.originAddr)) {
- filename = null;
- throw new JavaScriptException("security violation: " + host + " [" + addr.getHostAddress() + "] is in a firewalled netblock");
- }
- }
-
- Socket s;
- if (ssl) s = Platform.getSocket(host, port == -1 ? 443 : port, true);
- else if (url.getProtocol().equals("http")) s = Platform.getSocket(host, port == -1 ? 80 : port, false);
- else throw new JavaScriptException("only http[s] is supported");
-
- s.setTcpNoDelay(true);
- OutputStream os = new BufferedOutputStream(s.getOutputStream(), 4000);
- InputStream is = new BufferedInputStream(new Filter(s.getInputStream()));
-
- PrintWriter ps;
- if (!Log.verbose) ps = new PrintWriter(os);
- else ps = new PrintWriter(new FilterWriter(new OutputStreamWriter(os)) {
- public void write(int i) throws IOException {
- super.write(i);
- if (Log.on) Log.log(this, "send: " + ((char)i));
- }
- public void write(String s, int start, int len) throws IOException {
- super.write(s, start, len);
- if (Log.on) Log.log(this, "send: " + s.substring(start, start + len));
- }
- public void write(char[] c, int start, int len) throws IOException {
- super.write(c, start, len);
- if (Log.on) Log.log(this, "send: " + new String(c, start, len));
- }
- });
-
- BufferedReader br;
- if (!Log.verbose) br = new BufferedReader(new InputStreamReader(is));
- else br = new BufferedReader(new FilterReader(new InputStreamReader(is)) {
- public int read() throws IOException {
- int i = super.read();
- if (Log.on) Log.log(this, "recv: " + ((char)i));
- return i;
- }
- public int read(char[] c, int off, int len) throws IOException {
- int ret = super.read(c, off, len);
- if (ret == -1) return ret;
- if (Log.on) Log.log(this, "recv: " + new String(c, off, ret));
- return ret;
- }
- });
-
- if (Log.verbose) Log.log(this, "call to " + url + " : " + methodname);
- return send(args, br, ps);
- }
-
- protected Object send(Object[] args, BufferedReader br, PrintWriter ps) throws JavaScriptException, IOException {
-
- // Construct payload
- StringBuffer content = new StringBuffer();
- content.append("<?xml version=\"1.0\"?>\n");
- content.append(" <methodCall>\n");
- content.append(" <methodName>");
- content.append(methodname);
- content.append("</methodName>\n");
- if (args.length > 0) {
- content.append(" <params>\n");
- for(int i=0; i<args.length; i++) {
- content.append(" <param>\n");
- appendObject(args[i], content);
- content.append(" </param>\n");
- }
- content.append(" </params>\n");
- }
- content.append(" </methodCall>");
-
- // Header
- ps.print("POST " + filename + " HTTP/1.0\r\n");
- ps.print("Host: " + host + "\r\n");
- ps.print("User-Agent: XWT (http://www.xwt.org/)\r\n");
- ps.print("Content-Type: text/xml\r\n");
- ps.print("Content-length: " + (content.length() + 1) + "\r\n");
- ps.print("\r\n");
- ps.print(content);
- ps.print("\n");
- ps.flush();
-
- // throw away HTTP reply headers
- while(!br.readLine().equals("")) { }
-
- // parse XML reply
- try {
- parse(br);
- } catch (XML.SAXException e) {
- if (Log.on) Log.log(this, "reply from server was not well-formed XML: " + e);
- throw new JavaScriptException("reply from server was not well-formed XML: " + e);
- }
-
- if (fault) throw new JavaScriptException(objects.elementAt(0));
-
- if (objects.size() == 0) return null;
- return objects.elementAt(0);