(view source code of wgetlite.cs as plain text)
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Threading;
namespace RobvanderWoude
{
class WGetLite
{
static string progver = "1.01";
private static ManualResetEvent allDone = new ManualResetEvent( false );
static int Main( string[] args )
{
string url = string.Empty;
string enc = "ASCII";
string outputFile = string.Empty;
int statusCode = 0;
bool save = false;
bool overwrite = false;
bool show = true;
#region Command Line Parsing
// Custom error message
string msgInvalid = "Invalid command line argument" + ( ( args.Length == 1 ) ? string.Empty : "(s)" );
// No command line arguments? Display help
if ( args.Length == 0 )
{
return ShowHelp( string.Empty );
}
foreach ( string arg in args )
{
// Check switches first
switch ( arg.ToLower( ).Substring( 0, 2 ) )
{
case "/?":
case "-?":
case "/h":
case "-h":
// Display help
return ShowHelp( string.Empty );
case "--":
if ( arg.ToLower( ) == "--help" )
{
// Display help
return ShowHelp( string.Empty );
}
else
{
// Display error message
return ShowHelp( msgInvalid );
}
case "/e":
if ( arg.ToLower( ).StartsWith( "/e:" ) || arg.ToLower( ).StartsWith( "/encoding:" ) )
{
enc = arg.Substring( arg.IndexOf( ":" ) + 1 );
}
else
{
return ShowHelp( msgInvalid );
}
break;
case "/o":
overwrite = true;
break;
case "/r":
show = false;
break;
case "/s":
show = false;
save = true;
if ( arg.ToLower( ).StartsWith( "/s:" ) || arg.ToLower( ).StartsWith( "/save:" ) )
{
outputFile = arg.Substring( arg.IndexOf( ":" ) + 1 );
}
else
{
return ShowHelp( msgInvalid );
}
break;
default:
url = arg;
break;
}
}
if ( string.IsNullOrEmpty( url ) )
{
return ShowHelp( "A URL must be specified" );
}
if ( overwrite && !save )
{
return ShowHelp( "/Overwrite requires /Save." );
}
if ( save )
{
if ( File.Exists( @outputFile ) )
{
if ( !overwrite )
{
return ShowHelp( "File already exists." );
}
}
}
#endregion Command Line Parsing
try
{
statusCode = (int) GetResponse( url );
if ( save )
{
using ( StreamWriter outputStream = new StreamWriter( @outputFile ) )
{
if ( overwrite )
{
outputStream.Flush( );
}
outputStream.Write( Get( url, enc ) );
outputStream.Close( );
}
}
else if ( show )
{
Console.Write( Get( url, enc ) );
}
return ( statusCode == 200 ? 0 : statusCode );
}
catch ( Exception e )
{
return ShowHelp( e.Message );
}
}
public static HttpStatusCode GetResponse( string url )
{
// Returns the HTTP Status Code for the specified URL, or 0 on errors
try
{
HttpWebRequest req = (HttpWebRequest) WebRequest.Create( url );
req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1";
req.AllowAutoRedirect = false;
HttpWebResponse resp = (HttpWebResponse) req.GetResponse( );
HttpStatusCode stat = resp.StatusCode;
req.Abort( );
return stat;
}
catch ( WebException e )
{
// Handle exceptions caused by the server response, e.g. 404
try
{
HttpWebResponse httpResponse = (HttpWebResponse) e.Response;
return httpResponse.StatusCode;
}
// Handle the "real" exceptions
catch
{
ShowHelp( e.Message );
return 0;
}
}
catch ( Exception e )
{
ShowHelp( e.Message );
return 0;
}
}
// Get( ) based on blog post by Sugree Phatanapherom
// http://www.howforge.com/how-to-implement-simple-wget-in-c
private static string Get( string url, string encoding )
{
try
{
// The next couple of ServicePointManager lines are required for secure connections only
System.Net.ServicePointManager.Expect100Continue = true;
System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Tls12;
System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Ssl3;
WebClient webClient = new WebClient( );
byte[] response = webClient.DownloadData( url );
switch ( encoding.ToUpper( ) )
{
case "A":
case "ANSI":
case "ASCII":
return Encoding.ASCII.GetString( response );
case "U":
case "ULE":
case "UNICODE":
case "UNICODELE":
case "UNICODE LE":
case "UNICODE (LE)":
return Encoding.Unicode.GetString( response );
case "UB":
case "UBE":
case "UNICODEBE":
case "UNICODE BE":
case "UNICODE (BE)":
return Encoding.BigEndianUnicode.GetString( response );
case "U7":
case "UTF7":
case "UTF-7":
return Encoding.UTF7.GetString( response );
case "U8":
case "UTF8":
case "UTF-8":
return Encoding.UTF8.GetString( response );
case "U32":
case "UTF32":
case "UTF-32":
return Encoding.UTF32.GetString( response );
default:
ShowHelp( "Invalid encoding" );
return string.Empty;
}
}
catch ( Exception e )
{
ShowHelp( e.Message );
return string.Empty;
}
}
#region Error Handling
public static int ShowHelp( Exception e )
{
return ShowHelp( e == null ? null : e.Message );
}
public static int ShowHelp( string errorMessage )
{
/*
WGetLite, Version 1.01
Get web content (text only)
Usage: WGETLITE url [ /Response | /Save:filename ] [ /Encoding:encoding ]
Where: /Response returns server response code only
/Save saves downloaded content to specified file
/Encoding specifies encoding of url; accepted values are:
ANSI, Unicode, Unicode (BE), UTF-7, UTF-8, UTF-32
Notes: On errors the actual HTTP response code is returned as 'errorlevel'.
Usually specifying the encoding won't be necessary.
Switches may be abbreviated, e.g. /E:U8 instead of /Encoding:UTF-8.
Based on a blog post by Sugree Phatanapherom:
http://www.howforge.com/how-to-implement-simple-wget-in-c
Written by Rob van der Woude
https://www.robvanderwoude.com
*/
if ( string.IsNullOrEmpty( errorMessage ) == false )
{
Console.Error.WriteLine( );
Console.ForegroundColor = ConsoleColor.Red;
Console.Error.Write( "ERROR: " );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.WriteLine( errorMessage );
Console.ResetColor( );
}
Console.Error.WriteLine( );
Console.Error.WriteLine( "WGetLite, Version {0}", progver );
Console.Error.WriteLine( "Get web content (text only)" );
Console.Error.WriteLine( );
Console.Error.Write( "Usage: " );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.WriteLine( "WGETLITE url [ /Response | /Save:filename ] [ /Encoding:encoding ]" );
Console.ResetColor( );
Console.Error.WriteLine( );
Console.Error.Write( "Where: " );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( "/R" );
Console.ResetColor( );
Console.Error.WriteLine( "esponse returns server response code only" );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( " /S" );
Console.ResetColor( );
Console.Error.WriteLine( "ave saves downloaded content to specified file" );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( " /E" );
Console.ResetColor( );
Console.Error.WriteLine( "ncoding specifies encoding of url; accepted values are:" );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( " A" );
Console.ResetColor( );
Console.Error.Write( "SCII, " );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( "U" );
Console.ResetColor( );
Console.Error.Write( "nicode, " );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( "U" );
Console.ResetColor( );
Console.Error.Write( "nicode (" );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( "BE" );
Console.ResetColor( );
Console.Error.Write( "), " );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( "U" );
Console.ResetColor( );
Console.Error.Write( "TF-" );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( "7" );
Console.ResetColor( );
Console.Error.Write( ", " );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( "U" );
Console.ResetColor( );
Console.Error.Write( "TF-" );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( "8" );
Console.ResetColor( );
Console.Error.Write( ", " );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( "U" );
Console.ResetColor( );
Console.Error.Write( "TF-" );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.WriteLine( "32" );
Console.ResetColor( );
Console.Error.WriteLine( );
Console.Error.WriteLine( "Notes: On errors the actual HTTP response code is returned as 'errorlevel'." );
Console.Error.WriteLine( " Usually specifying the encoding won't be necessary." );
Console.Error.Write( " Switches may be abbreviated, e.g. " );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( "/E" );
Console.ResetColor( );
Console.Error.Write( ":" );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( "U8" );
Console.ResetColor( );
Console.Error.Write( " instead of " );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( "/E" );
Console.ResetColor( );
Console.Error.Write( "ncoding:" );
Console.ForegroundColor = ConsoleColor.White;
Console.Error.Write( "UTF-8" );
Console.Error.WriteLine( "." );
Console.ResetColor( );
Console.Error.WriteLine( " Based on a blog post by Sugree Phatanapherom:" );
Console.ForegroundColor = ConsoleColor.DarkGray;
Console.Error.WriteLine( " http://www.howforge.com/how-to-implement-simple-wget-in-c" );
Console.ResetColor( );
Console.Error.WriteLine( );
Console.Error.WriteLine( "Written by Rob van der Woude" );
Console.Error.WriteLine( "https://www.robvanderwoude.com" );
return 1;
}
#endregion Error Handling
}
}
page last modified: 2024-04-16; loaded in 0.0071 seconds