Changeset f778c23f


Ignore:
Timestamp:
Nov 30, 2015 9:57:55 PM (5 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
dfbbe3e
Parents:
3c8cc16
Message:

SAM: Timeout for first command after HELLO
Better removal of command and opcode from properties
Send error message if no NAME key in LOOKUP

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

Legend:

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

    r3c8cc16 rf778c23f  
    6363        // Message format: HELLO VERSION [MIN=v1] [MAX=v2]
    6464        Properties props = SAMUtils.parseParams(line);
    65         if (!"HELLO".equals(props.getProperty(SAMUtils.COMMAND)) ||
    66             !"VERSION".equals(props.getProperty(SAMUtils.OPCODE))) {
     65        if (!"HELLO".equals(props.remove(SAMUtils.COMMAND)) ||
     66            !"VERSION".equals(props.remove(SAMUtils.OPCODE))) {
    6767            throw new SAMException("Must start with HELLO VERSION");
    6868        }
    69         props.remove(SAMUtils.COMMAND);
    70         props.remove(SAMUtils.OPCODE);
    7169
    7270        String minVer = props.getProperty("MIN");
  • apps/sam/java/src/net/i2p/sam/SAMv1Handler.java

    r3c8cc16 rf778c23f  
    1616import java.net.ConnectException;
    1717import java.net.NoRouteToHostException;
     18import java.net.Socket;
     19import java.net.SocketTimeoutException;
    1820import java.nio.channels.SocketChannel;
    1921import java.nio.ByteBuffer;
     
    4951    protected final long _id;
    5052    private static final AtomicLong __id = new AtomicLong();
     53    private static final int FIRST_READ_TIMEOUT = 60*1000;
    5154   
    5255    /**
     
    106109
    107110        try {
     111            boolean gotFirstLine = false;
    108112            while (true) {
    109113                if (shouldStop()) {
     
    123127                }
    124128                buf.setLength(0);
    125                 // TODO set timeout first time
    126                 ReadLine.readLine(clientSocketChannel.socket(), buf, 0);
     129                // first time, set a timeout
     130                try {
     131                    Socket sock = clientSocketChannel.socket();
     132                    ReadLine.readLine(sock, buf, gotFirstLine ? 0 : FIRST_READ_TIMEOUT);
     133                    sock.setSoTimeout(0);
     134                } catch (SocketTimeoutException ste) {
     135                    writeString("SESSION STATUS RESULT=I2P_ERROR MESSAGE=\"command timeout, bye\"\n");
     136                    break;
     137                }
    127138                msg = buf.toString();
    128139
     
    131142                }
    132143                props = SAMUtils.parseParams(msg);
    133                 domain = props.getProperty(SAMUtils.COMMAND);
     144                domain = (String) props.remove(SAMUtils.COMMAND);
    134145                if (domain == null) {
    135146                    if (_log.shouldLog(Log.DEBUG))
     
    137148                    continue;
    138149                }
    139                 opcode = props.getProperty(SAMUtils.OPCODE);
     150                opcode = (String) props.remove(SAMUtils.OPCODE);
    140151                if (opcode == null) {
    141152                    if (_log.shouldLog(Log.DEBUG))
     
    143154                    break;
    144155                }
    145                 props.remove(SAMUtils.COMMAND);
    146                 props.remove(SAMUtils.OPCODE);
    147156                if (_log.shouldLog(Log.DEBUG)) {
    148157                    _log.debug("Parsing (domain: \"" + domain
    149158                               + "\"; opcode: \"" + opcode + "\")");
    150159                }
    151 
     160                gotFirstLine = true;
    152161                if (domain.equals("STREAM")) {
    153162                    canContinue = execStreamMessage(opcode, props);
     
    361370  protected boolean execNamingMessage(String opcode, Properties props) {
    362371        if (opcode.equals("LOOKUP")) {
    363             if (props.isEmpty()) {
    364                 _log.debug("No parameters specified in NAMING LOOKUP message");
    365                 return false;
    366             }
    367            
    368372            String name = props.getProperty("NAME");
    369373            if (name == null) {
    370374                if (_log.shouldLog(Log.DEBUG))
    371375                    _log.debug("Name to resolve not specified in NAMING message");
    372                 return false;
     376                return writeString("NAMING REPLY RESULT=KEY_NOT_FOUND NAME=\"\" MESSAGE=\"Must specify NAME\"\n");
    373377            }
    374378
  • apps/sam/java/src/net/i2p/sam/SAMv3Handler.java

    r3c8cc16 rf778c23f  
    5555        private final boolean sendPorts;
    5656        private long _lastPing;
     57        private static final int FIRST_READ_TIMEOUT = 60*1000;
    5758        private static final int READ_TIMEOUT = 3*60*1000;
    5859       
     
    273274
    274275                        StringBuilder buf = new StringBuilder(1024);
     276                        boolean gotFirstLine = false;
    275277                        while (true) {
    276278                                if (shouldStop()) {
     
    330332                                } else {
    331333                                        buf.setLength(0);                                       
    332                                         // TODO first time, set a timeout
    333                                         ReadLine.readLine(socket, buf, 0);
     334                                        // first time, set a timeout
     335                                        try {
     336                                                ReadLine.readLine(socket, buf, gotFirstLine ? 0 : FIRST_READ_TIMEOUT);
     337                                                socket.setSoTimeout(0);
     338                                        } catch (SocketTimeoutException ste) {
     339                                                writeString("SESSION STATUS RESULT=I2P_ERROR MESSAGE=\"command timeout, bye\"\n");
     340                                                break;
     341                                        }
    334342                                        line = buf.toString();
    335343                                }
     
    338346                                        _log.debug("New message received: [" + line + ']');
    339347                                props = SAMUtils.parseParams(line);
    340                                 domain = props.getProperty(SAMUtils.COMMAND);
     348                                domain = (String) props.remove(SAMUtils.COMMAND);
    341349                                if (domain == null) {
    342350                                        if (_log.shouldLog(Log.DEBUG))
     
    344352                                        continue;
    345353                                }
    346                                 opcode = props.getProperty(SAMUtils.OPCODE);
    347                                 props.remove(SAMUtils.COMMAND);
    348                                 props.remove(SAMUtils.OPCODE);
     354                                gotFirstLine = true;
     355                                opcode = (String) props.remove(SAMUtils.OPCODE);
    349356                                if (_log.shouldLog(Log.DEBUG)) {
    350357                                        _log.debug("Parsing (domain: \"" + domain
Note: See TracChangeset for help on using the changeset viewer.