/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.ode.tools.sendsoap.cline; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.UsernamePasswordCredentials; import org.apache.commons.httpclient.auth.AuthScope; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.StringRequestEntity; import org.apache.ode.tools.ToolMessages; import org.apache.ode.utils.StreamUtils; import org.apache.ode.utils.cli.Argument; import org.apache.ode.utils.cli.BaseCommandlineTool; import org.apache.ode.utils.cli.CommandlineFragment; import org.apache.ode.utils.cli.ConsoleFormatter; import org.apache.ode.utils.cli.FlagWithArgument; import org.apache.ode.utils.cli.Fragments; import org.apache.ode.utils.msg.CommonMessages; import org.apache.ode.utils.msg.MessageBundle; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * <p> * Commandline tool to send the contents of a (binary) file to a URL. * </p> */ public class HttpSoapSender extends BaseCommandlineTool { private static final int RETURN_BAD_URL = 2; private static final int RETURN_SEND_ERROR = 3; private static final int RETURN_CANT_READ = 4; private static final int RETURN_CANT_WRITE = 5; private static final int RETURN_BAD_PORT = 6; private static Pattern SEQ = Pattern.compile("\\$sequence\\$"); private static final ToolMessages MESSAGES = MessageBundle.getMessages(ToolMessages.class); private static final CommonMessages COMMON = MessageBundle.getMessages(CommonMessages.class); private static final Argument URL_A = new Argument("url","the URL to send the SOAP to.",false); private static final Argument FILE_A = new Argument("file","the file that contains the SOAP to send.",false); private static final FlagWithArgument PROXY_SERVER = new FlagWithArgument("s", "proxyServer", "server to use for proxy authentication.",true); private static final FlagWithArgument PROXY_PORT = new FlagWithArgument("p", "proxyPort", "port to use for proxy authentication.",true); private static final FlagWithArgument PROXY_USER = new FlagWithArgument("u", "username", "username to use for proxy authentication.",true); private static final FlagWithArgument PROXY_PASS = new FlagWithArgument("w", "password", "password to use for proxy authentication.",true); private static final FlagWithArgument SOAP_ACTION = new FlagWithArgument("a", "soapAction", "SOAP action to include in the message header.",true); private static final FlagWithArgument OUTFILE_FWA = new FlagWithArgument("o","outfile", "a file to write the output to (instead of standard out).",true); private static final Fragments CLINE = new Fragments(new CommandlineFragment[] { OUTFILE_FWA, URL_A, FILE_A, PROXY_SERVER, PROXY_PORT, PROXY_USER, PROXY_PASS, SOAP_ACTION }); private static final String SYNOPSIS = "send the contents of a file to a URL as a SOAP request and print the response (if any) to the console or a file."; protected static String getProgramName() { return "sendsoap"; } public static String doSend(URL u, InputStream is, String proxyServer, int proxyPort, String username, String password, String soapAction) throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(8192); StreamUtils.copy(bos, is); String now = Long.toString(System.currentTimeMillis()); int c = 1; String data = new String(bos.toByteArray()); Matcher m = SEQ.matcher(data); StringBuffer sb = new StringBuffer(8192); while (m.find()) { m.appendReplacement(sb, now + "-" + c++); } m.appendTail(sb); HttpClient httpClient = new HttpClient(); PostMethod httpPostMethod = new PostMethod(u.toExternalForm()); if (proxyServer != null && proxyServer.length() > 0) { httpClient.getState().setCredentials(new AuthScope(proxyServer, proxyPort), new UsernamePasswordCredentials(username, password)); httpPostMethod.setDoAuthentication(true); } if (soapAction == null) soapAction = ""; httpPostMethod.setRequestHeader("SOAPAction", "\"" + soapAction + "\""); httpPostMethod.setRequestHeader("Content-Type", "text/xml"); httpPostMethod.setRequestEntity(new StringRequestEntity(sb.toString())); httpClient.executeMethod(httpPostMethod); return httpPostMethod.getResponseBodyAsString() + "\n"; } public static void main(String[] argv) { if (argv.length == 0 || HELP.matches(argv)) { ConsoleFormatter.printSynopsis(getProgramName(),SYNOPSIS,new Fragments[] { CLINE,HELP}); System.exit(0); } else if (!CLINE.matches(argv)) { consoleErr("INVALID COMMANDLINE: Try \"" + getProgramName() + " -h\" for help."); System.exit(-1); } File fout = null; if (OUTFILE_FWA.isSet()) { String outfile = OUTFILE_FWA.getValue(); fout = new File(outfile); } URL u = null; try { u = new URL(URL_A.getValue()); } catch (MalformedURLException mue) { consoleErr(MESSAGES.msgBadUrl(URL_A.getValue(),mue.getMessage())); System.exit(RETURN_BAD_URL); } InputStream is = null; String src = FILE_A.getValue(); if (src.equals("-")) { is = System.in; } else { File f = new File(src); try { is = new FileInputStream(f); } catch (FileNotFoundException fnfe) { consoleErr(COMMON.msgCannotReadFromFile(src)); System.exit(RETURN_CANT_READ); } } boolean hasProxy = PROXY_SERVER.getValue() != null && PROXY_SERVER.getValue().length() > 0; if (hasProxy) { String proxyPort = PROXY_PORT.getValue(); try { Integer.parseInt(proxyPort); } catch (NumberFormatException e) { consoleErr(COMMON.msgBadPort(proxyPort)); System.exit(RETURN_BAD_PORT); } } initLogging(); try{ String result = doSend(u,is, PROXY_SERVER.getValue(), hasProxy ? Integer.parseInt(PROXY_PORT.getValue()) : 0, PROXY_USER.getValue(), PROXY_PASS.getValue(), SOAP_ACTION.getValue()); if (OUTFILE_FWA.isSet()) { FileOutputStream fos = new FileOutputStream(fout); fos.write(result.getBytes()); fos.close(); } else System.out.println(result); } catch (IOException ioe) { consoleErr(MESSAGES.msgIoErrorOnSend(ioe.getMessage())); System.exit(RETURN_SEND_ERROR); } } }