Changeset 5adbf90


Ignore:
Timestamp:
Nov 27, 2015 6:23:06 PM (5 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
bafec180
Parents:
3a25a91
Message:

Forwarded raw datagrams will include a header line if HEADER=true
Add support for raw with headers to sink client

Location:
apps/sam/java/src/net/i2p/sam
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • apps/sam/java/src/net/i2p/sam/SAMv3RawSession.java

    r3a25a91 r5adbf90  
    1313import net.i2p.client.I2PSessionException;
    1414import net.i2p.data.DataFormatException;
     15import net.i2p.data.DataHelper;
    1516import net.i2p.util.Log;
    1617
     
    2526        private final SAMv3DatagramServer server;
    2627        private final SocketAddress clientAddress;
     28        private final boolean _sendHeader;
    2729
    2830        public String getNick() { return nick; }
     
    6769                        this.clientAddress = new InetSocketAddress(host, port);
    6870                }
     71                _sendHeader = ((handler.verMajor == 3 && handler.verMinor >= 2) || handler.verMajor > 3) &&
     72                              Boolean.parseBoolean(props.getProperty("HEADER"));
    6973        }
    7074       
     
    7377                        this.handler.receiveRawBytes(data, proto, fromPort, toPort);
    7478                } else {
    75                         ByteBuffer msgBuf = ByteBuffer.allocate(data.length);
     79                        ByteBuffer msgBuf;
     80                        if (_sendHeader) {
     81                                StringBuilder buf = new StringBuilder(64);
     82                                buf.append("PROTOCOL=").append(proto)
     83                                   .append(" FROM_PORT=").append(fromPort)
     84                                   .append(" TO_PORT=").append(toPort)
     85                                   .append('\n');
     86                                String msg = buf.toString();
     87                                msgBuf = ByteBuffer.allocate(msg.length()+data.length);
     88                                msgBuf.put(DataHelper.getASCII(msg));
     89                        } else {
     90                                msgBuf = ByteBuffer.allocate(data.length);
     91                        }
    7692                        msgBuf.put(data);
    7793                        msgBuf.flip();
  • apps/sam/java/src/net/i2p/sam/client/SAMStreamSink.java

    r3a25a91 r5adbf90  
    5050    private static I2PSSLSocketFactory _sslSocketFactory;
    5151   
    52     private static final int STREAM=0, DG=1, V1DG=2, RAW=3, V1RAW=4;
     52    private static final int STREAM=0, DG=1, V1DG=2, RAW=3, V1RAW=4, RAWHDR = 5;
    5353    private static final String USAGE = "Usage: SAMStreamSink [-s] [-m mode] [-v version] [-b samHost] [-p samPort] [-o opt=val] [-u user] [-w password] myDestFile sinkDir\n" +
    54                                         "       modes: stream: 0; datagram: 1; v1datagram: 2; raw: 3; v1raw: 4\n" +
     54                                        "       modes: stream: 0; datagram: 1; v1datagram: 2; raw: 3; v1raw: 4 raw-with-headers: 5\n" +
    5555                                        "       -s: use SSL\n" +
    5656                                        "       multiple -o session options are allowed";
     
    7676            case 'm':
    7777                mode = Integer.parseInt(g.getOptarg());
    78                 if (mode < 0 || mode > V1RAW) {
     78                if (mode < 0 || mode > RAWHDR) {
    7979                    System.err.println(USAGE);
    8080                    return;
     
    181181                if (_log.shouldLog(Log.DEBUG))
    182182                    _log.debug("Handshake2 complete.");
    183             } else if (_isV3 && (mode == DG || mode == RAW)) {
     183            } else if (_isV3 && (mode == DG || mode == RAW || mode == RAWHDR)) {
    184184                // set up a listening DatagramSocket
    185185                (new DGRcvr(mode)).start();
     
    208208                    byte[] data = p.getData();
    209209                    _log.info("Got datagram length " + len);
    210                     if (_mode == DG) {
     210                    if (_mode == DG || _mode == RAWHDR) {
    211211                        ByteArrayInputStream bais = new ByteArrayInputStream(data, off, len);
    212212                        String line = DataHelper.readLine(bais);
     
    215215                            continue;
    216216                        }
    217                         if (line.length() < 516) {
     217                        if (_mode == DG && line.length() < 516) {
    218218                            _log.error("DGRcvr line too short: \"" + line + '\n');
    219219                            continue;
    220220                        }
    221221                        String[] parts = line.split(" ");
    222                         String dest = parts[0];
    223                         _log.info("DG is from " + dest);
    224                         for (int i = 1; i < parts.length; i++) {
     222                        int i = 0;
     223                        if (_mode == DG) {
     224                            String dest = parts[0];
     225                            _log.info("DG is from " + dest);
     226                            i++;
     227                        }
     228                        for ( ; i < parts.length; i++) {
    225229                            _log.info("Parameter: " + parts[i]);
    226230                        }
     
    531535                else if (mode == V1RAW)
    532536                    style = "RAW";
     537                else if (mode == RAW)
     538                    style = "RAW PORT=" + V3DGPORT;
    533539                else
    534                     style = "RAW PORT=" + V3DGPORT;
     540                    style = "RAW HEADER=true PORT=" + V3DGPORT;
    535541                String req = "SESSION CREATE STYLE=" + style + " DESTINATION=" + dest + ' ' + _conOptions + ' ' + sopts + '\n';
    536542                samOut.write(req.getBytes());
Note: See TracChangeset for help on using the changeset viewer.