/*
* Copyright 2004-2014 SmartBear Software
*
* Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://ec.europa.eu/idabc/eupl
*
* Unless required by applicable law or agreed to in writing, software distributed under the Licence is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the Licence for the specific language governing permissions and limitations
* under the Licence.
*/
package com.eviware.soapui.impl.wsdl.submit.transports.http;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.impl.support.AbstractHttpRequest;
import com.eviware.soapui.impl.support.http.HttpRequest;
import com.eviware.soapui.impl.wsdl.support.RequestFileAttachment;
import com.eviware.soapui.model.iface.Attachment;
import com.eviware.soapui.model.iface.Request;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.WebRequestSettings;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
public class HTMLPageSourceDownloader {
WebClient client = new WebClient();
List<String> missingResourcesList = new ArrayList<String>();
public static final String MISSING_RESOURCES_LIST = "MissingResourcesList";
public static final HashMap<String, String> acceptTypes = new HashMap<String, String>() {
{
put("html", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
put("img", "image/png,image/*;q=0.8,*/*;q=0.5");
put("script", "*/*");
put("style", "text/css,*/*;q=0.1");
}
};
List<Attachment> attachmentList = new ArrayList<Attachment>();
protected List<Attachment> downloadCssAndImages(String endpoint, HttpRequest request)
throws MalformedURLException, IOException {
HtmlPage htmlPage = client.getPage(endpoint);
String xPathExpression = "//*[name() = 'img' or name() = 'link' and @type = 'text/css']";
List<?> resultList = htmlPage.getByXPath(xPathExpression);
byte[] bytes = null;
List<Attachment> attachmentList = new ArrayList<Attachment>();
Iterator<?> i = resultList.iterator();
while (i.hasNext()) {
try {
HtmlElement htmlElement = (HtmlElement) i.next();
String path = htmlElement.getAttribute("src").equals("") ? htmlElement.getAttribute("href")
: htmlElement.getAttribute("src");
if (path == null || path.equals("")) {
continue;
}
URL url = htmlPage.getFullyQualifiedUrl(path);
try {
bytes = downloadResource(htmlPage, htmlElement, url);
} catch (FailingHttpStatusCodeException fhsce) {
SoapUI.log.warn(fhsce.getMessage());
attachmentList.add(createMissingAttachment(request, url, fhsce));
continue;
}
attachmentList.add(createAttachment(bytes, url, request));
} catch (Exception e) {
SoapUI.logError(e);
}
}
client.removeRequestHeader("Accept");
return attachmentList;
}
private RequestFileAttachment createMissingAttachment(HttpRequest request, URL url,
FailingHttpStatusCodeException fhsce) throws IOException {
File temp = new File(fhsce.getStatusCode() + "_" + fhsce.getStatusMessage() + "_" + url.toString());
RequestFileAttachment missingFile = new RequestFileAttachment(temp, false, (AbstractHttpRequest<?>) request);
missingResourcesList.add(fhsce.getStatusCode() + " " + fhsce.getStatusMessage() + " " + url.toString());
return missingFile;
}
public Attachment createAttachment(byte[] bytes, URL url, Request request) throws IOException {
String fileName = url.getPath()
.substring(url.getPath().lastIndexOf("/") + 1, url.getPath().lastIndexOf("."));
String extension = url.getPath().substring(url.getPath().lastIndexOf("."));
// handling -> java.lang.IllegalArgumentException: Prefix string too short
if (fileName.length() < 3) {
fileName += "___";
}
File temp = File.createTempFile(fileName, extension);
OutputStream out = new FileOutputStream(temp);
out.write(bytes);
out.close();
return new RequestFileAttachment(temp, false, (AbstractHttpRequest<?>) request);
}
private byte[] downloadResource(HtmlPage page, HtmlElement htmlElement, URL url) throws IOException {
WebRequestSettings wrs = null;
wrs = new WebRequestSettings(url);
wrs.setAdditionalHeader("Referer", page.getWebResponse().getRequestSettings().getUrl().toString());
client.addRequestHeader("Accept", acceptTypes.get(htmlElement.getTagName().toLowerCase()));
return client.getPage(wrs).getWebResponse().getContentAsBytes();
}
public List<String> getMissingResourcesList() {
return missingResourcesList;
}
}