Changeset deec8471


Ignore:
Timestamp:
Feb 6, 2014 2:18:51 PM (6 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
9a01fdf
Parents:
0d02812
Message:
  • EepHead?, PartialEepGet?, SSLEepGet:
    • Convert to getopt (ticket #1173)
  • EepHead?, PartialEepGet?:
    • New option -c for clearnet (no proxy), same as -p:0
    • New option -o, same as EepGet?
    • Proxy option -p with host name arg only (no ':') now allowed
    • Add proxy auth support with -u and -x options (ticket #1173)
  • EepGet?:
    • Catch error in -h option
    • Cleanups
Location:
core/java/src/net/i2p/util
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • core/java/src/net/i2p/util/EepGet.java

    r0d02812 rdeec8471  
    9393    // following for proxy digest auth
    9494    // only created via addAuthorization()
    95     private AuthState _authState;
     95    protected AuthState _authState;
    9696
    9797    /** this will be replaced by the HTTP Proxy if we are using it */
     
    176176        String etag = null;
    177177        String saveAs = null;
    178         String url = null;
    179178        List<String> extra = null;
    180179        String username = null;
     
    234233
    235234                case 'h':
    236                     if (extra == null)
    237                         extra = new ArrayList<String>(2);
    238235                    String a = g.getOptarg();
    239                     String key = a.substring(0, a.indexOf('='));
    240                     String val = a.substring(a.indexOf('=')+1);
    241                     extra.add(key);
    242                     extra.add(val);
     236                    int eq = a.indexOf('=');
     237                    if (eq > 0) {
     238                        if (extra == null)
     239                            extra = new ArrayList<String>(2);
     240                        String key = a.substring(0, eq);
     241                        String val = a.substring(eq + 1);
     242                        extra.add(key);
     243                        extra.add(val);
     244                    } else {
     245                        error = true;
     246                    }
    243247                    break;
    244248
     
    263267        }
    264268
    265         int remaining = args.length - g.getOptind();
    266         if (error || remaining != 1) {
     269        if (error || args.length - g.getOptind() != 1) {
    267270            usage();
    268271            System.exit(1);
    269272        }
    270         url = args[g.getOptind()];
     273        String url = args[g.getOptind()];
    271274
    272275        if (saveAs == null)
     
    350353
    351354    private static void usage() {
    352         System.err.println("eepget [-p 127.0.0.1:4444] [-c] [-o outputFile]\n" +
     355        System.err.println("eepget [-p 127.0.0.1[:4444]] [-c] [-o outputFile]\n" +
    353356                           "       [-n #retries] (default 5)\n" +
    354357                           "       [-m markSize] (default 1024)\n" +
     
    698701                if (as.authSent)
    699702                    throw new IOException("Proxy authentication failed");  // ignore stale
    700                 if (as.authChallenge == null)
    701                     throw new IOException("Bad proxy auth response");
    702703                if (_log.shouldLog(Log.INFO)) _log.info("Adding auth");
    703704                // actually happens in getRequest()
     
    13801381     *  Only added if the request is going through a proxy.
    13811382     *  Must be called before fetch().
    1382      *  Not supported by EepHead.
    13831383     *
    13841384     *  @since 0.8.9
     
    14701470     *  @since 0.9.12
    14711471     */
    1472     private enum AUTH_MODE {NONE, BASIC, DIGEST, UNKNOWN}
     1472    protected enum AUTH_MODE {NONE, BASIC, DIGEST, UNKNOWN}
    14731473
    14741474    /**
     
    14801480     *  @since 0.9.12
    14811481     */
    1482     private class AuthState {
     1482    protected class AuthState {
    14831483        private final String username;
    14841484        private final String password;
     
    15181518                if (authMode == AUTH_MODE.NONE) {
    15191519                    authMode = AUTH_MODE.UNKNOWN;
    1520                     authChallenge = "";
     1520                    authChallenge = null;
    15211521                }
    15221522            }
     
    15341534
    15351535                case DIGEST:
     1536                    if (authChallenge == null)
     1537                        throw new IOException("Bad proxy auth response");
    15361538                    if (args == null)
    15371539                        args = parseAuthArgs(authChallenge);
  • core/java/src/net/i2p/util/EepHead.java

    r0d02812 rdeec8471  
    11package net.i2p.util;
    22
     3import java.io.BufferedInputStream;
     4import java.io.BufferedReader;
    35import java.io.ByteArrayOutputStream;
    46import java.io.IOException;
     7import java.io.InputStreamReader;
    58import java.io.OutputStream;
    69import java.net.URL;
     10
     11import gnu.getopt.Getopt;
    712
    813import net.i2p.I2PAppContext;
     
    5257        int numRetries = 0;
    5358        int inactivityTimeout = 60*1000;
    54         String url = null;
     59        String username = null;
     60        String password = null;
     61        boolean error = false;
     62        Getopt g = new Getopt("eephead", args, "p:cn:t:u:x:");
    5563        try {
    56             for (int i = 0; i < args.length; i++) {
    57                 if (args[i].equals("-p")) {
    58                     proxyHost = args[i+1].substring(0, args[i+1].indexOf(':'));
    59                     String port = args[i+1].substring(args[i+1].indexOf(':')+1);
    60                     proxyPort = Integer.parseInt(port);
    61                     i++;
    62                 } else if (args[i].equals("-n")) {
    63                     numRetries = Integer.parseInt(args[i+1]);
    64                     i++;
    65                 } else if (args[i].equals("-t")) {
    66                     inactivityTimeout = 1000 * Integer.parseInt(args[i+1]);
    67                     i++;
    68                 } else if (args[i].startsWith("-")) {
    69                     usage();
    70                     return;
    71                 } else {
    72                     url = args[i];
     64            int c;
     65            while ((c = g.getopt()) != -1) {
     66              switch (c) {
     67                case 'p':
     68                    String s = g.getOptarg();
     69                    int colon = s.indexOf(':');
     70                    if (colon >= 0) {
     71                        // Todo IPv6 [a:b:c]:4444
     72                        proxyHost = s.substring(0, colon);
     73                        String port = s.substring(colon + 1);
     74                        proxyPort = Integer.parseInt(port);
     75                    } else {
     76                        proxyHost = s;
     77                        // proxyPort remains default
     78                    }
     79                    break;
     80
     81                case 'c':
     82                    // no proxy, same as -p :0
     83                    proxyHost = "";
     84                    proxyPort = 0;
     85                    break;
     86
     87                case 'n':
     88                    numRetries = Integer.parseInt(g.getOptarg());
     89                    break;
     90
     91                case 't':
     92                    inactivityTimeout = 1000 * Integer.parseInt(g.getOptarg());
     93                    break;
     94
     95                case 'u':
     96                    username = g.getOptarg();
     97                    break;
     98
     99                case 'x':
     100                    password = g.getOptarg();
     101                    break;
     102
     103                case '?':
     104                case ':':
     105                default:
     106                    error = true;
     107                    break;
     108              }  // switch
     109            } // while
     110        } catch (Exception e) {
     111            e.printStackTrace();
     112            error = true;
     113        }
     114
     115        if (error || args.length - g.getOptind() != 1) {
     116            usage();
     117            System.exit(1);
     118        }
     119        String url = args[g.getOptind()];
     120       
     121        EepHead get = new EepHead(I2PAppContext.getGlobalContext(), proxyHost, proxyPort, numRetries, url);
     122        if (username != null) {
     123            if (password == null) {
     124                try {
     125                    BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
     126                    do {
     127                        System.err.print("Proxy password: ");
     128                        password = r.readLine();
     129                        if (password == null)
     130                            throw new IOException();
     131                        password = password.trim();
     132                    } while (password.length() <= 0);
     133                } catch (IOException ioe) {
     134                    System.exit(1);
    73135                }
    74136            }
    75         } catch (Exception e) {
    76             e.printStackTrace();
    77             usage();
    78             return;
    79         }
    80        
    81         if (url == null) {
    82             usage();
    83             return;
    84         }
    85 
    86         EepHead get = new EepHead(I2PAppContext.getGlobalContext(), proxyHost, proxyPort, numRetries, url);
     137            get.addAuthorization(username, password);
     138        }
    87139        if (get.fetch(45*1000, -1, inactivityTimeout)) {
    88140            System.err.println("Content-Type: " + get.getContentType());
     
    97149   
    98150    private static void usage() {
    99         System.err.println("EepHead [-p 127.0.0.1:4444] [-n #retries] [-t timeout] url");
     151        System.err.println("EepHead [-p 127.0.0.1[:4444]] [-c]\n" +
     152                           "        [-n #retries] (default 0)\n" +
     153                           "        [-t timeout]  (default 60 sec)\n" +
     154                           "        [-u username] [-x password] url\n" +
     155                           "        (use -c or -p :0 for no proxy)");
    100156    }
    101157   
     
    139195            //    throw new IOException("Redirected from an invalid URL");
    140196            //}
    141             _redirects++;
    142             if (_redirects > 5)
    143                 throw new IOException("Too many redirects: to " + _redirectLocation);
    144             if (_log.shouldLog(Log.INFO)) _log.info("Redirecting to " + _redirectLocation);
     197            AuthState as = _authState;
     198            if (_responseCode == 407) {
     199                if (!_shouldProxy)
     200                    throw new IOException("Proxy auth response from non-proxy");
     201                if (as == null)
     202                    throw new IOException("Proxy requires authentication");
     203                if (as.authSent)
     204                    throw new IOException("Proxy authentication failed");  // ignore stale
     205                if (_log.shouldLog(Log.INFO)) _log.info("Adding auth");
     206                // actually happens in getRequest()
     207            } else {
     208                _redirects++;
     209                if (_redirects > 5)
     210                    throw new IOException("Too many redirects: to " + _redirectLocation);
     211                if (_log.shouldLog(Log.INFO)) _log.info("Redirecting to " + _redirectLocation);
     212                if (as != null)
     213                    as.authSent = false;
     214            }
    145215
    146216            // reset some important variables, we don't want to save the values from the redirect
     
    213283        // This will be replaced if we are going through I2PTunnelHTTPClient
    214284        buf.append("User-Agent: " + USER_AGENT + "\r\n");
     285        if (_authState != null && _shouldProxy && _authState.authMode != AUTH_MODE.NONE) {
     286            buf.append("Proxy-Authorization: ");
     287            buf.append(_authState.getAuthHeader("HEAD", urlToSend));
     288            buf.append("\r\n");
     289        }
    215290        buf.append("Connection: close\r\n\r\n");
    216291        if (_log.shouldLog(Log.DEBUG))
  • core/java/src/net/i2p/util/PartialEepGet.java

    r0d02812 rdeec8471  
    11package net.i2p.util;
    22
     3import java.io.BufferedReader;
    34import java.io.FileOutputStream;
    45import java.io.IOException;
     6import java.io.InputStreamReader;
    57import java.io.OutputStream;
    68import java.net.MalformedURLException;
    79import java.net.URL;
    810import java.util.Locale;
     11
     12import gnu.getopt.Getopt;
    913
    1014import net.i2p.I2PAppContext;
     
    5155        // 40 sig + 16 version for .suds
    5256        long size = 56;
    53         String url = null;
     57        String saveAs = null;
     58        String username = null;
     59        String password = null;
     60        boolean error = false;
     61        Getopt g = new Getopt("partialeepget", args, "p:cl:o:u:x:");
    5462        try {
    55             for (int i = 0; i < args.length; i++) {
    56                 if (args[i].equals("-p")) {
    57                     proxyHost = args[i+1].substring(0, args[i+1].indexOf(':'));
    58                     String port = args[i+1].substring(args[i+1].indexOf(':')+1);
    59                     proxyPort = Integer.parseInt(port);
    60                     i++;
    61                 } else if (args[i].equals("-l")) {
    62                     size = Long.parseLong(args[i+1]);
    63                     i++;
    64                 } else if (args[i].startsWith("-")) {
    65                     usage();
    66                     return;
    67                 } else {
    68                     url = args[i];
    69                 }
    70             }
     63            int c;
     64            while ((c = g.getopt()) != -1) {
     65              switch (c) {
     66                case 'p':
     67                    String s = g.getOptarg();
     68                    int colon = s.indexOf(':');
     69                    if (colon >= 0) {
     70                        // Todo IPv6 [a:b:c]:4444
     71                        proxyHost = s.substring(0, colon);
     72                        String port = s.substring(colon + 1);
     73                        proxyPort = Integer.parseInt(port);
     74                    } else {
     75                        proxyHost = s;
     76                        // proxyPort remains default
     77                    }
     78                    break;
     79
     80                case 'c':
     81                    // no proxy, same as -p :0
     82                    proxyHost = "";
     83                    proxyPort = 0;
     84                    break;
     85
     86                case 'l':
     87                    size = Long.parseLong(g.getOptarg());
     88                    break;
     89
     90                case 'o':
     91                    saveAs = g.getOptarg();
     92                    break;
     93
     94                case 'u':
     95                    username = g.getOptarg();
     96                    break;
     97
     98                case 'x':
     99                    password = g.getOptarg();
     100                    break;
     101
     102                case '?':
     103                case ':':
     104                default:
     105                    error = true;
     106                    break;
     107              }  // switch
     108            } // while
    71109        } catch (Exception e) {
    72110            e.printStackTrace();
     111            error = true;
     112        }
     113
     114        if (error || args.length - g.getOptind() != 1) {
    73115            usage();
    74             return;
    75         }
    76        
    77         if (url == null) {
    78             usage();
    79             return;
    80         }
    81 
    82         String saveAs = suggestName(url);
     116            System.exit(1);
     117        }
     118        String url = args[g.getOptind()];
     119
     120        if (saveAs == null)
     121            saveAs = suggestName(url);
    83122        OutputStream out;
    84123        try {
     
    87126        } catch (IOException ioe) {
    88127            System.err.println("Failed to create output file " + saveAs);
    89             return;
     128            out = null; // dummy for compiler
     129            System.exit(1);
    90130        }
    91131
    92132        EepGet get = new PartialEepGet(I2PAppContext.getGlobalContext(), proxyHost, proxyPort, out, url, size);
     133        if (username != null) {
     134            if (password == null) {
     135                try {
     136                    BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
     137                    do {
     138                        System.err.print("Proxy password: ");
     139                        password = r.readLine();
     140                        if (password == null)
     141                            throw new IOException();
     142                        password = password.trim();
     143                    } while (password.length() <= 0);
     144                } catch (IOException ioe) {
     145                    System.exit(1);
     146                }
     147            }
     148            get.addAuthorization(username, password);
     149        }
    93150        get.addStatusListener(get.new CLIStatusListener(1024, 40));
    94151        if (get.fetch(45*1000, -1, 60*1000)) {
     
    102159   
    103160    private static void usage() {
    104         System.err.println("PartialEepGet [-p 127.0.0.1:4444] [-l #bytes] url\n" +
    105                            "              (use -p :0 for no proxy)");
     161        System.err.println("PartialEepGet [-p 127.0.0.1[:4444]] [-c] [-o outputFile]\n" +
     162                           "              [-l #bytes] (default 56)\n" +
     163                           "              [-u username] [-x password] url\n" +
     164                           "              (use -c or -p :0 for no proxy)");
    106165    }
    107166   
     
    159218        if(!uaOverridden)
    160219            buf.append("User-Agent: " + USER_AGENT + "\r\n");
     220        if (_authState != null && _shouldProxy && _authState.authMode != AUTH_MODE.NONE) {
     221            buf.append("Proxy-Authorization: ");
     222            buf.append(_authState.getAuthHeader("GET", urlToSend));
     223            buf.append("\r\n");
     224        }
    161225        buf.append("\r\n");
    162226
  • core/java/src/net/i2p/util/SSLEepGet.java

    r0d02812 rdeec8471  
    5959import javax.net.ssl.X509TrustManager;
    6060
     61import gnu.getopt.Getopt;
     62
    6163import net.i2p.I2PAppContext;
    6264import net.i2p.crypto.CertUtil;
     
    148150     */
    149151    public static void main(String args[]) {
    150         String url = null;
    151152        boolean saveCerts = false;
     153        boolean error = false;
     154        Getopt g = new Getopt("ssleepget", args, "s");
    152155        try {
    153             for (int i = 0; i < args.length; i++) {
    154                 if (args[i].equals("-s")) {
     156            int c;
     157            while ((c = g.getopt()) != -1) {
     158              switch (c) {
     159                case 's':
    155160                    saveCerts = true;
    156                 } else if (args[i].startsWith("-")) {
    157                     usage();
    158                     return;
    159                 } else {
    160                     url = args[i];
    161                 }
    162             }
     161                    break;
     162
     163                case '?':
     164                case ':':
     165                default:
     166                    error = true;
     167                    break;
     168              }  // switch
     169            } // while
    163170        } catch (Exception e) {
    164171            e.printStackTrace();
     172            error = true;
     173        }
     174
     175        if (error || args.length - g.getOptind() != 1) {
    165176            usage();
    166             return;
    167         }
    168        
    169         if (url == null) {
    170             usage();
    171             return;
    172         }
     177            System.exit(1);
     178        }
     179        String url = args[g.getOptind()];
    173180
    174181        String saveAs = suggestName(url);
     
    192199   
    193200    private static void usage() {
    194         System.err.println("Usage: SSLEepGet https://url");
    195         System.err.println("To save unknown certs, use: SSLEepGet -s https://url");
     201        System.err.println("Usage: SSLEepGet https://url\n" +
     202                           "To save unknown certs, use: SSLEepGet -s https://url");
    196203    }
    197204
Note: See TracChangeset for help on using the changeset viewer.