diff options
| author | Alex Clayton <alex.clayton@isode.com> | 2016-02-22 16:05:37 (GMT) |
|---|---|---|
| committer | Alex Clayton <alex.clayton@isode.com> | 2016-02-29 12:10:44 (GMT) |
| commit | d636d68c84229c82ff746c7697d2014ff4dd4477 (patch) | |
| tree | a534ffdb9696c68d21d1cec6624023795ef683d7 /src/com/isode | |
| parent | 2de569d23468c94fdcf1adc336a580b053423fd7 (diff) | |
| download | stroke-d636d68c84229c82ff746c7697d2014ff4dd4477.zip stroke-d636d68c84229c82ff746c7697d2014ff4dd4477.tar.bz2 | |
Finish porting on Network Package
As per PortingProgress.txt finsh porting all the classes I can from the network
package. This involved some updates as the tests and code had changed since
they existing classes had been imported.
I have added notes for the classes I did not port in PortingProgress explaining
why they were not ported.
Test-information:
All unit tests pass.
Change-Id: Ibb52ae409f1da9b72a4c1e590cd22835a1be95eb
Diffstat (limited to 'src/com/isode')
6 files changed, 204 insertions, 15 deletions
diff --git a/src/com/isode/stroke/network/HTTPConnectProxiedConnection.java b/src/com/isode/stroke/network/HTTPConnectProxiedConnection.java index a85758c..d2915bd 100644 --- a/src/com/isode/stroke/network/HTTPConnectProxiedConnection.java +++ b/src/com/isode/stroke/network/HTTPConnectProxiedConnection.java @@ -6,3 +6,3 @@ /* - * Copyright (c) 2011-2015 Isode Limited. + * Copyright (c) 2011-2016 Isode Limited. * All rights reserved. @@ -21,2 +21,4 @@ import com.isode.stroke.stringcodecs.Base64; +import java.util.ArrayList; +import java.util.List; import java.util.Scanner; @@ -30,2 +32,3 @@ public class HTTPConnectProxiedConnection extends ProxiedConnection { private StringBuffer httpResponseBuffer_ = new StringBuffer(""); + private final List<Pair> nextHTTPRequestHeaders_ = new ArrayList<Pair>(); @@ -53,2 +56,4 @@ public class HTTPConnectProxiedConnection extends ProxiedConnection { protected void initializeProxy() { + httpResponseBuffer_.setLength(0); + StringBuffer connect = new StringBuffer(); @@ -64,4 +69,12 @@ public class HTTPConnectProxiedConnection extends ProxiedConnection { } + else if (!nextHTTPRequestHeaders_.isEmpty()) { + for (Pair headerField : nextHTTPRequestHeaders_) { + data.append(headerField.a); + data.append(": "); + data.append(headerField.b); + data.append("\r\n"); + } + nextHTTPRequestHeaders_.clear(); + } data.append(new SafeByteArray("\r\n")); - //SWIFT_LOG(debug) << "HTTP Proxy send headers: " << byteArrayToString(ByteArray(data.begin(), data.end())) << std::endl; write(data); @@ -87,8 +100,8 @@ public class HTTPConnectProxiedConnection extends ProxiedConnection { if (trafficFilter_ != null) { - Vector<Pair> newHeaderFields = trafficFilter_.filterHTTPResponseHeader(headerFields); + Vector<Pair> newHeaderFields = trafficFilter_.filterHTTPResponseHeader(statusLine, headerFields); if (!newHeaderFields.isEmpty()) { - StringBuffer statusLines = new StringBuffer(); - statusLines.append("CONNECT ").append(getServer().getAddress().toString()).append(":").append(getServer().getPort()); - sendHTTPRequest(statusLines.toString(), newHeaderFields); - return; + reconnect(); + nextHTTPRequestHeaders_.clear(); + nextHTTPRequestHeaders_.addAll(newHeaderFields); + return; } diff --git a/src/com/isode/stroke/network/HTTPTrafficFilter.java b/src/com/isode/stroke/network/HTTPTrafficFilter.java index 86f0659..c9a039e 100644 --- a/src/com/isode/stroke/network/HTTPTrafficFilter.java +++ b/src/com/isode/stroke/network/HTTPTrafficFilter.java @@ -1,3 +1,3 @@ /* - * Copyright (c) 2015 Isode Limited. + * Copyright (c) 2015-2016 Isode Limited. * All rights reserved. @@ -20,2 +20,3 @@ public interface HTTPTrafficFilter { * It can be used to insert additional HTTP requests into the HTTP CONNECT proxy initalization process. + * @param statusLine status line from a HTTP header * @return A vector of HTTP header fields to use in a new request. If an empty vector is returned, @@ -23,3 +24,3 @@ public interface HTTPTrafficFilter { */ - public Vector<HTTPConnectProxiedConnection.Pair> filterHTTPResponseHeader(final Vector<HTTPConnectProxiedConnection.Pair> responseHeader); + public Vector<HTTPConnectProxiedConnection.Pair> filterHTTPResponseHeader(String statusLine, final Vector<HTTPConnectProxiedConnection.Pair> responseHeader); }
\ No newline at end of file diff --git a/src/com/isode/stroke/network/JavaNetworkEnviroment.java b/src/com/isode/stroke/network/JavaNetworkEnviroment.java new file mode 100644 index 0000000..0113c57 --- /dev/null +++ b/src/com/isode/stroke/network/JavaNetworkEnviroment.java @@ -0,0 +1,51 @@ +/* Copyright (c) 2016, Isode Limited, London, England. + * All rights reserved. + * + * Acquisition and use of this software and related materials for any + * purpose requires a written license agreement from Isode Limited, + * or a written license from an organisation licensed by Isode Limited + * to grant such a license. + * + */ +package com.isode.stroke.network; + +import java.net.SocketException; +import java.util.Enumeration; +import java.util.Vector; +import java.util.logging.Logger; + +/** + * Java implementation of {@link NetworkEnvironment} + */ +public class JavaNetworkEnviroment extends NetworkEnvironment { + + /** + * Logger + */ + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public Vector<NetworkInterface> getNetworkInterfaces() { + Vector<NetworkInterface> results = new Vector<NetworkInterface>(); + try { + Enumeration<java.net.NetworkInterface> javaNIEnumeration = + java.net.NetworkInterface.getNetworkInterfaces(); + if (javaNIEnumeration.hasMoreElements()) { + java.net.NetworkInterface javaNI = javaNIEnumeration.nextElement(); + try { + NetworkInterface strokeNI = new NetworkInterface(javaNI); + results.add(strokeNI); + } catch (SocketException e) { + logger.warning("Error determining if "+javaNI+ + " is loopback : "+e.getMessage()); + } + + } + } + catch (SocketException e) { + logger.warning("Error occured when getting network interfaces - "+e.getMessage()); + } + return results; + } + +} diff --git a/src/com/isode/stroke/network/NetworkInterface.java b/src/com/isode/stroke/network/NetworkInterface.java index 5590837..1bffafc 100644 --- a/src/com/isode/stroke/network/NetworkInterface.java +++ b/src/com/isode/stroke/network/NetworkInterface.java @@ -6,3 +6,3 @@ /* - * Copyright (c) 2015 Isode Limited. + * Copyright (c) 2015-2016 Isode Limited. * All rights reserved. @@ -18,2 +18,5 @@ package com.isode.stroke.network; +import java.net.InetAddress; +import java.net.SocketException; +import java.util.Enumeration; import java.util.Vector; @@ -30,2 +33,21 @@ public class NetworkInterface { } + + /** + * Creates a {@link NetworkInterface} from a {@link java.net.NetworkInterface} including + * all addresses in the {@link java.net.NetworkInterface} + * @param javaNI The {@link java.net.NetworkInterface} to create the {@link NetworkInterface} + * from, should not be {@code null}. + * @throws SocketException If an I/O error occurs when trying to determine if it is + * a loop back interface. + */ + public NetworkInterface(java.net.NetworkInterface javaNI) throws SocketException { + this.name = javaNI.getName(); + this.loopback = javaNI.isLoopback(); + Enumeration<InetAddress> addressEnumeration = javaNI.getInetAddresses(); + while (addressEnumeration.hasMoreElements()) { + InetAddress inetAddress = addressEnumeration.nextElement(); + HostAddress hostAddress = new HostAddress(inetAddress); + addAddress(hostAddress); + } + } diff --git a/src/com/isode/stroke/network/PlatformDomainNameAddressQuery.java b/src/com/isode/stroke/network/PlatformDomainNameAddressQuery.java new file mode 100644 index 0000000..24deb4d --- /dev/null +++ b/src/com/isode/stroke/network/PlatformDomainNameAddressQuery.java @@ -0,0 +1,86 @@ +/* Copyright (c) 2016, Isode Limited, London, England. + * All rights reserved. + * + * Acquisition and use of this software and related materials for any + * purpose requires a written license agreement from Isode Limited, + * or a written license from an organisation licensed by Isode Limited + * to grant such a license. + * + */ +package com.isode.stroke.network; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import com.isode.stroke.eventloop.Event.Callback; +import com.isode.stroke.eventloop.EventLoop; + +public class PlatformDomainNameAddressQuery extends DomainNameAddressQuery { + + private final String host_; + private final EventLoop eventLoop_; + + public PlatformDomainNameAddressQuery(String host,EventLoop eventLoop) { + host_ = host; + eventLoop_ = eventLoop; + } + + private class QueryRunnable implements Runnable { + + private final List<HostAddress> results_ = + Collections.synchronizedList(new ArrayList<HostAddress>()); + + @Override + public void run() { + try { + InetAddress[] inetAddresses = InetAddress.getAllByName(host_); + for (InetAddress address : inetAddresses) { + HostAddress result = new HostAddress(address); + results_.add(result); + } + } catch (UnknownHostException e) { + emitError(); + } + emitResults(); + } + + private void emitError() { + eventLoop_.postEvent(new Callback() { + + @Override + public void run() { + onResult.emit(new ArrayList<HostAddress>(),new DomainNameResolveError()); + } + + }); + } + + private void emitResults() { + eventLoop_.postEvent(new Callback() { + + @Override + public void run() { + // For thread safety emit a copy of the results + List<HostAddress> resultCopy = new ArrayList<HostAddress>(); + synchronized (results_) { + resultCopy.addAll(results_); + } + onResult.emit(results_,null); + } + + }); + } + + } + + @Override + public void run() { + Thread queryThread = new Thread(new QueryRunnable()); + queryThread.setDaemon(true); + queryThread.run(); + } + +} diff --git a/src/com/isode/stroke/network/ProxiedConnection.java b/src/com/isode/stroke/network/ProxiedConnection.java index a94fbc5..6f4c044 100644 --- a/src/com/isode/stroke/network/ProxiedConnection.java +++ b/src/com/isode/stroke/network/ProxiedConnection.java @@ -1,3 +1,3 @@ /* - * Copyright (c) 2012-2015 Isode Limited. + * Copyright (c) 2012-2016 Isode Limited. * All rights reserved. @@ -29,4 +29,4 @@ public abstract class ProxiedConnection extends Connection { private Connection connection_; - private SignalConnection onDataReadConnection; - private SignalConnection onDisconnectedConnection; + private SignalConnection onDataReadConnection_; + private SignalConnection onDisconnectedConnection_; private SignalConnection onConnectFinishedConnection; @@ -47,4 +47,4 @@ public abstract class ProxiedConnection extends Connection { if (connection_ != null) { - onDataReadConnection.disconnect(); - onDisconnectedConnection.disconnect(); + onDataReadConnection_.disconnect(); + onDisconnectedConnection_.disconnect(); } @@ -149,2 +149,18 @@ public abstract class ProxiedConnection extends Connection { } + + protected void reconnect() { + if (onDataReadConnection_ != null) { + onDataReadConnection_.disconnect(); + onDataReadConnection_ = null; + } + if (onDisconnectedConnection_ != null) { + onDisconnectedConnection_.disconnect(); + onDisconnectedConnection_ = null; + } + if (connected_) { + connection_.disconnect(); + } + connect(server_); + } + }
\ No newline at end of file |
Swift