diff options
author | Ade Lee <alee@redhat.com> | 2011-12-07 16:58:12 -0500 |
---|---|---|
committer | Ade Lee <alee@redhat.com> | 2011-12-07 16:58:12 -0500 |
commit | 32150d3ee32f8ac27118af7c792794b538c78a2f (patch) | |
tree | 52dd96f664a6fa51be25b28b6f10adc5f2c9f660 /pki/base/silent/src/com/netscape/pkisilent/http | |
parent | f05d58a46795553beb8881039cc922974b40db34 (diff) | |
download | pki-32150d3ee32f8ac27118af7c792794b538c78a2f.tar.gz pki-32150d3ee32f8ac27118af7c792794b538c78a2f.tar.xz pki-32150d3ee32f8ac27118af7c792794b538c78a2f.zip |
Formatting
Formatted project according to eclipse project settings
Diffstat (limited to 'pki/base/silent/src/com/netscape/pkisilent/http')
4 files changed, 1939 insertions, 2318 deletions
diff --git a/pki/base/silent/src/com/netscape/pkisilent/http/CertSelection.java b/pki/base/silent/src/com/netscape/pkisilent/http/CertSelection.java index 078bb588..ff541b6c 100644 --- a/pki/base/silent/src/com/netscape/pkisilent/http/CertSelection.java +++ b/pki/base/silent/src/com/netscape/pkisilent/http/CertSelection.java @@ -1,4 +1,5 @@ package com.netscape.pkisilent.http; + // --- BEGIN COPYRIGHT BLOCK --- // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -21,28 +22,24 @@ import java.util.Vector; import org.mozilla.jss.ssl.SSLClientCertificateSelectionCallback; +public class CertSelection implements SSLClientCertificateSelectionCallback { -public class CertSelection implements SSLClientCertificateSelectionCallback -{ - - // make the select() call to use this client cert - public static String client_cert = null; + // make the select() call to use this client cert + public static String client_cert = null; - public void setClientCert(String nickname) - { - client_cert = nickname; - } + public void setClientCert(String nickname) { + client_cert = nickname; + } - public String select(@SuppressWarnings("rawtypes") Vector nicknames) - { + public String select(@SuppressWarnings("rawtypes") Vector nicknames) { - // when this method is called by SSLSocket we get a vector - // of nicknames to select similar to the way the browser presents - // the list. + // when this method is called by SSLSocket we get a vector + // of nicknames to select similar to the way the browser presents + // the list. - // We will just use the one thats set by setClientCert() + // We will just use the one thats set by setClientCert() - return client_cert; - } + return client_cert; + } }; // end class diff --git a/pki/base/silent/src/com/netscape/pkisilent/http/HTMLDocument.java b/pki/base/silent/src/com/netscape/pkisilent/http/HTMLDocument.java index df95f861..5c655649 100644 --- a/pki/base/silent/src/com/netscape/pkisilent/http/HTMLDocument.java +++ b/pki/base/silent/src/com/netscape/pkisilent/http/HTMLDocument.java @@ -1,4 +1,5 @@ package com.netscape.pkisilent.http; + // --- BEGIN COPYRIGHT BLOCK --- // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -25,727 +26,584 @@ import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern; - - -public class HTMLDocument -{ - // Indicates whether this HTML document has been parsed. - boolean parsed; - - // A list of URLs of files that should be retrieved along with the main - // contents of the document. This may include any images contained in the - // document, and possibly any external stylesheets. - LinkedHashSet<String> associatedFiles; - - // A list of URLs of frames that are contained in the document. - LinkedHashSet<String> documentFrames; - - // A list of URLs of links that are contained in the document. - LinkedHashSet<String> documentLinks; - - // A list of URLs of images that are contained in the document. - LinkedHashSet<String> documentImages; - - // A regular expression pattern that can be used to extract a URI from an HREF - // tag. - Pattern hrefPattern; - - // A regular expression pattern that can be used to extract a URI from a SRC - // tag. - Pattern srcPattern; - - // The base URL for relative links in this document. - String baseURL; - - // The URL that may be used to access this document. - String documentURL; - - // The actual contents of the page. - String htmlData; - - // The contents of the page converted to lowercase for easier matching. - String lowerData; - - // The URL for this document with only protocol, host, and port (i.e., no - // file). - String protocolHostPort; - - // A string buffer containing the contents of the page with tags removed. - StringBuffer textData; - - - // A set of private variables used for internal processing. - private boolean lastElementIsAssociatedFile; - private boolean lastElementIsChunk; - private boolean lastElementIsComment; - private boolean lastElementIsFrame; - private boolean lastElementIsImage; - private boolean lastElementIsLink; - private boolean lastElementIsText; - private int lastElementEndPos; - private int lastElementStartPos; - private String lastURL; - - // constructor that helps to parse without url stuff - public HTMLDocument(String htmlData) - { - this.documentURL = null; - this.htmlData = htmlData; - lowerData = htmlData.toLowerCase(); - associatedFiles = null; - documentLinks = null; - documentImages = null; - textData = null; - parsed = false; - - - // Create the regex patterns that we will use for extracting URIs from tags. - hrefPattern = Pattern.compile(".*?[hH][rR][eE][fF][\\s=\\\"\\']+" + - "([^\\s\\\"\\'\\>]+).*", Pattern.DOTALL); - srcPattern = Pattern.compile(".*?[sS][rR][cC][\\s=\\\"\\']+" + - "([^\\s\\\"\\'\\>]+).*", Pattern.DOTALL); - } - - - /** - * Creates a new HTML document using the provided data. - * - * @param documentURL The URL for this document. - * @param htmlData The actual data contained in the HTML document. - */ - public HTMLDocument(String documentURL, String htmlData) - throws MalformedURLException - { - this.documentURL = documentURL; - this.htmlData = htmlData; - lowerData = htmlData.toLowerCase(); - associatedFiles = null; - documentLinks = null; - documentImages = null; - textData = null; - parsed = false; - - - // Create the regex patterns that we will use for extracting URIs from tags. - hrefPattern = Pattern.compile(".*?[hH][rR][eE][fF][\\s=\\\"\\']+" + - "([^\\s\\\"\\'\\>]+).*", Pattern.DOTALL); - srcPattern = Pattern.compile(".*?[sS][rR][cC][\\s=\\\"\\']+" + - "([^\\s\\\"\\'\\>]+).*", Pattern.DOTALL); - - URL url = new URL(documentURL); - String urlPath = url.getPath(); - if ((urlPath == null) || (urlPath.length() == 0)) - { - baseURL = documentURL; - protocolHostPort = documentURL; - } - else if (urlPath.equals("/")) - { - baseURL = documentURL; - protocolHostPort = documentURL.substring(0, documentURL.length()-1); - } - else if (urlPath.endsWith("/")) - { - baseURL = documentURL; - - int port = url.getPort(); - if (port > 0) - { - protocolHostPort = url.getProtocol() + "://" + url.getHost() + ":" + - port; - } - else - { - protocolHostPort = url.getProtocol() + "://" + url.getHost(); - } - } - else - { - int port = url.getPort(); - if (port > 0) - { - protocolHostPort = url.getProtocol() + "://" + url.getHost() + ":" + - port; - } - else - { - protocolHostPort = url.getProtocol() + "://" + url.getHost(); - } - - File urlFile = new File(urlPath); - String parentDirectory = urlFile.getParent(); - if ((parentDirectory == null) || (parentDirectory.length() == 0)) - { - parentDirectory = "/"; - } - else if (! parentDirectory.startsWith("/")) - { - parentDirectory = "/" + parentDirectory; - } - - baseURL = protocolHostPort + parentDirectory; - } - - if (! baseURL.endsWith("/")) - { - baseURL = baseURL + "/"; +public class HTMLDocument { + // Indicates whether this HTML document has been parsed. + boolean parsed; + + // A list of URLs of files that should be retrieved along with the main + // contents of the document. This may include any images contained in the + // document, and possibly any external stylesheets. + LinkedHashSet<String> associatedFiles; + + // A list of URLs of frames that are contained in the document. + LinkedHashSet<String> documentFrames; + + // A list of URLs of links that are contained in the document. + LinkedHashSet<String> documentLinks; + + // A list of URLs of images that are contained in the document. + LinkedHashSet<String> documentImages; + + // A regular expression pattern that can be used to extract a URI from an + // HREF + // tag. + Pattern hrefPattern; + + // A regular expression pattern that can be used to extract a URI from a SRC + // tag. + Pattern srcPattern; + + // The base URL for relative links in this document. + String baseURL; + + // The URL that may be used to access this document. + String documentURL; + + // The actual contents of the page. + String htmlData; + + // The contents of the page converted to lowercase for easier matching. + String lowerData; + + // The URL for this document with only protocol, host, and port (i.e., no + // file). + String protocolHostPort; + + // A string buffer containing the contents of the page with tags removed. + StringBuffer textData; + + // A set of private variables used for internal processing. + private boolean lastElementIsAssociatedFile; + private boolean lastElementIsChunk; + private boolean lastElementIsComment; + private boolean lastElementIsFrame; + private boolean lastElementIsImage; + private boolean lastElementIsLink; + private boolean lastElementIsText; + private int lastElementEndPos; + private int lastElementStartPos; + private String lastURL; + + // constructor that helps to parse without url stuff + public HTMLDocument(String htmlData) { + this.documentURL = null; + this.htmlData = htmlData; + lowerData = htmlData.toLowerCase(); + associatedFiles = null; + documentLinks = null; + documentImages = null; + textData = null; + parsed = false; + + // Create the regex patterns that we will use for extracting URIs from + // tags. + hrefPattern = Pattern.compile(".*?[hH][rR][eE][fF][\\s=\\\"\\']+" + + "([^\\s\\\"\\'\\>]+).*", Pattern.DOTALL); + srcPattern = Pattern.compile(".*?[sS][rR][cC][\\s=\\\"\\']+" + + "([^\\s\\\"\\'\\>]+).*", Pattern.DOTALL); } - } - - - /** - * Actually parses the HTML document and extracts useful elements from it. - * - * @return <CODE>true</CODE> if the page could be parsed successfully, or - * <CODE>false</CODE> if not. - */ - public boolean parse() - { - if (parsed) - { - return true; - } + /** + * Creates a new HTML document using the provided data. + * + * @param documentURL The URL for this document. + * @param htmlData The actual data contained in the HTML document. + */ + public HTMLDocument(String documentURL, String htmlData) + throws MalformedURLException { + this.documentURL = documentURL; + this.htmlData = htmlData; + lowerData = htmlData.toLowerCase(); + associatedFiles = null; + documentLinks = null; + documentImages = null; + textData = null; + parsed = false; + + // Create the regex patterns that we will use for extracting URIs from + // tags. + hrefPattern = Pattern.compile(".*?[hH][rR][eE][fF][\\s=\\\"\\']+" + + "([^\\s\\\"\\'\\>]+).*", Pattern.DOTALL); + srcPattern = Pattern.compile(".*?[sS][rR][cC][\\s=\\\"\\']+" + + "([^\\s\\\"\\'\\>]+).*", Pattern.DOTALL); + + URL url = new URL(documentURL); + String urlPath = url.getPath(); + if ((urlPath == null) || (urlPath.length() == 0)) { + baseURL = documentURL; + protocolHostPort = documentURL; + } else if (urlPath.equals("/")) { + baseURL = documentURL; + protocolHostPort = documentURL.substring(0, + documentURL.length() - 1); + } else if (urlPath.endsWith("/")) { + baseURL = documentURL; + + int port = url.getPort(); + if (port > 0) { + protocolHostPort = url.getProtocol() + "://" + url.getHost() + + ":" + port; + } else { + protocolHostPort = url.getProtocol() + "://" + url.getHost(); + } + } else { + int port = url.getPort(); + if (port > 0) { + protocolHostPort = url.getProtocol() + "://" + url.getHost() + + ":" + port; + } else { + protocolHostPort = url.getProtocol() + "://" + url.getHost(); + } + File urlFile = new File(urlPath); + String parentDirectory = urlFile.getParent(); + if ((parentDirectory == null) || (parentDirectory.length() == 0)) { + parentDirectory = "/"; + } else if (!parentDirectory.startsWith("/")) { + parentDirectory = "/" + parentDirectory; + } - try - { - associatedFiles = new LinkedHashSet<String>(); - documentFrames = new LinkedHashSet<String>(); - documentLinks = new LinkedHashSet<String>(); - documentImages = new LinkedHashSet<String>(); - textData = new StringBuffer(); - - lastElementStartPos = 0; - lastElementEndPos = -1; - String element; - while ((element = nextDocumentElement()) != null) - { - if (element.length() == 0) - { - continue; + baseURL = protocolHostPort + parentDirectory; } - if (lastElementIsText) - { - char lastChar; - if (textData.length() == 0) - { - lastChar = ' '; - } - else - { - lastChar = textData.charAt(textData.length()-1); - } - char firstChar = element.charAt(0); - if (! ((lastChar == ' ') || (lastChar == '\t') || - (lastChar == '\r') || (lastChar == '\n')) || - (firstChar == ' ') || (firstChar == '\t') || - (firstChar == '\r') || (firstChar == '\n')) - { - textData.append(" "); - } - - textData.append(element); - } - else if (lastElementIsImage) - { - if (lastURL != null) - { - documentImages.add(lastURL); - associatedFiles.add(lastURL); - } - } - else if (lastElementIsFrame) - { - if (lastURL != null) - { - documentFrames.add(lastURL); - associatedFiles.add(lastURL); - } - } - else if (lastElementIsLink) - { - if (lastURL != null) - { - documentLinks.add(lastURL); - } - } - else if (lastElementIsAssociatedFile) - { - if (lastURL != null) - { - associatedFiles.add(lastURL); - } - } - else if (lastElementIsChunk || lastElementIsComment) - { - // Don't need to do anything with this. + if (!baseURL.endsWith("/")) { + baseURL = baseURL + "/"; } - else - { - // Also don't need anything here. - } - } - - parsed = true; - } - catch (Exception e) - { - associatedFiles = null; - documentLinks = null; - documentImages = null; - textData = null; - parsed = false; } - return parsed; - } + /** + * Actually parses the HTML document and extracts useful elements from it. + * + * @return <CODE>true</CODE> if the page could be parsed successfully, or + * <CODE>false</CODE> if not. + */ + public boolean parse() { + if (parsed) { + return true; + } + try { + associatedFiles = new LinkedHashSet<String>(); + documentFrames = new LinkedHashSet<String>(); + documentLinks = new LinkedHashSet<String>(); + documentImages = new LinkedHashSet<String>(); + textData = new StringBuffer(); + + lastElementStartPos = 0; + lastElementEndPos = -1; + String element; + while ((element = nextDocumentElement()) != null) { + if (element.length() == 0) { + continue; + } + + if (lastElementIsText) { + char lastChar; + if (textData.length() == 0) { + lastChar = ' '; + } else { + lastChar = textData.charAt(textData.length() - 1); + } + char firstChar = element.charAt(0); + if (!((lastChar == ' ') || (lastChar == '\t') + || (lastChar == '\r') || (lastChar == '\n')) + || (firstChar == ' ') + || (firstChar == '\t') + || (firstChar == '\r') || (firstChar == '\n')) { + textData.append(" "); + } + + textData.append(element); + } else if (lastElementIsImage) { + if (lastURL != null) { + documentImages.add(lastURL); + associatedFiles.add(lastURL); + } + } else if (lastElementIsFrame) { + if (lastURL != null) { + documentFrames.add(lastURL); + associatedFiles.add(lastURL); + } + } else if (lastElementIsLink) { + if (lastURL != null) { + documentLinks.add(lastURL); + } + } else if (lastElementIsAssociatedFile) { + if (lastURL != null) { + associatedFiles.add(lastURL); + } + } else if (lastElementIsChunk || lastElementIsComment) { + // Don't need to do anything with this. + } else { + // Also don't need anything here. + } + } + parsed = true; + } catch (Exception e) { + associatedFiles = null; + documentLinks = null; + documentImages = null; + textData = null; + parsed = false; + } - /** - * Retrieves the next element from the HTML document. An HTML element can - * include a string of plain text, a single HTML tag, or a larger chunk of - * HTML including a start and end tag, all of which should be considered a - * single element. - */ - private String nextDocumentElement() - { - // If we're at the end of the HTML, then return null. - if (lastElementEndPos >= htmlData.length()) - { - return null; + return parsed; } + /** + * Retrieves the next element from the HTML document. An HTML element can + * include a string of plain text, a single HTML tag, or a larger chunk of + * HTML including a start and end tag, all of which should be considered a + * single element. + */ + private String nextDocumentElement() { + // If we're at the end of the HTML, then return null. + if (lastElementEndPos >= htmlData.length()) { + return null; + } - // Initialize the variables we will use for the search. - lastElementStartPos = lastElementEndPos+1; - lastElementIsAssociatedFile = false; - lastElementIsChunk = false; - lastElementIsComment = false; - lastElementIsFrame = false; - lastElementIsImage = false; - lastElementIsLink = false; - lastElementIsText = false; - lastURL = null; - - - // Find the location of the next open angle bracket. If there is none, then - // the rest of the document must be plain text. - int openPos = lowerData.indexOf('<', lastElementStartPos); - if (openPos < 0) - { - lastElementEndPos = htmlData.length(); - lastElementIsText = true; - return htmlData.substring(lastElementStartPos); - } + // Initialize the variables we will use for the search. + lastElementStartPos = lastElementEndPos + 1; + lastElementIsAssociatedFile = false; + lastElementIsChunk = false; + lastElementIsComment = false; + lastElementIsFrame = false; + lastElementIsImage = false; + lastElementIsLink = false; + lastElementIsText = false; + lastURL = null; + + // Find the location of the next open angle bracket. If there is none, + // then + // the rest of the document must be plain text. + int openPos = lowerData.indexOf('<', lastElementStartPos); + if (openPos < 0) { + lastElementEndPos = htmlData.length(); + lastElementIsText = true; + return htmlData.substring(lastElementStartPos); + } + // If the location of the next open tag is not we started looking, then + // read + // everything up to that tag as text. + if (openPos > lastElementStartPos) { + lastElementEndPos = openPos - 1; + lastElementIsText = true; + return htmlData.substring(lastElementStartPos, openPos); + } - // If the location of the next open tag is not we started looking, then read - // everything up to that tag as text. - if (openPos > lastElementStartPos) - { - lastElementEndPos = openPos-1; - lastElementIsText = true; - return htmlData.substring(lastElementStartPos, openPos); - } + // The start position is an open tag. See if the tag is actually "<!--", + // which indicates an HTML comment. If that's the case, then find the + // closing "-->". + if (openPos == lowerData.indexOf("<!--", lastElementStartPos)) { + int closePos = lowerData.indexOf("-->", openPos + 1); + if (closePos < 0) { + // This looks like an unterminated comment. We can't do much + // else + // here, so just stop parsing. + return null; + } else { + lastElementEndPos = closePos + 2; + lastElementIsComment = true; + return htmlData.substring(lastElementStartPos, + lastElementEndPos + 1); + } + } + // Find the location of the next close angle bracket. If there is none, + // then we have an unmatched open tag. What to do here? I guess just + // treat + // the rest of the document as text. + int closePos = lowerData.indexOf('>', openPos + 1); + if (closePos < 0) { + lastElementEndPos = htmlData.length(); + lastElementIsText = true; + return htmlData.substring(lastElementStartPos); + } - // The start position is an open tag. See if the tag is actually "<!--", - // which indicates an HTML comment. If that's the case, then find the - // closing "-->". - if (openPos == lowerData.indexOf("<!--", lastElementStartPos)) - { - int closePos = lowerData.indexOf("-->", openPos+1); - if (closePos < 0) - { - // This looks like an unterminated comment. We can't do much else - // here, so just stop parsing. - return null; - } - else - { - lastElementEndPos = closePos + 2; - lastElementIsComment = true; - return htmlData.substring(lastElementStartPos, lastElementEndPos+1); - } - } + // Grab the contents of the tag in both normal and lowercase. + String tag = htmlData.substring(openPos, closePos + 1); + String strippedTag = htmlData.substring(openPos + 1, closePos).trim(); + StringTokenizer tokenizer = new StringTokenizer(strippedTag, + " \t\r\n=\"'"); + lastElementEndPos = closePos; + if (!tokenizer.hasMoreTokens()) { + return tag; + } - // Find the location of the next close angle bracket. If there is none, - // then we have an unmatched open tag. What to do here? I guess just treat - // the rest of the document as text. - int closePos = lowerData.indexOf('>', openPos+1); - if (closePos < 0) - { - lastElementEndPos = htmlData.length(); - lastElementIsText = true; - return htmlData.substring(lastElementStartPos); - } + String token = tokenizer.nextToken(); + String lowerToken = token.toLowerCase(); + + if (lowerToken.equals("a") || lowerToken.equals("area")) { + while (tokenizer.hasMoreTokens()) { + token = tokenizer.nextToken(); + if (token.equalsIgnoreCase("href")) { + try { + Matcher matcher = hrefPattern.matcher(tag); + lastURL = uriToURL(matcher.replaceAll("$1")); + if (lastURL != null) { + lastElementIsLink = true; + } + } catch (Exception e) { + } + break; + } + } + } else if (lowerToken.equals("base")) { + while (tokenizer.hasMoreTokens()) { + token = tokenizer.nextToken(); + if (token.equalsIgnoreCase("href")) { + try { + Matcher matcher = hrefPattern.matcher(tag); + String uri = matcher.replaceAll("$1"); + if (!uri.endsWith("/")) { + uri = uri + "/"; + } + + baseURL = uri; + } catch (Exception e) { + } + break; + } + } + } else if (lowerToken.equals("frame") || lowerToken.equals("iframe") + || lowerToken.equals("input")) { + while (tokenizer.hasMoreTokens()) { + token = tokenizer.nextToken(); + if (token.equalsIgnoreCase("src")) { + try { + Matcher matcher = srcPattern.matcher(tag); + String uri = matcher.replaceAll("$1"); + lastURL = uriToURL(uri); + if (lastURL != null) { + lastElementIsFrame = true; + lastElementIsAssociatedFile = true; + } + } catch (Exception e) { + } + break; + } + } + } else if (lowerToken.equals("img")) { + while (tokenizer.hasMoreTokens()) { + token = tokenizer.nextToken(); + if (token.equalsIgnoreCase("src")) { + try { + Matcher matcher = srcPattern.matcher(tag); + String uri = matcher.replaceAll("$1"); + lastURL = uriToURL(uri); + if (lastURL != null) { + lastElementIsImage = true; + } + } catch (Exception e) { + } + break; + } + } + } else if (lowerToken.equals("link")) { + boolean isStyleSheet = false; + + while (tokenizer.hasMoreTokens()) { + token = tokenizer.nextToken(); + if (token.equalsIgnoreCase("href")) { + try { + Matcher matcher = hrefPattern.matcher(tag); + String uri = matcher.replaceAll("$1"); + lastURL = uriToURL(uri); + if (lastURL != null) { + lastElementIsLink = true; + } + } catch (Exception e) { + } + break; + } else if (token.equalsIgnoreCase("rel")) { + if (tokenizer.hasMoreTokens()) { + String relType = tokenizer.nextToken(); + if (relType.equalsIgnoreCase("stylesheet")) { + isStyleSheet = true; + } + } + } + } + if (lastURL != null) { + if (isStyleSheet) { + lastElementIsAssociatedFile = true; + } else { + lastElementIsLink = true; + } + } + } else if (lowerToken.equals("script")) { + while (tokenizer.hasMoreTokens()) { + token = tokenizer.nextToken(); + if (token.equalsIgnoreCase("src")) { + try { + Matcher matcher = srcPattern.matcher(tag); + String uri = matcher.replaceAll("$1"); + lastURL = uriToURL(uri); + } catch (Exception e) { + } + break; + } + } - // Grab the contents of the tag in both normal and lowercase. - String tag = htmlData.substring(openPos, closePos+1); - String strippedTag = htmlData.substring(openPos+1, closePos).trim(); - StringTokenizer tokenizer = new StringTokenizer(strippedTag, " \t\r\n=\"'"); - lastElementEndPos = closePos; + if (lastURL == null) { + int endScriptPos = lowerData.indexOf("</script>", + lastElementEndPos + 1); + if (endScriptPos > 0) { + lastElementEndPos = endScriptPos + 8; + tag = htmlData.substring(lastElementStartPos, + lastElementEndPos + 1); + lastElementIsChunk = true; + } + } else { + lastElementIsAssociatedFile = true; + } + } - if (! tokenizer.hasMoreTokens()) - { - return tag; + return tag; } - String token = tokenizer.nextToken(); - String lowerToken = token.toLowerCase(); - - if (lowerToken.equals("a") || lowerToken.equals("area")) - { - while (tokenizer.hasMoreTokens()) - { - token = tokenizer.nextToken(); - if (token.equalsIgnoreCase("href")) - { - try - { - Matcher matcher = hrefPattern.matcher(tag); - lastURL = uriToURL(matcher.replaceAll("$1")); - if (lastURL != null) - { - lastElementIsLink = true; + /** + * Converts the provided URI to a URL. The provided URI may be a URL + * already, or it may also be an absolute path on the server or a path + * relative to the base URL. + * + * @param uri The URI to convert to a URL. + * + * @return The URL based on the provided URI. + */ + private String uriToURL(String uri) { + String url = null; + + if (uri.indexOf("://") > 0) { + if (uri.startsWith("http")) { + url = uri; } - } catch (Exception e) {} - break; + } else if (uri.startsWith("/")) { + url = protocolHostPort + uri; + } else { + url = baseURL + uri; } - } + + return url; } - else if (lowerToken.equals("base")) - { - while (tokenizer.hasMoreTokens()) - { - token = tokenizer.nextToken(); - if (token.equalsIgnoreCase("href")) - { - try - { - Matcher matcher = hrefPattern.matcher(tag); - String uri = matcher.replaceAll("$1"); - if (! uri.endsWith("/")) - { - uri = uri + "/"; - } - baseURL = uri; - } catch (Exception e) {} - break; - } - } + /** + * Retrieves the URL of this HTML document. + * + * @return The URL of this HTML document. + */ + public String getDocumentURL() { + return documentURL; } - else if (lowerToken.equals("frame") || lowerToken.equals("iframe") || - lowerToken.equals("input")) - { - while (tokenizer.hasMoreTokens()) - { - token = tokenizer.nextToken(); - if (token.equalsIgnoreCase("src")) - { - try - { - Matcher matcher = srcPattern.matcher(tag); - String uri = matcher.replaceAll("$1"); - lastURL = uriToURL(uri); - if (lastURL != null) - { - lastElementIsFrame = true; - lastElementIsAssociatedFile = true; - } - } catch (Exception e) {} - break; - } - } + + /** + * Retrieves the original HTML data used to create this document. + * + * @return The orginal HTML data used to create this document. + */ + public String getHTMLData() { + return htmlData; } - else if (lowerToken.equals("img")) - { - while (tokenizer.hasMoreTokens()) - { - token = tokenizer.nextToken(); - if (token.equalsIgnoreCase("src")) - { - try - { - Matcher matcher = srcPattern.matcher(tag); - String uri = matcher.replaceAll("$1"); - lastURL = uriToURL(uri); - if (lastURL != null) - { - lastElementIsImage = true; + + /** + * Retrieves the contents of the HTML document with all tags removed. + * + * @return The contents of the HTML document with all tags removed, or + * <CODE>null</CODE> if a problem occurs while trying to parse the + * HTML. + */ + public String getTextData() { + if (!parsed) { + if (!parse()) { + return null; } - } catch (Exception e) {} - break; } - } + + return textData.toString(); } - else if (lowerToken.equals("link")) - { - boolean isStyleSheet = false; - - while (tokenizer.hasMoreTokens()) - { - token = tokenizer.nextToken(); - if (token.equalsIgnoreCase("href")) - { - try - { - Matcher matcher = hrefPattern.matcher(tag); - String uri = matcher.replaceAll("$1"); - lastURL = uriToURL(uri); - if (lastURL != null) - { - lastElementIsLink = true; - } - } catch (Exception e) {} - break; - } - else if (token.equalsIgnoreCase("rel")) - { - if (tokenizer.hasMoreTokens()) - { - String relType = tokenizer.nextToken(); - if (relType.equalsIgnoreCase("stylesheet")) - { - isStyleSheet = true; + + /** + * Retrieves an array containing a set of URLs parsed from the HTML document + * that reference files that would normally be downloaded as part of + * retrieving a page in a browser. This includes images and external style + * sheets. + * + * @return An array containing a set of URLs to files associated with the + * HTML document, or <CODE>null</CODE> if a problem occurs while + * trying to parse the HTML. + */ + public String[] getAssociatedFiles() { + if (!parsed) { + if (!parse()) { + return null; } - } } - } - if (lastURL != null) - { - if (isStyleSheet) - { - lastElementIsAssociatedFile = true; - } - else - { - lastElementIsLink = true; - } - } - } - else if (lowerToken.equals("script")) - { - while (tokenizer.hasMoreTokens()) - { - token = tokenizer.nextToken(); - if (token.equalsIgnoreCase("src")) - { - try - { - Matcher matcher = srcPattern.matcher(tag); - String uri = matcher.replaceAll("$1"); - lastURL = uriToURL(uri); - } catch (Exception e) {} - break; - } - } - - if (lastURL == null) - { - int endScriptPos = lowerData.indexOf("</script>", lastElementEndPos+1); - if (endScriptPos > 0) - { - lastElementEndPos = endScriptPos + 8; - tag = htmlData.substring(lastElementStartPos, lastElementEndPos+1); - lastElementIsChunk = true; - } - } - else - { - lastElementIsAssociatedFile = true; - } + String[] urlArray = new String[associatedFiles.size()]; + associatedFiles.toArray(urlArray); + return urlArray; } - return tag; - } - - - - /** - * Converts the provided URI to a URL. The provided URI may be a URL already, - * or it may also be an absolute path on the server or a path relative to the - * base URL. - * - * @param uri The URI to convert to a URL. - * - * @return The URL based on the provided URI. - */ - private String uriToURL(String uri) - { - String url = null; - - if (uri.indexOf("://") > 0) - { - if (uri.startsWith("http")) - { - url = uri; - } - } - else if (uri.startsWith("/")) - { - url = protocolHostPort + uri; - } - else - { - url = baseURL + uri; - } + /** + * Retrieves an array containing a set of URLs parsed from the HTML document + * that are in the form of links to other content. + * + * @return An array containing a set of URLs parsed from the HTML document + * that are in the form of links to other content, or + * <CODE>null</CODE> if a problem occurs while trying to parse the + * HTML. + */ + public String[] getDocumentLinks() { + if (!parsed) { + if (!parse()) { + return null; + } + } - return url; - } - - - - /** - * Retrieves the URL of this HTML document. - * - * @return The URL of this HTML document. - */ - public String getDocumentURL() - { - return documentURL; - } - - - - /** - * Retrieves the original HTML data used to create this document. - * - * @return The orginal HTML data used to create this document. - */ - public String getHTMLData() - { - return htmlData; - } - - - - /** - * Retrieves the contents of the HTML document with all tags removed. - * - * @return The contents of the HTML document with all tags removed, or - * <CODE>null</CODE> if a problem occurs while trying to parse the - * HTML. - */ - public String getTextData() - { - if (! parsed) - { - if (! parse()) - { - return null; - } + String[] urlArray = new String[documentLinks.size()]; + documentLinks.toArray(urlArray); + return urlArray; } - return textData.toString(); - } - - - - /** - * Retrieves an array containing a set of URLs parsed from the HTML document - * that reference files that would normally be downloaded as part of - * retrieving a page in a browser. This includes images and external style - * sheets. - * - * @return An array containing a set of URLs to files associated with the - * HTML document, or <CODE>null</CODE> if a problem occurs while - * trying to parse the HTML. - */ - public String[] getAssociatedFiles() - { - if (! parsed) - { - if (! parse()) - { - return null; - } - } + /** + * Retrieves an array containing a set of URLs parsed from the HTML document + * that reference images used in the document. + * + * @return An array containing a set of URLs parsed from the HTML document + * that reference images used in the document. + */ + public String[] getDocumentImages() { + if (!parsed) { + if (!parse()) { + return null; + } + } - String[] urlArray = new String[associatedFiles.size()]; - associatedFiles.toArray(urlArray); - return urlArray; - } - - - - /** - * Retrieves an array containing a set of URLs parsed from the HTML document - * that are in the form of links to other content. - * - * @return An array containing a set of URLs parsed from the HTML document - * that are in the form of links to other content, or - * <CODE>null</CODE> if a problem occurs while trying to parse the - * HTML. - */ - public String[] getDocumentLinks() - { - if (! parsed) - { - if (! parse()) - { - return null; - } + String[] urlArray = new String[documentImages.size()]; + documentImages.toArray(urlArray); + return urlArray; } - String[] urlArray = new String[documentLinks.size()]; - documentLinks.toArray(urlArray); - return urlArray; - } - - - - /** - * Retrieves an array containing a set of URLs parsed from the HTML document - * that reference images used in the document. - * - * @return An array containing a set of URLs parsed from the HTML document - * that reference images used in the document. - */ - public String[] getDocumentImages() - { - if (! parsed) - { - if (! parse()) - { - return null; - } - } + /** + * Retrieves an array containing a set of URLs parsed from the HTML document + * that reference frames used in the document. + * + * @return An array containing a set of URLs parsed from the HTML document + * that reference frames used in the document. + */ + public String[] getDocumentFrames() { + if (!parsed) { + if (!parse()) { + return null; + } + } - String[] urlArray = new String[documentImages.size()]; - documentImages.toArray(urlArray); - return urlArray; - } - - - - /** - * Retrieves an array containing a set of URLs parsed from the HTML document - * that reference frames used in the document. - * - * @return An array containing a set of URLs parsed from the HTML document - * that reference frames used in the document. - */ - public String[] getDocumentFrames() - { - if (! parsed) - { - if (! parse()) - { - return null; - } + String[] urlArray = new String[documentFrames.size()]; + documentFrames.toArray(urlArray); + return urlArray; } - - String[] urlArray = new String[documentFrames.size()]; - documentFrames.toArray(urlArray); - return urlArray; - } } - diff --git a/pki/base/silent/src/com/netscape/pkisilent/http/HTTPClient.java b/pki/base/silent/src/com/netscape/pkisilent/http/HTTPClient.java index 066fb0b4..0ab1a639 100644 --- a/pki/base/silent/src/com/netscape/pkisilent/http/HTTPClient.java +++ b/pki/base/silent/src/com/netscape/pkisilent/http/HTTPClient.java @@ -1,4 +1,5 @@ package com.netscape.pkisilent.http; + // --- BEGIN COPYRIGHT BLOCK --- // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -42,1367 +43,1201 @@ import com.netscape.pkisilent.argparser.ArgParser; import com.netscape.pkisilent.argparser.StringHolder; import com.netscape.pkisilent.common.ComCrypto; +public class HTTPClient implements SSLCertificateApprovalCallback { -public class HTTPClient implements SSLCertificateApprovalCallback -{ - - public static final int BUFFER_SIZE = 4096; - public boolean debugMode = true; - - public static String basic_auth_header_value = null; - - public static String cs_hostname = null; - public static String cs_port = null; - public static String ssl = null; - public static String client_certdb_dir = null; - public static String client_certdb_pwd = null; - public static String client_cert_nickname = null; - public static String uri = null; - public static String query = null; - public static String request_type = null; - public static String user_id = null; - public static String user_password = null; - public static String auth_type = null; - public static String debug = null; - - public static boolean parse_xml = false; - - public static X509Certificate server_cert = null; - - // cookie variable for CS install UI - public static String j_session_id = null; - public static boolean ecc_support = false; - - - - - public HTTPClient() - { - // constructor - // turn off ecc by default - ecc_support = true; - } - - - public HTTPClient(boolean ecc) - { - ecc_support = ecc; - } - - public boolean setCipherPref(SSLSocket socket) - { - - if(ecc_support) - { - int ecc_Ciphers[] = { - SSLSocket.TLS_ECDH_ECDSA_WITH_NULL_SHA, SSLSocket.TLS_ECDH_ECDSA_WITH_RC4_128_SHA, - SSLSocket.TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, SSLSocket.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, - SSLSocket.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, SSLSocket.TLS_ECDHE_ECDSA_WITH_NULL_SHA, - SSLSocket.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, SSLSocket.TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, - SSLSocket.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, SSLSocket.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, - SSLSocket.TLS_ECDH_RSA_WITH_NULL_SHA, SSLSocket.TLS_ECDH_RSA_WITH_RC4_128_SHA, - SSLSocket.TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, SSLSocket.TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, - SSLSocket.TLS_ECDHE_RSA_WITH_NULL_SHA, SSLSocket.TLS_ECDHE_RSA_WITH_RC4_128_SHA, - SSLSocket.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSLSocket.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, - SSLSocket.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, - 0 }; - - try - { - for (int i=0; i < ecc_Ciphers.length; i++) - { - if(ecc_Ciphers[i] > 0) - socket.setCipherPreference( - ecc_Ciphers[i],true); - } - } - catch(Exception e) - { - System.out.println("ERROR: unable to set ECC Cipher List"); - System.out.println("ERROR: Exception = " + e.getMessage()); - } - - } - return true; - } - - public boolean disableSSL2(SSLSocket socket) - { - try - { - SSLSocket.enableSSL3Default(true); - socket.enableSSL3(true); - socket.enableSSL2(false); - SSLSocket.enableSSL2Default(false); - socket.enableV2CompatibleHello(false); - } - catch(Exception e) - { - System.out.println("ERROR: Exception = " + e.getMessage()); - } - return true; - } - - public X509Certificate getServerCert() - { - return server_cert; - } - - public void set_parse_xml(boolean b) - { - parse_xml = b; - } - - public boolean approve(X509Certificate cert, - SSLCertificateApprovalCallback.ValidityStatus status) - { - - // when this method is called by SSLSocket we get the server cert - // we can capture this for future use. - server_cert = cert; - return true; - } - - public boolean testsslConnect(String hostname, String portnumber) - { - boolean st = true; - - try - { - - System.out.println("#############################################"); - System.out.println("Attempting to connect to: " + hostname + ":" + - portnumber); - - Integer x = new Integer(portnumber); - int port = x.intValue(); - - - SSLClientCertificateSelectionCallback certSelectionCallback = - new TestClientCertificateSelectionCallback(); - - Socket js = new Socket(InetAddress.getByName(hostname), port); - SSLSocket socket = new SSLSocket(js, hostname, this, - certSelectionCallback ); - setCipherPref(socket); - disableSSL2(socket); - socket.forceHandshake(); - System.out.println("Connected."); - socket.setUseClientMode(true); - - // test connection to obtain server cert. close it. - socket.close(); - - - } - - catch(Exception e) - { - System.err.println("Exception: Unable to Send Request:" +e); - e.printStackTrace(); - st = false; - } - - if(!st) - return false; - else - return true; - } - - // performs ssl connect to given host/port requiring client auth - // posts the given query data - // returns HTTPResponse - public HTTPResponse sslConnectClientAuth(String hostname, String portnumber, - String client_cert,String url,String query) - { - - boolean st = true; - HTTPResponse hr = null; - - try - { - - System.out.println("#############################################"); - System.out.println("Attempting to connect to: " + hostname + ":" + - portnumber); - - Integer x = new Integer(portnumber); - int port = x.intValue(); - - - SSLCertificateApprovalCallback approvalCallback = - new TestCertApprovalCallback(); - CertSelection certSelectionCallback = - new CertSelection(); - - // Client Cert for Auth is set here - certSelectionCallback.setClientCert(client_cert); - - Socket js = new Socket(InetAddress.getByName(hostname), port); - SSLSocket socket = new SSLSocket(js, hostname, approvalCallback, - certSelectionCallback ); - disableSSL2(socket); - setCipherPref(socket); - socket.forceHandshake(); - System.out.println("Connected."); - socket.setUseClientMode(true); - - System.out.println("Posting Query = " + - "https://" + hostname + - ":" + portnumber + - "/" + url + - "?" + query); - - OutputStream rawos = socket.getOutputStream(); - BufferedOutputStream os = new BufferedOutputStream(rawos); - PrintStream ps = new PrintStream(os); - - ps.println("POST " + url + " HTTP/1.0"); - ps.println("Connection: Keep-Alive"); - ps.println("Content-type: application/x-www-form-urlencoded"); - ps.println("Content-length: " +query.length()); - ps.println(""); - ps.print(query); - ps.flush(); - os.flush(); - - try - { - hr = readResponse(socket.getInputStream()); - hr.parseContent(); - - } - catch (Exception e) - { - System.out.println("Exception"); - e.printStackTrace(); - st = false; - } - - socket.close(); - os.close(); - rawos.close(); - ps.close(); - - os=null; - rawos=null; - ps=null; - - } - - catch(Exception e) - { - System.err.println("Exception: Unable to Send Request:" +e); - e.printStackTrace(); - st = false; - } - - if(!st) - return null; - else - return hr; - } - - // performs ssl connect to given host/port - // posts the given query data - // returns HTTPResponse - public HTTPResponse sslConnect(String hostname, String portnumber, - String url, String query) - { - - boolean st = true; - HTTPResponse hr = null; - - try - { - - System.out.println("#############################################"); - System.out.println("Attempting to connect to: " + hostname + ":" + - portnumber); - - Integer x = new Integer(portnumber); - int port = x.intValue(); - - - SSLCertificateApprovalCallback approvalCallback = - new TestCertApprovalCallback(); - SSLClientCertificateSelectionCallback certSelectionCallback = - new TestClientCertificateSelectionCallback(); - - Socket js = new Socket(InetAddress.getByName(hostname), port); - SSLSocket socket = new SSLSocket(js, hostname, approvalCallback, - certSelectionCallback ); - setCipherPref(socket); - disableSSL2(socket); - socket.forceHandshake(); - System.out.println("Connected."); - socket.setUseClientMode(true); - - System.out.println("Posting Query = " + - "https://" + hostname + - ":" + portnumber + - "/" + url + - "?" + query); - - OutputStream rawos = socket.getOutputStream(); - BufferedOutputStream os = new BufferedOutputStream(rawos); - PrintStream ps = new PrintStream(os); - - - ps.println("POST " + url + " HTTP/1.0"); - - // check to see if we have a cookie to send - if(j_session_id != null ) - ps.println("Cookie: " + j_session_id); - - ps.println("Content-type: application/x-www-form-urlencoded"); - ps.println("Content-length: " +query.length()); - ps.println("Connection: Keep-Alive"); - - // special header posting if available - if(basic_auth_header_value != null) - { - System.out.println("basic_auth = " + basic_auth_header_value ); - ps.println("Authorization: Basic " + basic_auth_header_value ); - } - - ps.println(""); - ps.println(query); - ps.println("\r"); - ps.flush(); - os.flush(); - - try - { - hr = readResponse(socket.getInputStream()); - hr.parseContent(); - - } - catch (Exception e) - { - System.out.println("Exception"); - e.printStackTrace(); - st = false; - } - - socket.close(); - os.close(); - rawos.close(); - ps.close(); - - os=null; - rawos=null; - ps=null; - - } - - catch(Exception e) - { - System.err.println("Exception: Unable to Send Request:" +e); - e.printStackTrace(); - st = false; - } - - if(!st) - return null; - else - return hr; - } - - // performs non ssl connect to given host/port - // posts the given query data - // returns HTTPResponse - public HTTPResponse nonsslConnect(String hostname, String portnumber, - String url, String query) - { - - boolean st = true; - HTTPResponse hr = null; - - try - { - - System.out.println("#############################################"); - System.out.println("Attempting to connect to: " + hostname + ":" + - portnumber); - - Integer x = new Integer(portnumber); - int port = x.intValue(); - - Socket socket = new Socket(hostname, port); - - System.out.println("Posting Query = " + - "http://" + hostname + - ":" + portnumber + - "/" + url + - "?" + query); - - OutputStream rawos = socket.getOutputStream(); - BufferedOutputStream os = new BufferedOutputStream(rawos); - PrintStream ps = new PrintStream(os); - - System.out.println("Connected."); - - ps.println("POST " + url + " HTTP/1.0"); - - // check to see if we have a cookie to send - if(j_session_id != null ) - ps.println("Cookie: " + j_session_id); - - ps.println("Content-type: application/x-www-form-urlencoded"); - ps.println("Content-length: " +query.length()); - ps.println("Connection: Keep-Alive"); - - // special header posting if available - if(basic_auth_header_value != null) - { - System.out.println("basic_auth = " + basic_auth_header_value ); - ps.println("Authorization: Basic " + basic_auth_header_value ); - } - - ps.println(""); - ps.println(query); - ps.println("\r"); - ps.flush(); - os.flush(); - - try - { - hr = readResponse(socket.getInputStream()); - hr.parseContent(); - - } - catch (Exception e) - { - System.out.println("Exception"); - e.printStackTrace(); - st = false; - } - - socket.close(); - os.close(); - rawos.close(); - ps.close(); - - os=null; - rawos=null; - ps=null; - - } - - catch(Exception e) - { - System.err.println("Exception: Unable to Send Request:" +e); - e.printStackTrace(); - st = false; - } - - if(!st) - return null; - else - return hr; - } - - public HTTPResponse readResponse(InputStream inputStream) - throws Exception - { - // read response from http input stream and return HTTPResponse - byte[] buffer = new byte[BUFFER_SIZE]; - HTTPResponse response = null; - int statusCode = 0; - - // Read an initial chunk of the response from the server. - int bytesRead = inputStream.read(buffer); - if (bytesRead < 0) - { - throw new IOException("Unexpected end of input stream from server"); + public static final int BUFFER_SIZE = 4096; + public boolean debugMode = true; + + public static String basic_auth_header_value = null; + + public static String cs_hostname = null; + public static String cs_port = null; + public static String ssl = null; + public static String client_certdb_dir = null; + public static String client_certdb_pwd = null; + public static String client_cert_nickname = null; + public static String uri = null; + public static String query = null; + public static String request_type = null; + public static String user_id = null; + public static String user_password = null; + public static String auth_type = null; + public static String debug = null; + + public static boolean parse_xml = false; + + public static X509Certificate server_cert = null; + + // cookie variable for CS install UI + public static String j_session_id = null; + public static boolean ecc_support = false; + + public HTTPClient() { + // constructor + // turn off ecc by default + ecc_support = true; } - // Hopefully, this initial chunk will contain the entire header, so look for - // it. Technically, HTTP is supposed to use CRLF as the end-of-line - // character, so look for that first, but also check for LF by itself just - // in case. - int headerEndPos = -1; - int dataStartPos = -1; - for (int i=0; i < (bytesRead-3); i++) - { - if ((buffer[i] == '\r') && (buffer[i+1] == '\n') && - (buffer[i+2] == '\r') && (buffer[i+3] == '\n')) - { - headerEndPos = i; - dataStartPos = i+4; - break; - } + public HTTPClient(boolean ecc) { + ecc_support = ecc; } - if (headerEndPos < 0) - { - for (int i=0; i < (bytesRead-1); i++) - { - if ((buffer[i] == '\n') && (buffer[i+1] == '\n')) - { - headerEndPos = i; - dataStartPos = i+2; - break; + public boolean setCipherPref(SSLSocket socket) { + + if (ecc_support) { + int ecc_Ciphers[] = { SSLSocket.TLS_ECDH_ECDSA_WITH_NULL_SHA, + SSLSocket.TLS_ECDH_ECDSA_WITH_RC4_128_SHA, + SSLSocket.TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, + SSLSocket.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, + SSLSocket.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, + SSLSocket.TLS_ECDHE_ECDSA_WITH_NULL_SHA, + SSLSocket.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, + SSLSocket.TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, + SSLSocket.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + SSLSocket.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, + SSLSocket.TLS_ECDH_RSA_WITH_NULL_SHA, + SSLSocket.TLS_ECDH_RSA_WITH_RC4_128_SHA, + SSLSocket.TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, + SSLSocket.TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, + SSLSocket.TLS_ECDHE_RSA_WITH_NULL_SHA, + SSLSocket.TLS_ECDHE_RSA_WITH_RC4_128_SHA, + SSLSocket.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, + SSLSocket.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, + SSLSocket.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, 0 }; + + try { + for (int i = 0; i < ecc_Ciphers.length; i++) { + if (ecc_Ciphers[i] > 0) + socket.setCipherPreference(ecc_Ciphers[i], true); + } + } catch (Exception e) { + System.out.println("ERROR: unable to set ECC Cipher List"); + System.out.println("ERROR: Exception = " + e.getMessage()); + } + } - } + return true; + } + + public boolean disableSSL2(SSLSocket socket) { + try { + SSLSocket.enableSSL3Default(true); + socket.enableSSL3(true); + socket.enableSSL2(false); + SSLSocket.enableSSL2Default(false); + socket.enableV2CompatibleHello(false); + } catch (Exception e) { + System.out.println("ERROR: Exception = " + e.getMessage()); + } + return true; + } + + public X509Certificate getServerCert() { + return server_cert; + } + + public void set_parse_xml(boolean b) { + parse_xml = b; + } + + public boolean approve(X509Certificate cert, + SSLCertificateApprovalCallback.ValidityStatus status) { + + // when this method is called by SSLSocket we get the server cert + // we can capture this for future use. + server_cert = cert; + return true; } + public boolean testsslConnect(String hostname, String portnumber) { + boolean st = true; + + try { + + System.out.println("#############################################"); + System.out.println("Attempting to connect to: " + hostname + ":" + + portnumber); + + Integer x = new Integer(portnumber); + int port = x.intValue(); + + SSLClientCertificateSelectionCallback certSelectionCallback = new TestClientCertificateSelectionCallback(); + + Socket js = new Socket(InetAddress.getByName(hostname), port); + SSLSocket socket = new SSLSocket(js, hostname, this, + certSelectionCallback); + setCipherPref(socket); + disableSSL2(socket); + socket.forceHandshake(); + System.out.println("Connected."); + socket.setUseClientMode(true); + + // test connection to obtain server cert. close it. + socket.close(); - // In the event that we didn't get the entire header in the first pass, keep - // reading until we do have enough. - if (headerEndPos < 0) - { - byte[] buffer2 = new byte[BUFFER_SIZE]; - while (headerEndPos < 0) - { - int startPos = bytesRead; - int moreBytesRead = inputStream.read(buffer2); - if (moreBytesRead < 0) - { - throw new IOException("Unexpected end of input stream from server " + - "when reading more data from response"); } - byte[] newBuffer = new byte[bytesRead + moreBytesRead]; - System.arraycopy(buffer, 0, newBuffer, 0, bytesRead); - System.arraycopy(buffer2, 0, newBuffer, bytesRead, moreBytesRead); - buffer = newBuffer; - bytesRead += moreBytesRead; - - for (int i=startPos; i < (bytesRead-3); i++) - { - if ((buffer[i] == '\r') && (buffer[i+1] == '\n') && - (buffer[i+2] == '\r') && (buffer[i+3] == '\n')) - { - headerEndPos = i; - dataStartPos = i+4; - break; - } + catch (Exception e) { + System.err.println("Exception: Unable to Send Request:" + e); + e.printStackTrace(); + st = false; } - if (headerEndPos < 0) - { - for (int i=startPos; i < (bytesRead-1); i++) - { - if ((buffer[i] == '\n') && (buffer[i+1] == '\n')) - { - headerEndPos = i; - dataStartPos = i+2; - break; + if (!st) + return false; + else + return true; + } + + // performs ssl connect to given host/port requiring client auth + // posts the given query data + // returns HTTPResponse + public HTTPResponse sslConnectClientAuth(String hostname, + String portnumber, String client_cert, String url, String query) { + + boolean st = true; + HTTPResponse hr = null; + + try { + + System.out.println("#############################################"); + System.out.println("Attempting to connect to: " + hostname + ":" + + portnumber); + + Integer x = new Integer(portnumber); + int port = x.intValue(); + + SSLCertificateApprovalCallback approvalCallback = new TestCertApprovalCallback(); + CertSelection certSelectionCallback = new CertSelection(); + + // Client Cert for Auth is set here + certSelectionCallback.setClientCert(client_cert); + + Socket js = new Socket(InetAddress.getByName(hostname), port); + SSLSocket socket = new SSLSocket(js, hostname, approvalCallback, + certSelectionCallback); + disableSSL2(socket); + setCipherPref(socket); + socket.forceHandshake(); + System.out.println("Connected."); + socket.setUseClientMode(true); + + System.out.println("Posting Query = " + "https://" + hostname + ":" + + portnumber + "/" + url + "?" + query); + + OutputStream rawos = socket.getOutputStream(); + BufferedOutputStream os = new BufferedOutputStream(rawos); + PrintStream ps = new PrintStream(os); + + ps.println("POST " + url + " HTTP/1.0"); + ps.println("Connection: Keep-Alive"); + ps.println("Content-type: application/x-www-form-urlencoded"); + ps.println("Content-length: " + query.length()); + ps.println(""); + ps.print(query); + ps.flush(); + os.flush(); + + try { + hr = readResponse(socket.getInputStream()); + hr.parseContent(); + + } catch (Exception e) { + System.out.println("Exception"); + e.printStackTrace(); + st = false; } - } + + socket.close(); + os.close(); + rawos.close(); + ps.close(); + + os = null; + rawos = null; + ps = null; + } - } + + catch (Exception e) { + System.err.println("Exception: Unable to Send Request:" + e); + e.printStackTrace(); + st = false; + } + + if (!st) + return null; + else + return hr; } + // performs ssl connect to given host/port + // posts the given query data + // returns HTTPResponse + public HTTPResponse sslConnect(String hostname, String portnumber, + String url, String query) { - // At this point, we should have the entire header, so read and analyze it. - String headerStr = new String(buffer, 0, headerEndPos); - StringTokenizer tokenizer = new StringTokenizer(headerStr, "\r\n"); - if (tokenizer.hasMoreTokens()) - { - String statusLine = tokenizer.nextToken(); - if (debugMode) - { - System.out.println("RESPONSE STATUS: " + statusLine); - } - - int spacePos = statusLine.indexOf(' '); - if (spacePos < 0) - { - System.out.println("ERROR: Unable to parse response header -- could " + - "not find protocol/version delimiter"); - return null; - - } - - String protocolVersion = statusLine.substring(0, spacePos); - int spacePos2 = statusLine.indexOf(' ', spacePos+1); - if (spacePos2 < 0) - { - System.out.println("ERROR: Unable to parse response header -- could " + - "not find response code delimiter"); - return null; - } - - try - { - statusCode = Integer.parseInt(statusLine.substring(spacePos+1, - spacePos2)); - } - catch (NumberFormatException nfe) - { - System.out.println("Unable to parse response header -- could " + - "not interpret status code as an integer"); - return null; - } - - String responseMessage = statusLine.substring(spacePos2+1); - response = new HTTPResponse(statusCode, protocolVersion, - responseMessage); - - while (tokenizer.hasMoreTokens()) - { - String headerLine = tokenizer.nextToken(); - if (debugMode) - { - System.out.println("RESPONSE HEADER: " + headerLine); - } + boolean st = true; + HTTPResponse hr = null; - int colonPos = headerLine.indexOf(':'); - if (colonPos < 0) - { - if (headerLine.toLowerCase().startsWith("http/")) - { - // This is a direct violation of RFC 2616, but certain HTTP servers - // seem to immediately follow a 100 continue with a 200 ok without - // the required CRLF in between. - System.out.println("ERROR: Found illegal status line '" + headerLine + - "'in the middle of a response -- attempting " + - "to deal with it as the start of a new " + - "response."); - statusLine = headerLine; - spacePos = statusLine.indexOf(' '); - if (spacePos < 0) - { - System.out.println("ERROR: Unable to parse response header -- " + - "could not find protocol/version " + - "delimiter"); - return null; + try { + + System.out.println("#############################################"); + System.out.println("Attempting to connect to: " + hostname + ":" + + portnumber); + + Integer x = new Integer(portnumber); + int port = x.intValue(); + + SSLCertificateApprovalCallback approvalCallback = new TestCertApprovalCallback(); + SSLClientCertificateSelectionCallback certSelectionCallback = new TestClientCertificateSelectionCallback(); + + Socket js = new Socket(InetAddress.getByName(hostname), port); + SSLSocket socket = new SSLSocket(js, hostname, approvalCallback, + certSelectionCallback); + setCipherPref(socket); + disableSSL2(socket); + socket.forceHandshake(); + System.out.println("Connected."); + socket.setUseClientMode(true); + + System.out.println("Posting Query = " + "https://" + hostname + ":" + + portnumber + "/" + url + "?" + query); + + OutputStream rawos = socket.getOutputStream(); + BufferedOutputStream os = new BufferedOutputStream(rawos); + PrintStream ps = new PrintStream(os); + + ps.println("POST " + url + " HTTP/1.0"); + + // check to see if we have a cookie to send + if (j_session_id != null) + ps.println("Cookie: " + j_session_id); + + ps.println("Content-type: application/x-www-form-urlencoded"); + ps.println("Content-length: " + query.length()); + ps.println("Connection: Keep-Alive"); + + // special header posting if available + if (basic_auth_header_value != null) { + System.out.println("basic_auth = " + basic_auth_header_value); + ps.println("Authorization: Basic " + basic_auth_header_value); } - protocolVersion = statusLine.substring(0, spacePos); - spacePos2 = statusLine.indexOf(' ', spacePos+1); - if (spacePos2 < 0) - { - System.out.println("ERROR: Unable to parse response header -- " + - "could not find response code delimiter"); - return null; + ps.println(""); + ps.println(query); + ps.println("\r"); + ps.flush(); + os.flush(); + + try { + hr = readResponse(socket.getInputStream()); + hr.parseContent(); + + } catch (Exception e) { + System.out.println("Exception"); + e.printStackTrace(); + st = false; } - try - { - statusCode = Integer.parseInt(statusLine.substring(spacePos+1, - spacePos2)); + socket.close(); + os.close(); + rawos.close(); + ps.close(); + + os = null; + rawos = null; + ps = null; + + } + + catch (Exception e) { + System.err.println("Exception: Unable to Send Request:" + e); + e.printStackTrace(); + st = false; + } + + if (!st) + return null; + else + return hr; + } + + // performs non ssl connect to given host/port + // posts the given query data + // returns HTTPResponse + public HTTPResponse nonsslConnect(String hostname, String portnumber, + String url, String query) { + + boolean st = true; + HTTPResponse hr = null; + + try { + + System.out.println("#############################################"); + System.out.println("Attempting to connect to: " + hostname + ":" + + portnumber); + + Integer x = new Integer(portnumber); + int port = x.intValue(); + + Socket socket = new Socket(hostname, port); + + System.out.println("Posting Query = " + "http://" + hostname + ":" + + portnumber + "/" + url + "?" + query); + + OutputStream rawos = socket.getOutputStream(); + BufferedOutputStream os = new BufferedOutputStream(rawos); + PrintStream ps = new PrintStream(os); + + System.out.println("Connected."); + + ps.println("POST " + url + " HTTP/1.0"); + + // check to see if we have a cookie to send + if (j_session_id != null) + ps.println("Cookie: " + j_session_id); + + ps.println("Content-type: application/x-www-form-urlencoded"); + ps.println("Content-length: " + query.length()); + ps.println("Connection: Keep-Alive"); + + // special header posting if available + if (basic_auth_header_value != null) { + System.out.println("basic_auth = " + basic_auth_header_value); + ps.println("Authorization: Basic " + basic_auth_header_value); } - catch (NumberFormatException nfe) - { - System.out.println("ERROR: Unable to parse response header -- " + - "could not interpret status code as an " + - "integer"); - return null; + + ps.println(""); + ps.println(query); + ps.println("\r"); + ps.flush(); + os.flush(); + + try { + hr = readResponse(socket.getInputStream()); + hr.parseContent(); + + } catch (Exception e) { + System.out.println("Exception"); + e.printStackTrace(); + st = false; } - responseMessage = statusLine.substring(spacePos2+1); - response = new HTTPResponse(statusCode, protocolVersion, - responseMessage); - continue; - } - else - { - System.out.println("ERROR: Unable to parse response header -- no " + - "colon found on header line \"" + - headerLine + "\""); - } + socket.close(); + os.close(); + rawos.close(); + ps.close(); + + os = null; + rawos = null; + ps = null; + } - String headerName = headerLine.substring(0, colonPos); - String headerValue = headerLine.substring(colonPos+1).trim(); - response.addHeader(headerName, headerValue); - } - } - else - { - // This should never happen -- an empty response - System.out.println("Unable to parse response header -- empty " + - "header"); + catch (Exception e) { + System.err.println("Exception: Unable to Send Request:" + e); + e.printStackTrace(); + st = false; + } + + if (!st) + return null; + else + return hr; } + public HTTPResponse readResponse(InputStream inputStream) throws Exception { + // read response from http input stream and return HTTPResponse + byte[] buffer = new byte[BUFFER_SIZE]; + HTTPResponse response = null; + int statusCode = 0; - // If the status code was 100 (continue), then it was an intermediate header - // and we need to keep reading until we get the real response header. - while (response.getStatusCode() == 100) - { - if (dataStartPos < bytesRead) - { - byte[] newBuffer = new byte[bytesRead - dataStartPos]; - System.arraycopy(buffer, dataStartPos, newBuffer, 0, newBuffer.length); - buffer = newBuffer; - bytesRead = buffer.length; - - headerEndPos = -1; - for (int i=0; i < (bytesRead-3); i++) - { - if ((buffer[i] == '\r') && (buffer[i+1] == '\n') && - (buffer[i+2] == '\r') && (buffer[i+3] == '\n')) - { - headerEndPos = i; - dataStartPos = i+4; - break; - } + // Read an initial chunk of the response from the server. + int bytesRead = inputStream.read(buffer); + if (bytesRead < 0) { + throw new IOException("Unexpected end of input stream from server"); } - if (headerEndPos < 0) - { - for (int i=0; i < (bytesRead-1); i++) - { - if ((buffer[i] == '\n') && (buffer[i+1] == '\n')) - { - headerEndPos = i; - dataStartPos = i+2; - break; + // Hopefully, this initial chunk will contain the entire header, so look + // for + // it. Technically, HTTP is supposed to use CRLF as the end-of-line + // character, so look for that first, but also check for LF by itself + // just + // in case. + int headerEndPos = -1; + int dataStartPos = -1; + for (int i = 0; i < (bytesRead - 3); i++) { + if ((buffer[i] == '\r') && (buffer[i + 1] == '\n') + && (buffer[i + 2] == '\r') && (buffer[i + 3] == '\n')) { + headerEndPos = i; + dataStartPos = i + 4; + break; } - } } - } - else - { - buffer = new byte[0]; - bytesRead = 0; - headerEndPos = -1; - } - - - byte[] buffer2 = new byte[BUFFER_SIZE]; - while (headerEndPos < 0) - { - int startPos = bytesRead; - int moreBytesRead = inputStream.read(buffer2); - - if (moreBytesRead < 0) - { - throw new IOException("Unexpected end of input stream from server " + - "when reading more data from response"); + + if (headerEndPos < 0) { + for (int i = 0; i < (bytesRead - 1); i++) { + if ((buffer[i] == '\n') && (buffer[i + 1] == '\n')) { + headerEndPos = i; + dataStartPos = i + 2; + break; + } + } + } + + // In the event that we didn't get the entire header in the first pass, + // keep + // reading until we do have enough. + if (headerEndPos < 0) { + byte[] buffer2 = new byte[BUFFER_SIZE]; + while (headerEndPos < 0) { + int startPos = bytesRead; + int moreBytesRead = inputStream.read(buffer2); + if (moreBytesRead < 0) { + throw new IOException( + "Unexpected end of input stream from server " + + "when reading more data from response"); + } + + byte[] newBuffer = new byte[bytesRead + moreBytesRead]; + System.arraycopy(buffer, 0, newBuffer, 0, bytesRead); + System.arraycopy(buffer2, 0, newBuffer, bytesRead, + moreBytesRead); + buffer = newBuffer; + bytesRead += moreBytesRead; + + for (int i = startPos; i < (bytesRead - 3); i++) { + if ((buffer[i] == '\r') && (buffer[i + 1] == '\n') + && (buffer[i + 2] == '\r') + && (buffer[i + 3] == '\n')) { + headerEndPos = i; + dataStartPos = i + 4; + break; + } + } + + if (headerEndPos < 0) { + for (int i = startPos; i < (bytesRead - 1); i++) { + if ((buffer[i] == '\n') && (buffer[i + 1] == '\n')) { + headerEndPos = i; + dataStartPos = i + 2; + break; + } + } + } + } + } + + // At this point, we should have the entire header, so read and analyze + // it. + String headerStr = new String(buffer, 0, headerEndPos); + StringTokenizer tokenizer = new StringTokenizer(headerStr, "\r\n"); + if (tokenizer.hasMoreTokens()) { + String statusLine = tokenizer.nextToken(); + if (debugMode) { + System.out.println("RESPONSE STATUS: " + statusLine); + } + + int spacePos = statusLine.indexOf(' '); + if (spacePos < 0) { + System.out + .println("ERROR: Unable to parse response header -- could " + + "not find protocol/version delimiter"); + return null; + + } + + String protocolVersion = statusLine.substring(0, spacePos); + int spacePos2 = statusLine.indexOf(' ', spacePos + 1); + if (spacePos2 < 0) { + System.out + .println("ERROR: Unable to parse response header -- could " + + "not find response code delimiter"); + return null; + } + + try { + statusCode = Integer.parseInt(statusLine.substring( + spacePos + 1, spacePos2)); + } catch (NumberFormatException nfe) { + System.out.println("Unable to parse response header -- could " + + "not interpret status code as an integer"); + return null; + } + + String responseMessage = statusLine.substring(spacePos2 + 1); + response = new HTTPResponse(statusCode, protocolVersion, + responseMessage); + + while (tokenizer.hasMoreTokens()) { + String headerLine = tokenizer.nextToken(); + if (debugMode) { + System.out.println("RESPONSE HEADER: " + headerLine); + } + + int colonPos = headerLine.indexOf(':'); + if (colonPos < 0) { + if (headerLine.toLowerCase().startsWith("http/")) { + // This is a direct violation of RFC 2616, but certain + // HTTP servers + // seem to immediately follow a 100 continue with a 200 + // ok without + // the required CRLF in between. + System.out.println("ERROR: Found illegal status line '" + + headerLine + + "'in the middle of a response -- attempting " + + "to deal with it as the start of a new " + + "response."); + statusLine = headerLine; + spacePos = statusLine.indexOf(' '); + if (spacePos < 0) { + System.out + .println("ERROR: Unable to parse response header -- " + + "could not find protocol/version " + + "delimiter"); + return null; + } + + protocolVersion = statusLine.substring(0, spacePos); + spacePos2 = statusLine.indexOf(' ', spacePos + 1); + if (spacePos2 < 0) { + System.out + .println("ERROR: Unable to parse response header -- " + + "could not find response code delimiter"); + return null; + } + + try { + statusCode = Integer.parseInt(statusLine.substring( + spacePos + 1, spacePos2)); + } catch (NumberFormatException nfe) { + System.out + .println("ERROR: Unable to parse response header -- " + + "could not interpret status code as an " + + "integer"); + return null; + } + + responseMessage = statusLine.substring(spacePos2 + 1); + response = new HTTPResponse(statusCode, + protocolVersion, responseMessage); + continue; + } else { + System.out + .println("ERROR: Unable to parse response header -- no " + + "colon found on header line \"" + + headerLine + "\""); + } + } + + String headerName = headerLine.substring(0, colonPos); + String headerValue = headerLine.substring(colonPos + 1).trim(); + response.addHeader(headerName, headerValue); + } + } else { + // This should never happen -- an empty response + System.out.println("Unable to parse response header -- empty " + + "header"); } - byte[] newBuffer = new byte[bytesRead + moreBytesRead]; - System.arraycopy(buffer, 0, newBuffer, 0, bytesRead); - System.arraycopy(buffer2, 0, newBuffer, bytesRead, moreBytesRead); - buffer = newBuffer; - bytesRead += moreBytesRead; - - for (int i=startPos; i < (bytesRead-3); i++) - { - if ((buffer[i] == '\r') && (buffer[i+1] == '\n') && - (buffer[i+2] == '\r') && (buffer[i+3] == '\n')) - { - headerEndPos = i; - dataStartPos = i+4; - break; - } + // If the status code was 100 (continue), then it was an intermediate + // header + // and we need to keep reading until we get the real response header. + while (response.getStatusCode() == 100) { + if (dataStartPos < bytesRead) { + byte[] newBuffer = new byte[bytesRead - dataStartPos]; + System.arraycopy(buffer, dataStartPos, newBuffer, 0, + newBuffer.length); + buffer = newBuffer; + bytesRead = buffer.length; + + headerEndPos = -1; + for (int i = 0; i < (bytesRead - 3); i++) { + if ((buffer[i] == '\r') && (buffer[i + 1] == '\n') + && (buffer[i + 2] == '\r') + && (buffer[i + 3] == '\n')) { + headerEndPos = i; + dataStartPos = i + 4; + break; + } + } + + if (headerEndPos < 0) { + for (int i = 0; i < (bytesRead - 1); i++) { + if ((buffer[i] == '\n') && (buffer[i + 1] == '\n')) { + headerEndPos = i; + dataStartPos = i + 2; + break; + } + } + } + } else { + buffer = new byte[0]; + bytesRead = 0; + headerEndPos = -1; + } + + byte[] buffer2 = new byte[BUFFER_SIZE]; + while (headerEndPos < 0) { + int startPos = bytesRead; + int moreBytesRead = inputStream.read(buffer2); + + if (moreBytesRead < 0) { + throw new IOException( + "Unexpected end of input stream from server " + + "when reading more data from response"); + } + + byte[] newBuffer = new byte[bytesRead + moreBytesRead]; + System.arraycopy(buffer, 0, newBuffer, 0, bytesRead); + System.arraycopy(buffer2, 0, newBuffer, bytesRead, + moreBytesRead); + buffer = newBuffer; + bytesRead += moreBytesRead; + + for (int i = startPos; i < (bytesRead - 3); i++) { + if ((buffer[i] == '\r') && (buffer[i + 1] == '\n') + && (buffer[i + 2] == '\r') + && (buffer[i + 3] == '\n')) { + headerEndPos = i; + dataStartPos = i + 4; + break; + } + } + + if (headerEndPos < 0) { + for (int i = startPos; i < (bytesRead - 1); i++) { + if ((buffer[i] == '\n') && (buffer[i + 1] == '\n')) { + headerEndPos = i; + dataStartPos = i + 2; + break; + } + } + } + } + + // We should now have the next header, so examine it. + headerStr = new String(buffer, 0, headerEndPos); + tokenizer = new StringTokenizer(headerStr, "\r\n"); + if (tokenizer.hasMoreTokens()) { + String statusLine = tokenizer.nextToken(); + if (debugMode) { + System.out.println("RESPONSE STATUS: " + statusLine); + } + + int spacePos = statusLine.indexOf(' '); + if (spacePos < 0) { + System.out + .println("Unable to parse response header -- could " + + "not find protocol/version delimiter"); + } + + String protocolVersion = statusLine.substring(0, spacePos); + int spacePos2 = statusLine.indexOf(' ', spacePos + 1); + if (spacePos2 < 0) { + System.out + .println("Unable to parse response header -- could " + + "not find response code delimiter"); + } + + try { + statusCode = Integer.parseInt(statusLine.substring( + spacePos + 1, spacePos2)); + } catch (NumberFormatException nfe) { + System.out + .println("Unable to parse response header -- could " + + "not interpret status code as an integer"); + } + + String responseMessage = statusLine.substring(spacePos2 + 1); + response = new HTTPResponse(statusCode, protocolVersion, + responseMessage); + + while (tokenizer.hasMoreTokens()) { + String headerLine = tokenizer.nextToken(); + if (debugMode) { + System.out.println("RESPONSE HEADER: " + headerLine); + } + + int colonPos = headerLine.indexOf(':'); + if (colonPos < 0) { + System.out + .println("Unable to parse response header -- no " + + "colon found on header line \"" + + headerLine + "\""); + } + + String headerName = headerLine.substring(0, colonPos); + String headerValue = headerLine.substring(colonPos + 1) + .trim(); + response.addHeader(headerName, headerValue); + } + } else { + // This should never happen -- an empty response + System.out.println("Unable to parse response header -- empty " + + "header"); + } } - if (headerEndPos < 0) - { - for (int i=startPos; i < (bytesRead-1); i++) - { - if ((buffer[i] == '\n') && (buffer[i+1] == '\n')) - { - headerEndPos = i; - dataStartPos = i+2; - break; + // Now that we have parsed the header, use it to determine how much data + // there is. If we're lucky, the server will have told us using the + // "Content-Length" header. + int contentLength = response.getContentLength(); + + if (contentLength >= 0) { + readContentDataUsingLength(response, inputStream, contentLength, + buffer, dataStartPos, bytesRead); + } else { + // It's not chunked encoding, so our last hope is that the + // connection + // will be closed when all the data has been sent. + String connectionStr = response.getHeader("connection"); + if ((connectionStr != null) + && (!connectionStr.equalsIgnoreCase("close"))) { + System.out + .println("ERROR:Unable to determine how to find when the " + + "end of the data has been reached (no " + + "content length, not chunked encoding, " + + "connection string is \"" + + connectionStr + + "\" rather than \"close\")"); + } else { + readContentDataUsingConnectionClose(response, inputStream, + buffer, dataStartPos, bytesRead); } - } } - } - - - // We should now have the next header, so examine it. - headerStr = new String(buffer, 0, headerEndPos); - tokenizer = new StringTokenizer(headerStr, "\r\n"); - if (tokenizer.hasMoreTokens()) - { - String statusLine = tokenizer.nextToken(); - if (debugMode) - { - System.out.println("RESPONSE STATUS: " + statusLine); + // Finally, return the response to the caller. + return response; + } + + /** + * Reads the actual data of the response based on the content length + * provided by the server in the response header. + * + * @param response The response with which the data is associated. + * @param inputStream The input stream from which to read the response. + * @param contentLength The number of bytes that the server said are in the + * response. + * @param dataRead The data that we have already read. This includes the + * header data, but may also include some or all of the content + * data as well. + * @param dataStartPos The position in the provided array at which the + * content data starts. + * @param dataBytesRead The total number of valid bytes in the provided + * array that should be considered part of the response (the + * number of header bytes is included in this count). + * + * @throws IOException If a problem occurs while reading data from the + * server. + */ + private void readContentDataUsingLength(HTTPResponse response, + InputStream inputStream, int contentLength, byte[] dataRead, + int dataStartPos, int dataBytesRead) throws IOException { + if (contentLength <= 0) { + response.setResponseData(new byte[0]); + return; } - int spacePos = statusLine.indexOf(' '); - if (spacePos < 0) - { - System.out.println("Unable to parse response header -- could " + - "not find protocol/version delimiter"); + byte[] contentBytes = new byte[contentLength]; + int startPos = 0; + if (dataBytesRead > dataStartPos) { + // We've already got some data to include in the header, so copy + // that into + // the content array. Make sure the server didn't do something + // stupid + // like return more data than it told us was in the response. + int bytesToCopy = Math.min(contentBytes.length, + (dataBytesRead - dataStartPos)); + System.arraycopy(dataRead, dataStartPos, contentBytes, 0, + bytesToCopy); + startPos = bytesToCopy; } - String protocolVersion = statusLine.substring(0, spacePos); - int spacePos2 = statusLine.indexOf(' ', spacePos+1); - if (spacePos2 < 0) - { - System.out.println("Unable to parse response header -- could " + - "not find response code delimiter"); + byte[] buffer = new byte[BUFFER_SIZE]; + while (startPos < contentBytes.length) { + int bytesRead = inputStream.read(buffer); + if (bytesRead < 0) { + throw new IOException( + "Unexpected end of input stream reached when " + + "reading data from the server"); + } + + System.arraycopy(buffer, 0, contentBytes, startPos, bytesRead); + startPos += bytesRead; } - try - { - statusCode = Integer.parseInt(statusLine.substring(spacePos+1, - spacePos2)); + response.setResponseData(contentBytes); + } + + /** + * Reads the actual data of the response using chunked encoding, which is a + * way for the server to provide the data in several chunks rather than all + * at once. + * + * @param response The response with which the data is associated. + * @param inputStream The input stream from which to read the response. + * @param dataRead The data that we have already read. This includes the + * header data, but may also include some or all of the content + * data as well. + * @param dataStartPos The position in the provided array at which the + * content data starts. + * @param dataBytesRead The total number of valid bytes in the provided + * array that should be considered part of the response (the + * number of header bytes is included in this count). + * + * @throws IOException If a problem occurs while reading data from the + * server. + */ + private void readContentDataUsingConnectionClose(HTTPResponse response, + InputStream inputStream, byte[] dataRead, int dataStartPos, + int dataBytesRead) throws IOException { + // Create an array list that we will use to hold the chunks of + // information + // read from the server. + ArrayList<ByteBuffer> bufferList = new ArrayList<ByteBuffer>(); + + // Create a variable to hold the total number of bytes in the data. + int totalBytes = 0; + + // See if we have unread data in the array already provided. + int existingBytes = dataBytesRead - dataStartPos; + if (existingBytes > 0) { + ByteBuffer byteBuffer = ByteBuffer.allocate(existingBytes); + byteBuffer.put(dataRead, dataStartPos, existingBytes); + bufferList.add(byteBuffer); + totalBytes += existingBytes; } - catch (NumberFormatException nfe) - { - System.out.println("Unable to parse response header -- could " + - "not interpret status code as an integer"); + + // Keep reading until we hit the end of the input stream. + byte[] buffer = new byte[BUFFER_SIZE]; + while (true) { + try { + int bytesRead = inputStream.read(buffer); + if (bytesRead < 0) { + // We've hit the end of the stream and therefore the end of + // the + // document. + break; + } else if (bytesRead > 0) { + ByteBuffer byteBuffer = ByteBuffer.allocate(bytesRead); + byteBuffer.put(buffer, 0, bytesRead); + bufferList.add(byteBuffer); + totalBytes += bytesRead; + } + } catch (IOException ioe) { + // In this case we'll assume that the end of the stream has been + // reached. It's possible that there was some other error, but + // we can't + // do anything about it so try to process what we've got so far. + System.out.println("ERROR: unable to read until end of stream"); + System.out.println("ERROR: " + ioe.getMessage()); + break; + } } - String responseMessage = statusLine.substring(spacePos2+1); - response = new HTTPResponse(statusCode, protocolVersion, - responseMessage); - - while (tokenizer.hasMoreTokens()) - { - String headerLine = tokenizer.nextToken(); - if (debugMode) - { - System.out.println("RESPONSE HEADER: " + headerLine); - } - - int colonPos = headerLine.indexOf(':'); - if (colonPos < 0) - { - System.out.println("Unable to parse response header -- no " + - "colon found on header line \"" + - headerLine + "\""); - } - - String headerName = headerLine.substring(0, colonPos); - String headerValue = headerLine.substring(colonPos+1).trim(); - response.addHeader(headerName, headerValue); + // Assemble the contents of all the buffers into a big array and store + // that + // array in the response. + int startPos = 0; + byte[] contentData = new byte[totalBytes]; + for (int i = 0; i < bufferList.size(); i++) { + ByteBuffer byteBuffer = (ByteBuffer) bufferList.get(i); + byteBuffer.flip(); + byteBuffer.get(contentData, startPos, byteBuffer.limit()); + startPos += byteBuffer.limit(); } - } - else - { - // This should never happen -- an empty response - System.out.println("Unable to parse response header -- empty " + - "header"); - } + response.setResponseData(contentData); } + // performs ssl connect to given host/port + // posts the given query data - format - a byte array + // returns HTTPResponse + + public HTTPResponse sslConnect(String hostname, String portnumber, + String url, byte[] data) { + + boolean st = true; + HTTPResponse hr = null; + + try { + + System.out.println("#############################################"); + System.out.println("Attempting to connect to: " + hostname + ":" + + portnumber); + + Integer x = new Integer(portnumber); + int port = x.intValue(); + + SSLCertificateApprovalCallback approvalCallback = new TestCertApprovalCallback(); + SSLClientCertificateSelectionCallback certSelectionCallback = new TestClientCertificateSelectionCallback(); + + Socket js = new Socket(InetAddress.getByName(hostname), port); + SSLSocket socket = new SSLSocket(js, hostname, approvalCallback, + certSelectionCallback); + setCipherPref(socket); + disableSSL2(socket); + socket.forceHandshake(); + System.out.println("Connected."); + socket.setUseClientMode(true); + + DataOutputStream dos = new DataOutputStream( + socket.getOutputStream()); + dos.writeBytes("POST /ocsp HTTP/1.0\r\n"); + dos.writeBytes("Content-length: " + data.length + "\r\n"); + dos.writeBytes("\r\n"); + dos.write(data); + dos.writeBytes("\r\n"); + dos.flush(); + + try { + hr = readResponse(socket.getInputStream()); + hr.parseContent(); + } catch (Exception e) { + System.out.println("Exception"); + e.printStackTrace(); + st = false; + } - // Now that we have parsed the header, use it to determine how much data - // there is. If we're lucky, the server will have told us using the - // "Content-Length" header. - int contentLength = response.getContentLength(); + socket.close(); + dos.close(); + } - if (contentLength >= 0) - { - readContentDataUsingLength(response, inputStream, contentLength, buffer, - dataStartPos, bytesRead); - } - else - { - // It's not chunked encoding, so our last hope is that the connection - // will be closed when all the data has been sent. - String connectionStr = response.getHeader("connection"); - if ((connectionStr != null) && - (! connectionStr.equalsIgnoreCase("close"))) - { - System.out.println("ERROR:Unable to determine how to find when the " + - "end of the data has been reached (no " + - "content length, not chunked encoding, " + - "connection string is \"" + connectionStr + - "\" rather than \"close\")"); + catch (Exception e) { + System.err.println("Exception: Unable to Send Request:" + e); + e.printStackTrace(); + st = false; } + + if (!st) + return null; else - { - readContentDataUsingConnectionClose(response, inputStream, buffer, - dataStartPos, bytesRead); - } - } - // Finally, return the response to the caller. - return response; - } - - /** - * Reads the actual data of the response based on the content length provided - * by the server in the response header. - * - * @param response The response with which the data is associated. - * @param inputStream The input stream from which to read the response. - * @param contentLength The number of bytes that the server said are in the - * response. - * @param dataRead The data that we have already read. This includes - * the header data, but may also include some or all of - * the content data as well. - * @param dataStartPos The position in the provided array at which the - * content data starts. - * @param dataBytesRead The total number of valid bytes in the provided - * array that should be considered part of the - * response (the number of header bytes is included in - * this count). - * - * @throws IOException If a problem occurs while reading data from the - * server. - */ - private void readContentDataUsingLength(HTTPResponse response, - InputStream inputStream, - int contentLength, byte[] dataRead, - int dataStartPos, int dataBytesRead) - throws IOException - { - if (contentLength <= 0) - { - response.setResponseData(new byte[0]); - return; + return hr; } + // performs non ssl connect to given host/port + // posts the given query data + // returns HTTPResponse + public HTTPResponse nonsslConnect(String hostname, String portnumber, + String url, byte[] data) { - byte[] contentBytes = new byte[contentLength]; - int startPos = 0; - if (dataBytesRead > dataStartPos) - { - // We've already got some data to include in the header, so copy that into - // the content array. Make sure the server didn't do something stupid - // like return more data than it told us was in the response. - int bytesToCopy = Math.min(contentBytes.length, - (dataBytesRead - dataStartPos)); - System.arraycopy(dataRead, dataStartPos, contentBytes, 0, bytesToCopy); - startPos = bytesToCopy; - } + boolean st = true; + HTTPResponse hr = null; + + try { + + System.out.println("#############################################"); + System.out.println("Attempting to connect to: " + hostname + ":" + + portnumber); + + Integer x = new Integer(portnumber); + int port = x.intValue(); + + Socket socket = new Socket(hostname, port); - byte[] buffer = new byte[BUFFER_SIZE]; - while (startPos < contentBytes.length) - { - int bytesRead = inputStream.read(buffer); - if (bytesRead < 0) - { - throw new IOException("Unexpected end of input stream reached when " + - "reading data from the server"); - } - - System.arraycopy(buffer, 0, contentBytes, startPos, bytesRead); - startPos += bytesRead; + System.out.println("Posting Query = " + "http://" + hostname + ":" + + portnumber + "/" + url); + + System.out.println("Connected."); + + DataOutputStream dos = new DataOutputStream( + socket.getOutputStream()); + dos.writeBytes("POST " + url + " HTTP/1.0\r\n"); + dos.writeBytes("Content-length: " + data.length + "\r\n"); + dos.writeBytes("\r\n"); + dos.write(data); + dos.writeBytes("\r\n"); + dos.flush(); + + try { + hr = readResponse(socket.getInputStream()); + hr.parseContent(); + } catch (Exception e) { + System.out.println("Exception"); + e.printStackTrace(); + st = false; + } + + socket.close(); + dos.close(); + + } + + catch (Exception e) { + System.err.println("Exception: Unable to Send Request:" + e); + e.printStackTrace(); + st = false; + } + + if (!st) + return null; + else + return hr; } + public static boolean init_nss() { + try { + + ComCrypto cCrypt = new ComCrypto(client_certdb_dir, + client_certdb_pwd, null, null, null); + cCrypt.setDebug(true); + cCrypt.setGenerateRequest(false); + cCrypt.loginDB(); + } catch (Exception e) { + System.out.println("ERROR: unable to login to : " + + client_certdb_dir); + return false; + } - response.setResponseData(contentBytes); - } - - /** - * Reads the actual data of the response using chunked encoding, which is a - * way for the server to provide the data in several chunks rather than all at - * once. - * - * @param response The response with which the data is associated. - * @param inputStream The input stream from which to read the response. - * @param dataRead The data that we have already read. This includes - * the header data, but may also include some or all of - * the content data as well. - * @param dataStartPos The position in the provided array at which the - * content data starts. - * @param dataBytesRead The total number of valid bytes in the provided - * array that should be considered part of the - * response (the number of header bytes is included in - * this count). - * - * @throws IOException If a problem occurs while reading data from the - * server. - */ - private void readContentDataUsingConnectionClose(HTTPResponse response, - InputStream inputStream, - byte[] dataRead, - int dataStartPos, - int dataBytesRead) - throws IOException - { - // Create an array list that we will use to hold the chunks of information - // read from the server. - ArrayList<ByteBuffer> bufferList = new ArrayList<ByteBuffer>(); - - - // Create a variable to hold the total number of bytes in the data. - int totalBytes = 0; - - - // See if we have unread data in the array already provided. - int existingBytes = dataBytesRead - dataStartPos; - if (existingBytes > 0) - { - ByteBuffer byteBuffer = ByteBuffer.allocate(existingBytes); - byteBuffer.put(dataRead, dataStartPos, existingBytes); - bufferList.add(byteBuffer); - totalBytes += existingBytes; + return true; } + public static void main(String args[]) { + HTTPClient hc = new HTTPClient(); + HTTPResponse hr = null; + byte[] responseData = null; + + // parse args + StringHolder x_hostname = new StringHolder(); + StringHolder x_port = new StringHolder(); + StringHolder x_ssl = new StringHolder(); + StringHolder x_client_certdb_dir = new StringHolder(); + StringHolder x_client_certdb_pwd = new StringHolder(); + StringHolder x_client_cert_nickname = new StringHolder(); + StringHolder x_uri = new StringHolder(); + StringHolder x_query = new StringHolder(); + StringHolder x_request_type = new StringHolder(); + StringHolder x_auth_type = new StringHolder(); + StringHolder x_user_id = new StringHolder(); + StringHolder x_user_password = new StringHolder(); + StringHolder x_debug = new StringHolder(); + StringHolder x_decode = new StringHolder(); + + // parse the args + ArgParser parser = new ArgParser("HTTPClient"); + + parser.addOption("-hostname %s #Hostname", x_hostname); + parser.addOption("-port %s #port number", x_port); + parser.addOption("-ssl %s #HTTP or HTTPS[true or false]", x_ssl); + parser.addOption("-client_certdb_dir %s #CertDB dir", + x_client_certdb_dir); + parser.addOption("-client_certdb_pwd %s #CertDB password", + x_client_certdb_pwd); + parser.addOption("-client_cert_nickname %s #client cert nickname", + x_client_cert_nickname); + parser.addOption("-uri %s #URI", x_uri); + parser.addOption( + "-query %s #URL encoded query string[note: url encode value part only for CS operations]", + x_query); + parser.addOption("-request_type %s #Request Type [ post ]", + x_request_type); + parser.addOption("-user_id %s #user id for authorization", x_user_id); + parser.addOption("-user_password %s #password for authorization", + x_user_password); + parser.addOption("-auth_type %s #type of authorization [ BASIC ]", + x_auth_type); + parser.addOption("-debug %s #enables display of debugging info", + x_debug); + parser.addOption("-decode %s #URL Decode the resulting output", + x_decode); + + // and then match the arguments + String[] unmatched = null; + unmatched = parser.matchAllArgs(args, 0, ArgParser.EXIT_ON_UNMATCHED); + + if (unmatched != null) { + System.out.println("ERROR: Argument Mismatch"); + System.exit(-1); + } - // Keep reading until we hit the end of the input stream. - byte[] buffer = new byte[BUFFER_SIZE]; - while (true) - { - try - { - int bytesRead = inputStream.read(buffer); - if (bytesRead < 0) - { - // We've hit the end of the stream and therefore the end of the - // document. - break; + // set variables + cs_hostname = x_hostname.value; + cs_port = x_port.value; + ssl = x_ssl.value; + client_certdb_dir = x_client_certdb_dir.value; + client_certdb_pwd = x_client_certdb_pwd.value; + client_cert_nickname = x_client_cert_nickname.value; + uri = x_uri.value; + query = x_query.value; + request_type = x_request_type.value; + user_id = x_user_id.value; + user_password = x_user_password.value; + auth_type = x_auth_type.value; + debug = x_debug.value; + + String decode = x_decode.value; + + // init_nss if needed + boolean st = init_nss(); + if (!st) + System.exit(-1); + + // set basic auth if needed + if (auth_type != null && auth_type.equalsIgnoreCase("BASIC")) { + // BASE64Encoder encoder = new BASE64Encoder(); + + // String temp = encoder.encodeBuffer((user_id + + // ":" + user_password).getBytes()); + String temp = OSUtil.BtoA((user_id + ":" + user_password) + .getBytes()); + + // note: temp already contains \r and \n. + // remove \r and \n from the base64 encoded string. + // causes problems when sending http post requests + // using PrintStream.println() + + temp = temp.replaceAll("\\r", ""); + temp = temp.replaceAll("\\n", ""); + + basic_auth_header_value = temp; + } + + // route to proper function + + if (ssl != null && ssl.equalsIgnoreCase("true")) { + if (client_cert_nickname != null + && !client_cert_nickname.equalsIgnoreCase("null")) { + // ssl client auth call + + hr = hc.sslConnectClientAuth(cs_hostname, cs_port, + client_cert_nickname, uri, query); + } + + else { + // ssl client call + hr = hc.sslConnect(cs_hostname, cs_port, uri, query); + } + } else if (ssl != null && ssl.equalsIgnoreCase("false")) { + // non ssl connect + hr = hc.nonsslConnect(cs_hostname, cs_port, uri, query); + } else { + System.out.println("ERROR: ssl parameter is null"); + System.exit(-1); } - else if (bytesRead > 0) - { - ByteBuffer byteBuffer = ByteBuffer.allocate(bytesRead); - byteBuffer.put(buffer, 0, bytesRead); - bufferList.add(byteBuffer); - totalBytes += bytesRead; + + // collect and print response + + responseData = hr.getResponseData(); + + if (hr.getStatusCode() == 200) + System.out.println("Response from Host:" + cs_hostname + " OK"); + else { + System.out.println("ERROR: unable to get response from host:" + + cs_hostname); + System.exit(-1); } - } - catch (IOException ioe) - { - // In this case we'll assume that the end of the stream has been - // reached. It's possible that there was some other error, but we can't - // do anything about it so try to process what we've got so far. - System.out.println("ERROR: unable to read until end of stream"); - System.out.println("ERROR: "+ ioe.getMessage()); - break; - } - } + String responseValue = null; + if (decode.equalsIgnoreCase("true")) + responseValue = URLDecoder.decode(hr.getHTML()); + else + responseValue = hr.getHTML(); + + System.out.println("###############################"); + System.out.println("RESULT=" + responseValue); + System.out.println("###############################"); - // Assemble the contents of all the buffers into a big array and store that - // array in the response. - int startPos = 0; - byte[] contentData = new byte[totalBytes]; - for (int i=0; i < bufferList.size(); i++) - { - ByteBuffer byteBuffer = (ByteBuffer) bufferList.get(i); - byteBuffer.flip(); - byteBuffer.get(contentData, startPos, byteBuffer.limit()); - startPos += byteBuffer.limit(); } - response.setResponseData(contentData); - } - - // performs ssl connect to given host/port - // posts the given query data - format - a byte array - // returns HTTPResponse - - public HTTPResponse sslConnect(String hostname, String portnumber, - String url, byte[] data) - { - - boolean st = true; - HTTPResponse hr = null; - - try - { - - System.out.println("#############################################"); - System.out.println("Attempting to connect to: " + hostname + ":" + - portnumber); - - Integer x = new Integer(portnumber); - int port = x.intValue(); - - - SSLCertificateApprovalCallback approvalCallback = - new TestCertApprovalCallback(); - SSLClientCertificateSelectionCallback certSelectionCallback = - new TestClientCertificateSelectionCallback(); - - Socket js = new Socket(InetAddress.getByName(hostname), port); - SSLSocket socket = new SSLSocket(js, hostname, approvalCallback, - certSelectionCallback ); - setCipherPref(socket); - disableSSL2(socket); - socket.forceHandshake(); - System.out.println("Connected."); - socket.setUseClientMode(true); - - DataOutputStream dos = - new DataOutputStream(socket.getOutputStream()); - dos.writeBytes("POST /ocsp HTTP/1.0\r\n"); - dos.writeBytes("Content-length: " + data.length + "\r\n"); - dos.writeBytes("\r\n"); - dos.write(data); - dos.writeBytes("\r\n"); - dos.flush(); - - try - { - hr = readResponse(socket.getInputStream()); - hr.parseContent(); - } - catch (Exception e) - { - System.out.println("Exception"); - e.printStackTrace(); - st = false; - } - - socket.close(); - dos.close(); - - } - - catch(Exception e) - { - System.err.println("Exception: Unable to Send Request:" +e); - e.printStackTrace(); - st = false; - } - - if(!st) - return null; - else - return hr; - } - - // performs non ssl connect to given host/port - // posts the given query data - // returns HTTPResponse - public HTTPResponse nonsslConnect(String hostname, String portnumber, - String url, byte[] data) - { - - boolean st = true; - HTTPResponse hr = null; - - try - { - - System.out.println("#############################################"); - System.out.println("Attempting to connect to: " + hostname + ":" + - portnumber); - - Integer x = new Integer(portnumber); - int port = x.intValue(); - - Socket socket = new Socket(hostname, port); - - System.out.println("Posting Query = " + - "http://" + hostname + - ":" + portnumber + - "/" + url ); - - System.out.println("Connected."); - - DataOutputStream dos = - new DataOutputStream(socket.getOutputStream()); - dos.writeBytes("POST " + url + " HTTP/1.0\r\n"); - dos.writeBytes("Content-length: " + data.length + "\r\n"); - dos.writeBytes("\r\n"); - dos.write(data); - dos.writeBytes("\r\n"); - dos.flush(); - - try - { - hr = readResponse(socket.getInputStream()); - hr.parseContent(); - } - catch (Exception e) - { - System.out.println("Exception"); - e.printStackTrace(); - st = false; - } - - socket.close(); - dos.close(); - - } - - catch(Exception e) - { - System.err.println("Exception: Unable to Send Request:" +e); - e.printStackTrace(); - st = false; - } - - if(!st) - return null; - else - return hr; - } - - public static boolean init_nss() - { - try - { - - ComCrypto cCrypt = new ComCrypto(client_certdb_dir, - client_certdb_pwd, - null, - null, - null); - cCrypt.setDebug(true); - cCrypt.setGenerateRequest(false); - cCrypt.loginDB(); - } - catch(Exception e) - { - System.out.println("ERROR: unable to login to : " + - client_certdb_dir ); - return false; - } - - return true; - } - - public static void main(String args[]) - { - HTTPClient hc = new HTTPClient(); - HTTPResponse hr = null; - byte[] responseData = null; - - // parse args - StringHolder x_hostname = new StringHolder(); - StringHolder x_port = new StringHolder(); - StringHolder x_ssl = new StringHolder(); - StringHolder x_client_certdb_dir = new StringHolder(); - StringHolder x_client_certdb_pwd = new StringHolder(); - StringHolder x_client_cert_nickname = new StringHolder(); - StringHolder x_uri = new StringHolder(); - StringHolder x_query = new StringHolder(); - StringHolder x_request_type = new StringHolder(); - StringHolder x_auth_type = new StringHolder(); - StringHolder x_user_id = new StringHolder(); - StringHolder x_user_password = new StringHolder(); - StringHolder x_debug = new StringHolder(); - StringHolder x_decode = new StringHolder(); - - // parse the args - ArgParser parser = new ArgParser("HTTPClient"); - - parser.addOption ("-hostname %s #Hostname", - x_hostname); - parser.addOption ("-port %s #port number", - x_port); - parser.addOption ("-ssl %s #HTTP or HTTPS[true or false]", - x_ssl); - parser.addOption ("-client_certdb_dir %s #CertDB dir", - x_client_certdb_dir); - parser.addOption ("-client_certdb_pwd %s #CertDB password", - x_client_certdb_pwd); - parser.addOption ("-client_cert_nickname %s #client cert nickname", - x_client_cert_nickname); - parser.addOption ("-uri %s #URI", - x_uri); - parser.addOption ("-query %s #URL encoded query string[note: url encode value part only for CS operations]", - x_query); - parser.addOption ("-request_type %s #Request Type [ post ]", - x_request_type); - parser.addOption ("-user_id %s #user id for authorization", - x_user_id); - parser.addOption ("-user_password %s #password for authorization", - x_user_password); - parser.addOption ("-auth_type %s #type of authorization [ BASIC ]", - x_auth_type); - parser.addOption ("-debug %s #enables display of debugging info", - x_debug); - parser.addOption ("-decode %s #URL Decode the resulting output" , - x_decode); - - // and then match the arguments - String [] unmatched = null; - unmatched = parser.matchAllArgs (args,0,ArgParser.EXIT_ON_UNMATCHED); - - if(unmatched!=null) - { - System.out.println("ERROR: Argument Mismatch"); - System.exit(-1); - } - - // set variables - cs_hostname = x_hostname.value; - cs_port = x_port.value; - ssl = x_ssl.value; - client_certdb_dir = x_client_certdb_dir.value; - client_certdb_pwd = x_client_certdb_pwd.value; - client_cert_nickname = x_client_cert_nickname.value; - uri = x_uri.value; - query = x_query.value; - request_type = x_request_type.value; - user_id = x_user_id.value; - user_password = x_user_password.value; - auth_type = x_auth_type.value; - debug = x_debug.value; - - String decode = x_decode.value; - - // init_nss if needed - boolean st = init_nss(); - if(!st) - System.exit(-1); - - // set basic auth if needed - if(auth_type != null && auth_type.equalsIgnoreCase("BASIC")) - { - // BASE64Encoder encoder = new BASE64Encoder(); - - // String temp = encoder.encodeBuffer((user_id + - // ":" + user_password).getBytes()); - String temp = OSUtil.BtoA((user_id + - ":" + user_password).getBytes()); - - // note: temp already contains \r and \n. - // remove \r and \n from the base64 encoded string. - // causes problems when sending http post requests - // using PrintStream.println() - - temp = temp.replaceAll("\\r" , ""); - temp = temp.replaceAll("\\n" , ""); - - basic_auth_header_value = temp; - } - - // route to proper function - - if(ssl != null && ssl.equalsIgnoreCase("true")) - { - if(client_cert_nickname != null && - !client_cert_nickname.equalsIgnoreCase("null")) - { - // ssl client auth call - - hr = hc.sslConnectClientAuth(cs_hostname,cs_port, - client_cert_nickname, - uri,query); - } - - else - { - // ssl client call - hr = hc.sslConnect(cs_hostname,cs_port,uri,query); - } - } - else if(ssl!=null && ssl.equalsIgnoreCase("false")) - { - // non ssl connect - hr = hc.nonsslConnect(cs_hostname,cs_port,uri,query); - } - else - { - System.out.println("ERROR: ssl parameter is null"); - System.exit(-1); - } - - - // collect and print response - - responseData = hr.getResponseData(); - - if(hr.getStatusCode() == 200) - System.out.println("Response from Host:" + cs_hostname + " OK"); - else - { - System.out.println("ERROR: unable to get response from host:" + - cs_hostname); - System.exit(-1); - } - - String responseValue = null; - if(decode.equalsIgnoreCase("true")) - responseValue = URLDecoder.decode(hr.getHTML()); - else - responseValue = hr.getHTML(); - - - System.out.println("###############################"); - System.out.println("RESULT=" + responseValue); - System.out.println("###############################"); - - } }; diff --git a/pki/base/silent/src/com/netscape/pkisilent/http/HTTPResponse.java b/pki/base/silent/src/com/netscape/pkisilent/http/HTTPResponse.java index 08358f35..67a3cf74 100644 --- a/pki/base/silent/src/com/netscape/pkisilent/http/HTTPResponse.java +++ b/pki/base/silent/src/com/netscape/pkisilent/http/HTTPResponse.java @@ -1,4 +1,5 @@ package com.netscape.pkisilent.http; + // --- BEGIN COPYRIGHT BLOCK --- // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -17,369 +18,299 @@ package com.netscape.pkisilent.http; // All rights reserved. // --- END COPYRIGHT BLOCK --- - import java.util.ArrayList; import java.util.StringTokenizer; import com.netscape.pkisilent.common.Utilities; +public class HTTPResponse { + // The set of cookie values included in this response. + ArrayList<String> cookieValueList; + + // The names of the headers included in this response. + ArrayList<String> headerNameList; + + // The values of the headers included in this response. + ArrayList<String> headerValueList; + + // The actual data associated with this response. + byte[] responseData; + + // The HTML document included in the response, if appropriate. + HTMLDocument htmlDocument; + + // The number of bytes contained in the content of the response. + int contentLength; + + // The HTTP status code for the response. + int statusCode; + + // The MIME type of the response. + String contentType; + + // The protocol version string for this response. + String protolVersion; + + // The response message for this response. + String responseMessage; + + // Parsed Content Name/Value pair info + ArrayList<String> contentName; + ArrayList<String> contentValue; + + /** + * Creates a new HTTP response with the provided status code. + * + * @param statusCode The HTTP status code for this response. + * @param protocolVersion The protocol and version for this response. + * @param responseMessage The message associated with this response. + */ + public HTTPResponse(int statusCode, String protocolVersion, + String responseMessage) { + this.statusCode = statusCode; + this.protolVersion = protocolVersion; + this.responseMessage = responseMessage; + + htmlDocument = null; + contentType = null; + contentLength = -1; + responseData = new byte[0]; + cookieValueList = new ArrayList<String>(); + headerNameList = new ArrayList<String>(); + headerValueList = new ArrayList<String>(); + contentName = new ArrayList<String>(); + contentValue = new ArrayList<String>(); + } + + /** + * Retrieves the status code for this HTTP response. + * + * @return The status code for this HTTP response. + */ + public int getStatusCode() { + return statusCode; + } + + /** + * Retrieves the protocol version for this HTTP response. + * + * @return The protocol version for this HTTP response. + */ + public String getProtocolVersion() { + return protolVersion; + } + + /** + * Retrieves the response message for this HTTP response. + * + * @return The response message for this HTTP response. + */ + public String getResponseMessage() { + return responseMessage; + } -public class HTTPResponse -{ - // The set of cookie values included in this response. - ArrayList<String> cookieValueList; + /** + * Retrieves the value of the header with the specified name. If the + * specified header has more than one value, then only the first will be + * retrieved. + * + * @return The value of the header with the specified name, or + * <CODE>null</CODE> if no such header is available. + */ + public String getHeader(String headerName) { + String lowerName = headerName.toLowerCase(); + + for (int i = 0; i < headerNameList.size(); i++) { + if (lowerName.equals(headerNameList.get(i))) { + return headerValueList.get(i); + } + } + + return null; + } - // The names of the headers included in this response. - ArrayList<String> headerNameList; + /** + * Retrieves the set of values for the specified header. + * + * @return The set of values for the specified header. + */ + public String[] getHeaderValues(String headerName) { + ArrayList<String> valueList = new ArrayList<String>(); + String lowerName = headerName.toLowerCase(); + + for (int i = 0; i < headerNameList.size(); i++) { + if (lowerName.equals(headerNameList.get(i))) { + valueList.add(headerValueList.get(i)); + } + } + + String[] values = new String[valueList.size()]; + valueList.toArray(values); + return values; + } - // The values of the headers included in this response. - ArrayList<String> headerValueList; + /** + * Adds a header with the given name and value to this response. + * + * @param headerName The name of the header to add to this response. + * @param headerValue The value of the header to add to this response. + */ + public void addHeader(String headerName, String headerValue) { + String lowerName = headerName.toLowerCase(); + headerNameList.add(lowerName); + headerValueList.add(headerValue); + + if (lowerName.equals("content-length")) { + try { + contentLength = Integer.parseInt(headerValue); + } catch (NumberFormatException nfe) { + } + } else if (lowerName.equals("content-type")) { + contentType = headerValue; + } else if (lowerName.equals("set-cookie")) { + cookieValueList.add(headerValue); + } + } + + /** + * Retrieves a two-dimensional array containing the header data for this + * response, with each element being an array containing a name/value pair. + * + * @return A two-dimensional array containing the header data for this + * response. + */ + public String[][] getHeaderElements() { + String[][] headerElements = new String[headerNameList.size()][2]; + for (int i = 0; i < headerNameList.size(); i++) { + headerElements[i][0] = headerNameList.get(i); + headerElements[i][1] = headerValueList.get(i); + } + + return headerElements; + } - // The actual data associated with this response. - byte[] responseData; + /** + * Retrieves the raw data included in this HTTP response. If the response + * did not include any data, an empty array will be returned. + * + * @return The raw data included in this HTTP response. + */ + public byte[] getResponseData() { + return responseData; + } - // The HTML document included in the response, if appropriate. - HTMLDocument htmlDocument; + public String getHTML() { + String htmlString = new String(responseData); + return htmlString; + } - // The number of bytes contained in the content of the response. - int contentLength; - - // The HTTP status code for the response. - int statusCode; - - // The MIME type of the response. - String contentType; - - // The protocol version string for this response. - String protolVersion; - - // The response message for this response. - String responseMessage; - - // Parsed Content Name/Value pair info - ArrayList<String> contentName; - ArrayList<String> contentValue; - - - - /** - * Creates a new HTTP response with the provided status code. - * - * @param statusCode The HTTP status code for this response. - * @param protocolVersion The protocol and version for this response. - * @param responseMessage The message associated with this response. - */ - public HTTPResponse(int statusCode, String protocolVersion, - String responseMessage) - { - this.statusCode = statusCode; - this.protolVersion = protocolVersion; - this.responseMessage = responseMessage; - - htmlDocument = null; - contentType = null; - contentLength = -1; - responseData = new byte[0]; - cookieValueList = new ArrayList<String>(); - headerNameList = new ArrayList<String>(); - headerValueList = new ArrayList<String>(); - contentName = new ArrayList<String>(); - contentValue = new ArrayList<String>(); - } - - - - /** - * Retrieves the status code for this HTTP response. - * - * @return The status code for this HTTP response. - */ - public int getStatusCode() - { - return statusCode; - } - - - - /** - * Retrieves the protocol version for this HTTP response. - * - * @return The protocol version for this HTTP response. - */ - public String getProtocolVersion() - { - return protolVersion; - } - - - - /** - * Retrieves the response message for this HTTP response. - * - * @return The response message for this HTTP response. - */ - public String getResponseMessage() - { - return responseMessage; - } - - - - /** - * Retrieves the value of the header with the specified name. If the - * specified header has more than one value, then only the first will be - * retrieved. - * - * @return The value of the header with the specified name, or - * <CODE>null</CODE> if no such header is available. - */ - public String getHeader(String headerName) - { - String lowerName = headerName.toLowerCase(); - - for (int i=0; i < headerNameList.size(); i++) - { - if (lowerName.equals(headerNameList.get(i))) - { - return headerValueList.get(i); - } + public String getHTMLwithoutTags() { + String htmlString = new String(responseData); + HTMLDocument htmldocument = new HTMLDocument(htmlString); + return htmldocument.getTextData(); } - return null; - } + public void parseContent() { + // parse the responseData byte[] buffer and split content into name + // value pair + String htmlString = new String(responseData); + StringTokenizer st = new StringTokenizer(htmlString, "\n"); + Utilities ut = new Utilities(); + while (st.hasMoreTokens()) { + String line = st.nextToken(); + // format for line assumed to be name="value"; format + int eqPos = line.indexOf('='); + if (eqPos != -1) { + String name = line.substring(0, eqPos); + String tempval = line.substring(eqPos + 1).trim(); + String value = ut.cleanupQuotes(ut.removechar(tempval)); - /** - * Retrieves the set of values for the specified header. - * - * @return The set of values for the specified header. - */ - public String[] getHeaderValues(String headerName) - { - ArrayList<String> valueList = new ArrayList<String>(); - String lowerName = headerName.toLowerCase(); + // add to array + this.contentName.add(name.trim()); + this.contentValue.add(value); + } + + } - for (int i=0; i < headerNameList.size(); i++) - { - if (lowerName.equals(headerNameList.get(i))) - { - valueList.add(headerValueList.get(i)); - } } - String[] values = new String[valueList.size()]; - valueList.toArray(values); - return values; - } - - - - /** - * Adds a header with the given name and value to this response. - * - * @param headerName The name of the header to add to this response. - * @param headerValue The value of the header to add to this response. - */ - public void addHeader(String headerName, String headerValue) - { - String lowerName = headerName.toLowerCase(); - headerNameList.add(lowerName); - headerValueList.add(headerValue); - - if (lowerName.equals("content-length")) - { - try - { - contentLength = Integer.parseInt(headerValue); - } catch (NumberFormatException nfe) {} + public String getContentValue(String headerName) { + for (int i = 0; i < contentName.size(); i++) { + if (headerName.equals(contentName.get(i))) { + return contentValue.get(i); + } + } + + return null; } - else if (lowerName.equals("content-type")) - { - contentType = headerValue; + + public ArrayList<String> getContentNames() { + return contentName; + } + + public ArrayList<String> getContentValues() { + return contentValue; } - else if (lowerName.equals("set-cookie")) - { - cookieValueList.add(headerValue); + + /** + * Sets the actual data associated with this response. + * + * @param responseData The actual data associated with this response. + */ + public void setResponseData(byte[] responseData) { + if (responseData == null) { + this.responseData = new byte[0]; + } else { + this.responseData = responseData; + } } - } - - - - /** - * Retrieves a two-dimensional array containing the header data for this - * response, with each element being an array containing a name/value pair. - * - * @return A two-dimensional array containing the header data for this - * response. - */ - public String[][] getHeaderElements() - { - String[][] headerElements = new String[headerNameList.size()][2]; - for (int i=0; i < headerNameList.size(); i++) - { - headerElements[i][0] = headerNameList.get(i); - headerElements[i][1] = headerValueList.get(i); + + /** + * Retrieves the content length associated with this response. + * + * @return The content length associated with this response, or -1 if no + * content length is available. + */ + public int getContentLength() { + return contentLength; } - return headerElements; - } - - - - /** - * Retrieves the raw data included in this HTTP response. If the response did - * not include any data, an empty array will be returned. - * - * @return The raw data included in this HTTP response. - */ - public byte[] getResponseData() - { - return responseData; - } - - - public String getHTML() - { - String htmlString = new String(responseData); - return htmlString; - } - - public String getHTMLwithoutTags() - { - String htmlString = new String(responseData); - HTMLDocument htmldocument = new HTMLDocument(htmlString); - return htmldocument.getTextData(); - } - public void parseContent() - { - // parse the responseData byte[] buffer and split content into name - // value pair - String htmlString = new String(responseData); - StringTokenizer st = new StringTokenizer(htmlString, "\n"); - Utilities ut = new Utilities(); - - while(st.hasMoreTokens()) - { - String line = st.nextToken(); - // format for line assumed to be name="value"; format - - int eqPos = line.indexOf('=') ; - if(eqPos != -1) - { - String name = line.substring(0,eqPos); - String tempval = line.substring(eqPos+1).trim(); - String value = ut.cleanupQuotes(ut.removechar(tempval)); - - // add to array - this.contentName.add(name.trim()); - this.contentValue.add(value); - } - - } - - } - - - - public String getContentValue(String headerName) - { - for (int i=0; i < contentName.size(); i++) - { - if (headerName.equals(contentName.get(i))) - { - return contentValue.get(i); - } - } - - return null; - } - - public ArrayList<String> getContentNames() - { - return contentName; - } - - public ArrayList<String> getContentValues() - { - return contentValue; - } - - /** - * Sets the actual data associated with this response. - * - * @param responseData The actual data associated with this response. - */ - public void setResponseData(byte[] responseData) - { - if (responseData == null) - { - this.responseData = new byte[0]; + /** + * Retrieves the content type associated with this response. + * + * @return The content type associated with this response, or + * <CODE>null</CODE> if no content type is available. + */ + public String getContentType() { + return contentType; } - else - { - this.responseData = responseData; + + /** + * Retrieves an array containing the values of the cookies that should be + * set based on the information in this response. + * + * @return An array containing the values of the cookies that should be set + * based on the information in this response. + */ + public String[] getCookieValues() { + String[] cookieValues = new String[cookieValueList.size()]; + cookieValueList.toArray(cookieValues); + return cookieValues; } - } - - - - /** - * Retrieves the content length associated with this response. - * - * @return The content length associated with this response, or -1 if no - * content length is available. - */ - public int getContentLength() - { - return contentLength; - } - - - - /** - * Retrieves the content type associated with this response. - * - * @return The content type associated with this response, or - * <CODE>null</CODE> if no content type is available. - */ - public String getContentType() - { - return contentType; - } - - - - /** - * Retrieves an array containing the values of the cookies that should be set - * based on the information in this response. - * - * @return An array containing the values of the cookies that should be set - * based on the information in this response. - */ - public String[] getCookieValues() - { - String[] cookieValues = new String[cookieValueList.size()]; - cookieValueList.toArray(cookieValues); - return cookieValues; - } - - public String getCookieValue(String headerName) - { - for (int i=0; i < cookieValueList.size(); i++) - { - System.out.println("cookie list: " + cookieValueList.get(i)); - - String temp = cookieValueList.get(i); - if (temp.startsWith(headerName)) - { - return cookieValueList.get(i); - } - } - - return null; - } + public String getCookieValue(String headerName) { + for (int i = 0; i < cookieValueList.size(); i++) { + System.out.println("cookie list: " + cookieValueList.get(i)); -} + String temp = cookieValueList.get(i); + if (temp.startsWith(headerName)) { + return cookieValueList.get(i); + } + } + return null; + } + +} |