blob: bdae52b016290ad6f2c4196caea11c5b0fdd2d92 [file] [log] [blame]
/*****************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
****************************************************************/
package org.apache.cayenne.rop.http;
import org.apache.cayenne.remote.RemoteSession;
import org.apache.cayenne.rop.HttpClientConnection;
import org.apache.cayenne.rop.ROPConnector;
import org.apache.cayenne.rop.ROPConstants;
import org.apache.cayenne.rop.ROPUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
public class HttpROPConnector implements ROPConnector {
private static Log logger = LogFactory.getLog(HttpROPConnector.class);
public static final String SESSION_COOKIE_NAME = "JSESSIONID";
private HttpClientConnection clientConnection;
private String url;
private String username;
private String password;
private Long readTimeout;
public HttpROPConnector(String url, String username, String password) {
this.url = url;
this.username = username;
this.password = password;
}
public void setClientConnection(HttpClientConnection clientConnection) {
this.clientConnection = clientConnection;
}
public void setReadTimeout(Long readTimeout) {
this.readTimeout = readTimeout;
}
@Override
public InputStream establishSession() throws IOException {
if (logger.isInfoEnabled()) {
logger.info(ROPUtil.getLogConnect(url, username, password != null));
}
Map<String, String> requestParams = new HashMap<>();
requestParams.put(ROPConstants.OPERATION_PARAMETER, ROPConstants.ESTABLISH_SESSION_OPERATION);
return doRequest(requestParams);
}
@Override
public InputStream establishSharedSession(String sharedSessionName) throws IOException {
if (logger.isInfoEnabled()) {
logger.info(ROPUtil.getLogConnect(url, username, password != null, sharedSessionName));
}
Map<String, String> requestParams = new HashMap<>();
requestParams.put(ROPConstants.OPERATION_PARAMETER, ROPConstants.ESTABLISH_SHARED_SESSION_OPERATION);
requestParams.put(ROPConstants.SESSION_NAME_PARAMETER, sharedSessionName);
return doRequest(requestParams);
}
@Override
public InputStream sendMessage(byte[] message) throws IOException {
return doRequest(message);
}
@Override
public void close() throws IOException {
if (logger.isInfoEnabled()) {
logger.info(ROPUtil.getLogDisconnect(url, username, password != null));
}
}
protected InputStream doRequest(Map<String, String> params) throws IOException {
URLConnection connection = new URL(url).openConnection();
if (readTimeout != null) {
connection.setReadTimeout(readTimeout.intValue());
}
addAuthHeader(connection);
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("charset", "utf-8");
try (OutputStream output = connection.getOutputStream()) {
output.write(ROPUtil.getParamsAsString(params).getBytes(StandardCharsets.UTF_8));
output.flush();
}
return connection.getInputStream();
}
protected InputStream doRequest(byte[] data) throws IOException {
URLConnection connection = new URL(url).openConnection();
if (readTimeout != null) {
connection.setReadTimeout(readTimeout.intValue());
}
addAuthHeader(connection);
addSessionCookie(connection);
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/octet-stream");
if (data != null) {
try (OutputStream output = connection.getOutputStream()) {
output.write(data);
output.flush();
}
}
return connection.getInputStream();
}
protected void addAuthHeader(URLConnection connection) {
String basicAuth = ROPUtil.getBasicAuth(username, password);
if (basicAuth != null) {
connection.addRequestProperty("Authorization", basicAuth);
}
}
protected void addSessionCookie(URLConnection connection) {
RemoteSession session = clientConnection.getSession();
if (session != null && session.getSessionId() != null) {
connection.addRequestProperty("Cookie", SESSION_COOKIE_NAME
+ "="
+ session.getSessionId());
}
}
}