package com.mindprod.http;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
/**
* simulates a browser posting a form to CGI via HEAD/GET.
* <p/>
* It does not read any data. It is used for link checking where the server might ignore HEAD requests.
*
* @author Roedy Green, Canadian Mind Products
* @version 2.4 2012-02-26 Probe send now has supportsHEAD parm and their is a getSupportsHEAD parm.
* @since 1998
*/
@SuppressWarnings( { "WeakerAccess" } )
public final class Probe extends Http
{
/**
* 0=site did not support HEAD 1=site supports HEAD 2=don't know.
*/
int supportsHEAD;
/**
* constructor
*/
public Probe()
{
}
/**
* Did last HEAD probe work?
*
* @return 0=site does not support HEAD 1=site supports HEAD 2=don't know because both HEAD and GET probes failed.
*/
public int getSupportsHEAD()
{
return supportsHEAD;
}
/**
* Check if a URL is working. Does a HEAD probe, if that fails does a GET probe in case server is ignoring HEAD
* requests.
* We don't pay any attention to the content.
*
* @param url complete URL including get parm, http: or https:
* @param supportsHEAD 0=site does not support HEAD 1=site supports HEAD 2=don't know.
* enables bypassing HEAD or GET request for speed.
* In other wards: 0=use GET 1=use HEAD 2=use HEAD then GET.
*
* @return responseCode
*/
@SuppressWarnings( { "UnusedAssignment", "MethodNamesDifferingOnlyByCase" } )
public int send( URL url, int supportsHEAD )
{
this.supportsHEAD = 2;
try
{
init();
this.url = url;
HttpURLConnection urlc;
if ( supportsHEAD == 1 || supportsHEAD == 2 )
{
urlc = ( HttpURLConnection ) url.openConnection();
urlc.setAllowUserInteraction( false );
urlc.setDoInput( true );
urlc.setDoOutput( false );// nothing beyond original request
urlc.setUseCaches( false );
urlc.setRequestMethod( "HEAD" );
setStandardProperties( urlc );
urlc.connect();
responseCode = urlc.getResponseCode();
rawResponseMessage = urlc.getResponseMessage();
urlc.disconnect();
if ( responseCode == HttpURLConnection.HTTP_OK )
{
this.supportsHEAD = 1;
return responseCode;
}
}
if ( supportsHEAD == 0 || supportsHEAD == 2 )
{
urlc = ( HttpURLConnection ) url.openConnection();
urlc.setAllowUserInteraction( false );
urlc.setDoInput( true );
urlc.setDoOutput( false );// nothing beyond original request
urlc.setUseCaches( false );
urlc.setRequestMethod( "GET" );
setStandardProperties( urlc );
urlc.connect();
responseCode = urlc.getResponseCode();
rawResponseMessage = urlc.getResponseMessage();
final InputStream is = urlc.getInputStream();
is.close();
urlc.disconnect();
if ( responseCode == HttpURLConnection.HTTP_OK )
{
this.supportsHEAD = 0;
}
return responseCode;
}
}
catch ( ClassCastException e )
{
interruptResponseMessage = "Bug : not http/https : " + e.getMessage();
return responseCode;
}
catch ( IOException e )
{
interruptResponseMessage = e.getClass().getName() + " : " + e.getMessage();
return responseCode;
}
return responseCode;
}
/**
* Send a form full of data to the CGI host using HEAD/GET.
* Must do a setParms beforehand. Lets you know if page exists.
*
* @param host host name of the website, Should be form:"mindprod.com", no lead http://.
* @param port -1 if default, 8081 for local echoserver.
* @param action action of form, page on website. Usually has a lead /.
* @param supportsHEAD 0=site does not support HEAD 1=site supports HEAD 2=don't know.
* enables bypassing HEAD or GET request for speed.
* In other wards: 0=use GET 1=use HEAD 2=use HEAD then GET.
*
* @return responseCode
*/
@SuppressWarnings( { "UnusedAssignment", "MethodNamesDifferingOnlyByCase" } )
public int send( String host, int port, String action, int supportsHEAD )
{
try
{
init();
URL url = new URI( "http",
null,
host,
port,
action,
null,
null ).toURL();
url = new URL( url.toString() + getEncodedParms( Probe.UTF8 ) );
return send( url, supportsHEAD );
}
catch ( URISyntaxException e )
{
return responseCode;
}
catch ( IOException e )
{
return responseCode;
}
}
}