use of com.twinsoft.convertigo.beans.core.ConnectorEvent in project convertigo by convertigo.
the class AbstractConnectorCompositeWrap method checkEventSource.
protected boolean checkEventSource(EventObject event) {
boolean isSourceFromConnector = false;
Object source = event.getSource();
if (event instanceof ConnectorEvent) {
if (source instanceof DatabaseObject) {
Connector connector = ((DatabaseObject) source).getConnector();
if ((connector != null) && (connector.equals(this.connector)))
isSourceFromConnector = true;
}
}
return isSourceFromConnector;
}
use of com.twinsoft.convertigo.beans.core.ConnectorEvent in project convertigo by convertigo.
the class AbstractConnectorComposite method checkEventSource.
protected boolean checkEventSource(EventObject event) {
boolean isSourceFromConnector = false;
Object source = event.getSource();
if (event instanceof ConnectorEvent) {
if (source instanceof DatabaseObject) {
Connector connector = ((DatabaseObject) source).getConnector();
if ((connector != null) && (connector.equals(this.connector)))
isSourceFromConnector = true;
}
}
return isSourceFromConnector;
}
use of com.twinsoft.convertigo.beans.core.ConnectorEvent in project convertigo by convertigo.
the class SiteClipperConnector method doProcessRequest.
private void doProcessRequest(Shuttle shuttle) throws IOException, ServletException, EngineException {
shuttle.statisticsTaskID = context.statistics.start(EngineStatistics.GET_DOCUMENT);
try {
shuttle.sharedScope = context.getSharedScope();
String domain = shuttle.getRequest(QueryPart.host) + shuttle.getRequest(QueryPart.port);
Engine.logSiteClipper.trace("(SiteClipperConnector) Prepare the request for the domain " + domain);
if (!shouldRewrite(domain)) {
Engine.logSiteClipper.info("(SiteClipperConnector) The domain " + domain + " is not allowed with this connector");
shuttle.response.sendError(HttpServletResponse.SC_FORBIDDEN, "The domain " + domain + " is not allowed with this connector");
return;
}
String uri = shuttle.getRequest(QueryPart.uri);
Engine.logSiteClipper.info("Preparing " + shuttle.request.getMethod() + " " + shuttle.getRequestUrl());
HttpMethod httpMethod = null;
XulRecorder xulRecorder = context.getXulRecorder();
if (xulRecorder != null) {
httpMethod = shuttle.httpMethod = xulRecorder.getRecord(shuttle.getRequestUrlAndQuery());
}
if (httpMethod == null) {
try {
switch(shuttle.getRequestHttpMethodType()) {
case GET:
httpMethod = new GetMethod(uri);
break;
case POST:
httpMethod = new PostMethod(uri);
((PostMethod) httpMethod).setRequestEntity(new InputStreamRequestEntity(shuttle.request.getInputStream()));
break;
case PUT:
httpMethod = new PutMethod(uri);
((PutMethod) httpMethod).setRequestEntity(new InputStreamRequestEntity(shuttle.request.getInputStream()));
break;
case DELETE:
httpMethod = new DeleteMethod(uri);
break;
case HEAD:
httpMethod = new HeadMethod(uri);
break;
case OPTIONS:
httpMethod = new OptionsMethod(uri);
break;
case TRACE:
httpMethod = new TraceMethod(uri);
break;
default:
throw new ServletException("(SiteClipperConnector) unknown http method " + shuttle.request.getMethod());
}
httpMethod.setFollowRedirects(false);
} catch (Exception e) {
throw new ServletException("(SiteClipperConnector) unexpected exception will building the http method : " + e.getMessage());
}
shuttle.httpMethod = httpMethod;
SiteClipperScreenClass screenClass = getCurrentScreenClass();
Engine.logSiteClipper.info("Request screen class: " + screenClass.getName());
for (String name : Collections.list(GenericUtils.<Enumeration<String>>cast(shuttle.request.getHeaderNames()))) {
if (requestHeadersToIgnore.contains(HeaderName.parse(name))) {
Engine.logSiteClipper.trace("(SiteClipperConnector) Ignoring request header " + name);
} else {
String value = shuttle.request.getHeader(name);
Engine.logSiteClipper.trace("(SiteClipperConnector) Copying request header " + name + "=" + value);
shuttle.setRequestCustomHeader(name, value);
}
}
Engine.logSiteClipper.debug("(SiteClipperConnector) applying request rules for the screenclass " + screenClass.getName());
for (IRequestRule rule : screenClass.getRequestRules()) {
if (rule.isEnabled()) {
Engine.logSiteClipper.trace("(SiteClipperConnector) applying request rule " + rule.getName());
rule.fireEvents();
boolean done = rule.applyOnRequest(shuttle);
Engine.logSiteClipper.debug("(SiteClipperConnector) the request rule " + rule.getName() + " is " + (done ? "well" : "not") + " applied");
} else {
Engine.logSiteClipper.trace("(SiteClipperConnector) skip the disabled request rule " + rule.getName());
}
}
for (Entry<String, String> header : shuttle.requestCustomHeaders.entrySet()) {
Engine.logSiteClipper.trace("(SiteClipperConnector) Push request header " + header.getKey() + "=" + header.getValue());
httpMethod.addRequestHeader(header.getKey(), header.getValue());
}
String queryString = shuttle.request.getQueryString();
if (queryString != null) {
try {
// Fake test in order to check query string validity
new URI("http://localhost/index?" + queryString, true, httpMethod.getParams().getUriCharset());
} catch (URIException e) {
// Bugfix #2103
StringBuffer newQuery = new StringBuffer();
for (String part : RegexpUtils.pattern_and.split(queryString)) {
String[] pair = RegexpUtils.pattern_equals.split(part, 2);
try {
newQuery.append('&').append(URLEncoder.encode(URLDecoder.decode(pair[0], "UTF-8"), "UTF-8"));
if (pair.length > 1) {
newQuery.append('=').append(URLEncoder.encode(URLDecoder.decode(pair[1], "UTF-8"), "UTF-8"));
}
} catch (UnsupportedEncodingException ee) {
Engine.logSiteClipper.trace("(SiteClipperConnector) failed to encode query part : " + part);
}
}
queryString = newQuery.length() > 0 ? newQuery.substring(1) : newQuery.toString();
Engine.logSiteClipper.trace("(SiteClipperConnector) re-encode query : " + queryString);
}
}
Engine.logSiteClipper.debug("(SiteClipperConnector) Copying the query string : " + queryString);
httpMethod.setQueryString(queryString);
// if (context.httpState == null) {
// Engine.logSiteClipper.debug("(SiteClipperConnector) Creating new HttpState for context id " + context.contextID);
// context.httpState = new HttpState();
// } else {
// Engine.logSiteClipper.debug("(SiteClipperConnector) Using HttpState of context id " + context.contextID);
// }
getHttpState(shuttle);
HostConfiguration hostConfiguration = getHostConfiguration(shuttle);
HttpMethodParams httpMethodParams = httpMethod.getParams();
httpMethodParams.setBooleanParameter("http.connection.stalecheck", true);
httpMethodParams.setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, true));
Engine.logSiteClipper.info("Requesting " + httpMethod.getName() + " " + hostConfiguration.getHostURL() + httpMethod.getURI().toString());
HttpClient httpClient = context.getHttpClient3(shuttle.getHttpPool());
HttpUtils.logCurrentHttpConnection(httpClient, hostConfiguration, shuttle.getHttpPool());
httpClient.executeMethod(hostConfiguration, httpMethod, context.httpState);
} else {
Engine.logSiteClipper.info("Retrieve recorded response from Context");
}
int status = httpMethod.getStatusCode();
shuttle.processState = ProcessState.response;
Engine.logSiteClipper.info("Request terminated with status " + status);
shuttle.response.setStatus(status);
if (Engine.isStudioMode() && status == HttpServletResponse.SC_OK && shuttle.getResponseMimeType().startsWith("text/")) {
fireDataChanged(new ConnectorEvent(this, shuttle.getResponseAsString()));
}
SiteClipperScreenClass screenClass = getCurrentScreenClass();
Engine.logSiteClipper.info("Response screen class: " + screenClass.getName());
if (Engine.isStudioMode()) {
Engine.theApp.fireObjectDetected(new EngineEvent(screenClass));
}
for (Header header : httpMethod.getResponseHeaders()) {
String name = header.getName();
if (responseHeadersToIgnore.contains(HeaderName.parse(name))) {
Engine.logSiteClipper.trace("(SiteClipperConnector) Ignoring response header " + name);
} else {
String value = header.getValue();
Engine.logSiteClipper.trace("(SiteClipperConnector) Copying response header " + name + "=" + value);
shuttle.responseCustomHeaders.put(name, value);
}
}
String contentLength = HeaderName.ContentLength.getResponseHeader(httpMethod);
Engine.logSiteClipper.debug("(SiteClipperConnector) applying response rules for the screenclass " + screenClass.getName());
for (IResponseRule rule : screenClass.getResponseRules()) {
if (rule.isEnabled()) {
Engine.logSiteClipper.trace("(SiteClipperConnector) applying response rule " + rule.getName());
rule.fireEvents();
boolean done = rule.applyOnResponse(shuttle);
Engine.logSiteClipper.debug("(SiteClipperConnector) the response rule " + rule.getName() + " is " + (done ? "well" : "not") + " applied");
} else {
Engine.logSiteClipper.trace("(SiteClipperConnector) skip the disabled response rule " + rule.getName());
}
}
for (Entry<String, String> header : shuttle.responseCustomHeaders.entrySet()) {
Engine.logSiteClipper.trace("(SiteClipperConnector) Push request header " + header.getKey() + "=" + header.getValue());
shuttle.response.addHeader(header.getKey(), header.getValue());
}
if (shuttle.postInstructions != null) {
JSONArray instructions = new JSONArray();
for (IClientInstruction instruction : shuttle.postInstructions) {
try {
instructions.put(instruction.getInstruction());
} catch (JSONException e) {
Engine.logSiteClipper.error("(SiteClipperConnector) Failed to add a post instruction due to a JSONException", e);
}
}
String codeToInject = "<script>C8O_postInstructions = " + instructions.toString() + "</script>\n" + "<script src=\"" + shuttle.getRequest(QueryPart.full_convertigo_path) + "/scripts/jquery.min.js\"></script>\n" + "<script src=\"" + shuttle.getRequest(QueryPart.full_convertigo_path) + "/scripts/siteclipper.js\"></script>\n";
String content = shuttle.getResponseAsString();
Matcher matcher = HtmlLocation.head_top.matcher(content);
String newContent = RegexpUtils.inject(matcher, codeToInject);
if (newContent == null) {
matcher = HtmlLocation.body_top.matcher(content);
newContent = RegexpUtils.inject(matcher, codeToInject);
}
if (newContent != null) {
shuttle.setResponseAsString(newContent);
} else {
Engine.logSiteClipper.info("(SiteClipperConnector) Failed to find a head or body tag in the response content");
Engine.logSiteClipper.trace("(SiteClipperConnector) Response content : \"" + content + "\"");
}
}
long nbBytes = 0L;
String responseContentLength = HeaderName.ContentLength.getHeader(shuttle.response);
if (shuttle.responseAsString != null && shuttle.responseAsString.hashCode() != shuttle.responseAsStringOriginal.hashCode()) {
OutputStream os = shuttle.response.getOutputStream();
shuttle.responseAsByte = shuttle.responseAsString.getBytes(shuttle.getResponseCharset());
nbBytes = shuttle.responseAsByte.length;
switch(shuttle.getResponseContentEncoding()) {
case gzip:
os = new GZIPOutputStream(os);
break;
case deflate:
os = new DeflaterOutputStream(os, new Deflater(Deflater.DEFAULT_COMPRESSION | Deflater.DEFAULT_STRATEGY, true));
break;
default:
if (responseContentLength == null) {
HeaderName.ContentLength.setHeader(shuttle.response, "" + nbBytes);
}
break;
}
IOUtils.write(shuttle.responseAsByte, os);
os.close();
} else {
InputStream is;
if (shuttle.responseAsByte == null) {
if (responseContentLength == null && contentLength != null) {
HeaderName.ContentLength.setHeader(shuttle.response, contentLength);
}
is = httpMethod.getResponseBodyAsStream();
} else {
if (responseContentLength == null) {
HeaderName.ContentLength.setHeader(shuttle.response, "" + shuttle.responseAsByte.length);
}
is = new ByteArrayInputStream(shuttle.responseAsByte);
}
if (is != null) {
nbBytes = StreamUtils.copyAutoFlush(is, shuttle.response.getOutputStream());
Engine.logSiteClipper.trace("(SiteClipperConnector) Response body copyied (" + nbBytes + " bytes)");
}
}
shuttle.response.getOutputStream().close();
shuttle.score = getScore(nbBytes);
Engine.logSiteClipper.debug("(SiteClipperConnector) Request terminated with a score of " + shuttle.score);
} finally {
long duration = context.statistics.stop(shuttle.statisticsTaskID);
if (context.requestedObject != null) {
try {
Engine.theApp.billingManager.insertBilling(context, Long.valueOf(duration), Long.valueOf(shuttle.score));
} catch (Exception e) {
Engine.logContext.warn("Unable to insert billing ticket (the billing is thus ignored): [" + e.getClass().getName() + "] " + e.getMessage());
}
}
}
}
use of com.twinsoft.convertigo.beans.core.ConnectorEvent in project convertigo by convertigo.
the class HttpConnector method getData.
public byte[] getData(Context context, String sUrl) throws IOException, EngineException {
HttpMethod method = null;
try {
// Fire event for plugins
long t0 = System.currentTimeMillis();
Engine.theApp.pluginsManager.fireHttpConnectorGetDataStart(context);
Engine.logBeans.trace("(HttpConnector) Retrieving data as a bytes array...");
Engine.logBeans.debug("(HttpConnector) Connecting to: " + sUrl);
// Setting the referer
referer = sUrl;
Engine.logBeans.debug("(HttpConnector) Https: " + https);
URL url = new URL(sUrl);
String host = url.getHost();
int port = url.getPort();
if (sUrl.toLowerCase().startsWith("https:")) {
if (!https) {
Engine.logBeans.debug("(HttpConnector) Setting up SSL properties");
certificateManager.collectStoreInformation(context);
}
if (port == -1)
port = 443;
Engine.logBeans.debug("(HttpConnector) Host: " + host + ":" + port);
Engine.logBeans.debug("(HttpConnector) CertificateManager has changed: " + certificateManager.hasChanged);
if (certificateManager.hasChanged || (!host.equalsIgnoreCase(hostConfiguration.getHost())) || (hostConfiguration.getPort() != port)) {
Engine.logBeans.debug("(HttpConnector) Using MySSLSocketFactory for creating the SSL socket");
Protocol myhttps = new Protocol("https", MySSLSocketFactory.getSSLSocketFactory(certificateManager.keyStore, certificateManager.keyStorePassword, certificateManager.trustStore, certificateManager.trustStorePassword, this.trustAllServerCertificates), port);
hostConfiguration.setHost(host, port, myhttps);
}
sUrl = url.getFile();
Engine.logBeans.debug("(HttpConnector) Updated URL for SSL purposes: " + sUrl);
} else {
Engine.logBeans.debug("(HttpConnector) Host: " + host + ":" + port);
hostConfiguration.setHost(host, port);
}
// Retrieving httpState
getHttpState(context);
// Proxy configuration
Engine.theApp.proxyManager.setProxy(hostConfiguration, httpState, url);
AbstractHttpTransaction httpTransaction = (AbstractHttpTransaction) context.transaction;
// Retrieve HTTP method
HttpMethodType httpVerb = httpTransaction.getHttpVerb();
String sHttpVerb = httpVerb.name();
final String sCustomHttpVerb = httpTransaction.getCustomHttpVerb();
if (sCustomHttpVerb.length() > 0) {
Engine.logBeans.debug("(HttpConnector) HTTP verb: " + sHttpVerb + " overridden to '" + sCustomHttpVerb + "'");
switch(httpVerb) {
case GET:
method = new GetMethod(sUrl) {
@Override
public String getName() {
return sCustomHttpVerb;
}
};
break;
case POST:
method = new PostMethod(sUrl) {
@Override
public String getName() {
return sCustomHttpVerb;
}
};
break;
case PUT:
method = new PutMethod(sUrl) {
@Override
public String getName() {
return sCustomHttpVerb;
}
};
break;
case DELETE:
method = new DeleteMethod(sUrl) {
@Override
public String getName() {
return sCustomHttpVerb;
}
};
break;
case HEAD:
method = new HeadMethod(sUrl) {
@Override
public String getName() {
return sCustomHttpVerb;
}
};
break;
case OPTIONS:
method = new OptionsMethod(sUrl) {
@Override
public String getName() {
return sCustomHttpVerb;
}
};
break;
case TRACE:
method = new TraceMethod(sUrl) {
@Override
public String getName() {
return sCustomHttpVerb;
}
};
break;
}
} else {
Engine.logBeans.debug("(HttpConnector) HTTP verb: " + sHttpVerb);
switch(httpVerb) {
case GET:
method = new GetMethod(sUrl);
break;
case POST:
method = new PostMethod(sUrl);
break;
case PUT:
method = new PutMethod(sUrl);
break;
case DELETE:
method = new DeleteMethod(sUrl);
break;
case HEAD:
method = new HeadMethod(sUrl);
break;
case OPTIONS:
method = new OptionsMethod(sUrl);
break;
case TRACE:
method = new TraceMethod(sUrl);
break;
}
}
// Setting HTTP parameters
boolean hasUserAgent = false;
for (List<String> httpParameter : httpParameters) {
String key = httpParameter.get(0);
String value = httpParameter.get(1);
if (key.equalsIgnoreCase("host") && !value.equals(host)) {
value = host;
}
if (!key.startsWith(DYNAMIC_HEADER_PREFIX)) {
method.setRequestHeader(key, value);
}
if (HeaderName.UserAgent.is(key)) {
hasUserAgent = true;
}
}
// set user-agent header if not found
if (!hasUserAgent) {
HeaderName.UserAgent.setRequestHeader(method, getUserAgent(context));
}
// Setting POST or PUT parameters if any
Engine.logBeans.debug("(HttpConnector) Setting " + httpVerb + " data");
if (method instanceof EntityEnclosingMethod) {
EntityEnclosingMethod entityEnclosingMethod = (EntityEnclosingMethod) method;
AbstractHttpTransaction transaction = (AbstractHttpTransaction) context.requestedObject;
if (doMultipartFormData) {
RequestableHttpVariable body = (RequestableHttpVariable) httpTransaction.getVariable(Parameter.HttpBody.getName());
if (body != null && body.getDoFileUploadMode() == DoFileUploadMode.multipartFormData) {
String stringValue = httpTransaction.getParameterStringValue(Parameter.HttpBody.getName());
String filepath = Engine.theApp.filePropertyManager.getFilepathFromProperty(stringValue, getProject().getName());
File file = new File(filepath);
if (file.exists()) {
HeaderName.ContentType.setRequestHeader(method, contentType);
entityEnclosingMethod.setRequestEntity(new FileRequestEntity(file, contentType));
} else {
throw new FileNotFoundException(file.getAbsolutePath());
}
} else {
List<Part> parts = new LinkedList<Part>();
for (RequestableVariable variable : transaction.getVariablesList()) {
if (variable instanceof RequestableHttpVariable) {
RequestableHttpVariable httpVariable = (RequestableHttpVariable) variable;
if ("POST".equals(httpVariable.getHttpMethod())) {
Object httpObjectVariableValue = transaction.getVariableValue(httpVariable.getName());
if (httpVariable.isMultiValued()) {
if (httpObjectVariableValue instanceof Collection<?>) {
for (Object httpVariableValue : (Collection<?>) httpObjectVariableValue) {
addFormDataPart(parts, httpVariable, httpVariableValue);
}
}
} else {
addFormDataPart(parts, httpVariable, httpObjectVariableValue);
}
}
}
}
MultipartRequestEntity mre = new MultipartRequestEntity(parts.toArray(new Part[parts.size()]), entityEnclosingMethod.getParams());
HeaderName.ContentType.setRequestHeader(method, mre.getContentType());
entityEnclosingMethod.setRequestEntity(mre);
}
} else if (MimeType.TextXml.is(contentType)) {
final MimeMultipart[] mp = { null };
for (RequestableVariable variable : transaction.getVariablesList()) {
if (variable instanceof RequestableHttpVariable) {
RequestableHttpVariable httpVariable = (RequestableHttpVariable) variable;
if (httpVariable.getDoFileUploadMode() == DoFileUploadMode.MTOM) {
Engine.logBeans.trace("(HttpConnector) Variable " + httpVariable.getName() + " detected as MTOM");
MimeMultipart mimeMultipart = mp[0];
try {
if (mimeMultipart == null) {
Engine.logBeans.debug("(HttpConnector) Preparing the MTOM request");
mimeMultipart = new MimeMultipart("related; type=\"application/xop+xml\"");
MimeBodyPart bp = new MimeBodyPart();
bp.setText(postQuery, "UTF-8");
bp.setHeader(HeaderName.ContentType.value(), contentType);
mimeMultipart.addBodyPart(bp);
}
Object httpObjectVariableValue = transaction.getVariableValue(httpVariable.getName());
if (httpVariable.isMultiValued()) {
if (httpObjectVariableValue instanceof Collection<?>) {
for (Object httpVariableValue : (Collection<?>) httpObjectVariableValue) {
addMtomPart(mimeMultipart, httpVariable, httpVariableValue);
}
}
} else {
addMtomPart(mimeMultipart, httpVariable, httpObjectVariableValue);
}
mp[0] = mimeMultipart;
} catch (Exception e) {
Engine.logBeans.warn("(HttpConnector) Failed to add MTOM part for " + httpVariable.getName(), e);
}
}
}
}
if (mp[0] == null) {
entityEnclosingMethod.setRequestEntity(new StringRequestEntity(postQuery, MimeType.TextXml.value(), "UTF-8"));
} else {
Engine.logBeans.debug("(HttpConnector) Commit the MTOM request with the ContentType: " + mp[0].getContentType());
HeaderName.ContentType.setRequestHeader(method, mp[0].getContentType());
entityEnclosingMethod.setRequestEntity(new RequestEntity() {
@Override
public void writeRequest(OutputStream outputStream) throws IOException {
try {
mp[0].writeTo(outputStream);
} catch (MessagingException e) {
new IOException(e);
}
}
@Override
public boolean isRepeatable() {
return true;
}
@Override
public String getContentType() {
return mp[0].getContentType();
}
@Override
public long getContentLength() {
return -1;
}
});
}
} else {
String charset = httpTransaction.getComputedUrlEncodingCharset();
HeaderName.ContentType.setRequestHeader(method, contentType);
entityEnclosingMethod.setRequestEntity(new StringRequestEntity(postQuery, contentType, charset));
}
}
// Getting the result
Engine.logBeans.debug("(HttpConnector) HttpClient: getting response body");
byte[] result = executeMethod(method, context);
Engine.logBeans.debug("(HttpConnector) Total read bytes: " + ((result != null) ? result.length : 0));
// Fire event for plugins
long t1 = System.currentTimeMillis();
Engine.theApp.pluginsManager.fireHttpConnectorGetDataEnd(context, t0, t1);
StringBuilder sb = new StringBuilder();
sb.append("HTTP result {ContentType: " + context.contentType + ", Length: " + (result != null ? result.length : 0) + "}\n\n");
if (result != null && context.contentType != null && (context.contentType.startsWith("text/") || context.contentType.startsWith("application/xml") || context.contentType.startsWith("application/json"))) {
sb.append(new String(result, "UTF-8"));
}
fireDataChanged(new ConnectorEvent(this, sb.toString()));
return result;
} finally {
if (method != null)
method.releaseConnection();
}
}
Aggregations