HttpClient: Support for custom request content types.

This commit is contained in:
Andreas Schildbach 2015-09-01 00:07:47 +02:00
parent ccd0378be0
commit d6e03d7bc0
5 changed files with 90 additions and 80 deletions

View file

@ -269,13 +269,13 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
protected SuggestLocationsResult jsonStopfinderRequest(final Location constraint) throws IOException
{
final StringBuilder parameters = stopfinderRequestParameters(constraint, "JSON");
final StringBuilder uri = new StringBuilder(stopFinderEndpoint);
if (!httpPost)
uri.append(parameters);
final CharSequence page = httpClient.get(uri.toString(), httpPost ? parameters.substring(1) : null, Charsets.UTF_8);
final StringBuilder parameters = stopfinderRequestParameters(constraint, "JSON");
final CharSequence page;
if (httpPost)
page = httpClient.get(uri.toString(), parameters.substring(1), "application/x-www-form-urlencoded", Charsets.UTF_8);
else
page = httpClient.get(uri.append(parameters).toString(), Charsets.UTF_8);
final ResultHeader header = new ResultHeader(network, SERVER_PRODUCT);
try
@ -379,18 +379,18 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
protected SuggestLocationsResult xmlStopfinderRequest(final Location constraint) throws IOException
{
final StringBuilder parameters = stopfinderRequestParameters(constraint, "XML");
final StringBuilder uri = new StringBuilder(stopFinderEndpoint);
if (!httpPost)
uri.append(parameters);
final StringBuilder parameters = stopfinderRequestParameters(constraint, "XML");
InputStream is = null;
String firstChars = null;
try
{
is = httpClient.getInputStream(uri.toString(), httpPost ? parameters.substring(1) : null, null, httpReferer, null);
if (httpPost)
is = httpClient.getInputStream(uri.toString(), parameters.substring(1), "application/x-www-form-urlencoded", null, httpReferer);
else
is = httpClient.getInputStream(uri.append(parameters).toString(), null, httpReferer);
firstChars = HttpClient.peekFirstChars(is);
final XmlPullParser pp = parserFactory.newPullParser();
@ -426,18 +426,18 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
protected SuggestLocationsResult mobileStopfinderRequest(final Location constraint) throws IOException
{
final StringBuilder parameters = stopfinderRequestParameters(constraint, "XML");
final StringBuilder uri = new StringBuilder(stopFinderEndpoint);
if (!httpPost)
uri.append(parameters);
final StringBuilder parameters = stopfinderRequestParameters(constraint, "XML");
InputStream is = null;
String firstChars = null;
try
{
is = httpClient.getInputStream(uri.toString(), httpPost ? parameters.substring(1) : null, null, httpReferer, null);
if (httpPost)
is = httpClient.getInputStream(uri.toString(), parameters.substring(1), "application/x-www-form-urlencoded", null, httpReferer);
else
is = httpClient.getInputStream(uri.append(parameters).toString(), null, httpReferer);
firstChars = HttpClient.peekFirstChars(is);
final XmlPullParser pp = parserFactory.newPullParser();
@ -545,18 +545,18 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
protected NearbyLocationsResult xmlCoordRequest(final EnumSet<LocationType> types, final int lat, final int lon, final int maxDistance,
final int maxStations) throws IOException
{
final StringBuilder parameters = xmlCoordRequestParameters(types, lat, lon, maxDistance, maxStations);
final StringBuilder uri = new StringBuilder(coordEndpoint);
if (!httpPost)
uri.append(parameters);
final StringBuilder parameters = xmlCoordRequestParameters(types, lat, lon, maxDistance, maxStations);
InputStream is = null;
String firstChars = null;
try
{
is = httpClient.getInputStream(uri.toString(), httpPost ? parameters.substring(1) : null, null, httpReferer, null);
if (httpPost)
is = httpClient.getInputStream(uri.toString(), parameters.substring(1), "application/x-www-form-urlencoded", null, httpReferer);
else
is = httpClient.getInputStream(uri.append(parameters).toString(), null, httpReferer);
firstChars = HttpClient.peekFirstChars(is);
final XmlPullParser pp = parserFactory.newPullParser();
@ -624,18 +624,18 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
protected NearbyLocationsResult mobileCoordRequest(final EnumSet<LocationType> types, final int lat, final int lon, final int maxDistance,
final int maxStations) throws IOException
{
final StringBuilder parameters = xmlCoordRequestParameters(types, lat, lon, maxDistance, maxStations);
final StringBuilder uri = new StringBuilder(coordEndpoint);
if (!httpPost)
uri.append(parameters);
final StringBuilder parameters = xmlCoordRequestParameters(types, lat, lon, maxDistance, maxStations);
InputStream is = null;
String firstChars = null;
try
{
is = httpClient.getInputStream(uri.toString(), httpPost ? parameters.substring(1) : null, null, httpReferer, null);
if (httpPost)
is = httpClient.getInputStream(uri.toString(), parameters.substring(1), "application/x-www-form-urlencoded", null, httpReferer);
else
is = httpClient.getInputStream(uri.append(parameters).toString(), null, httpReferer);
firstChars = HttpClient.peekFirstChars(is);
final XmlPullParser pp = parserFactory.newPullParser();
@ -927,6 +927,7 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
private NearbyLocationsResult nearbyStationsRequest(final String stationId, final int maxLocations) throws IOException
{
final StringBuilder uri = new StringBuilder(departureMonitorEndpoint);
final StringBuilder parameters = new StringBuilder();
appendCommonRequestParams(parameters, "XML");
parameters.append("&type_dm=stop&name_dm=").append(normalizeStationId(stationId));
@ -938,16 +939,15 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
parameters.append("&useAllStops=1");
parameters.append("&mode=direct");
final StringBuilder uri = new StringBuilder(departureMonitorEndpoint);
if (!httpPost)
uri.append(parameters);
InputStream is = null;
String firstChars = null;
try
{
is = httpClient.getInputStream(uri.toString(), httpPost ? parameters.substring(1) : null, null, httpReferer, null);
if (httpPost)
is = httpClient.getInputStream(uri.toString(), parameters.substring(1), "application/x-www-form-urlencoded", null, httpReferer);
else
is = httpClient.getInputStream(uri.append(parameters).toString(), null, httpReferer);
firstChars = HttpClient.peekFirstChars(is);
final XmlPullParser pp = parserFactory.newPullParser();
@ -1501,18 +1501,18 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
private QueryDeparturesResult xsltDepartureMonitorRequest(final String stationId, final @Nullable Date time, final int maxDepartures,
final boolean equivs) throws IOException
{
final StringBuilder parameters = xsltDepartureMonitorRequestParameters(stationId, time, maxDepartures, equivs);
final StringBuilder uri = new StringBuilder(departureMonitorEndpoint);
if (!httpPost)
uri.append(parameters);
final StringBuilder parameters = xsltDepartureMonitorRequestParameters(stationId, time, maxDepartures, equivs);
InputStream is = null;
String firstChars = null;
try
{
is = httpClient.getInputStream(uri.toString(), httpPost ? parameters.substring(1) : null, null, httpReferer, null);
if (httpPost)
is = httpClient.getInputStream(uri.toString(), parameters.substring(1), "application/x-www-form-urlencoded", null, httpReferer);
else
is = httpClient.getInputStream(uri.append(parameters).toString(), null, httpReferer);
firstChars = HttpClient.peekFirstChars(is);
final XmlPullParser pp = parserFactory.newPullParser();
@ -1663,18 +1663,18 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
protected QueryDeparturesResult queryDeparturesMobile(final String stationId, final @Nullable Date time, final int maxDepartures,
final boolean equivs) throws IOException
{
final StringBuilder parameters = xsltDepartureMonitorRequestParameters(stationId, time, maxDepartures, equivs);
final StringBuilder uri = new StringBuilder(departureMonitorEndpoint);
if (!httpPost)
uri.append(parameters);
final StringBuilder parameters = xsltDepartureMonitorRequestParameters(stationId, time, maxDepartures, equivs);
InputStream is = null;
String firstChars = null;
try
{
is = httpClient.getInputStream(uri.toString(), httpPost ? parameters.substring(1) : null, null, httpReferer, null);
if (httpPost)
is = httpClient.getInputStream(uri.toString(), parameters.substring(1), "application/x-www-form-urlencoded", null, httpReferer);
else
is = httpClient.getInputStream(uri.append(parameters).toString(), null, httpReferer);
firstChars = HttpClient.peekFirstChars(is);
final XmlPullParser pp = parserFactory.newPullParser();
@ -2125,19 +2125,18 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
final @Nullable Set<Product> products, final @Nullable Optimize optimize, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, final @Nullable Set<Option> options) throws IOException
{
final String parameters = xsltTripRequestParameters(from, via, to, date, dep, products, optimize, walkSpeed, accessibility, options);
final StringBuilder uri = new StringBuilder(tripEndpoint);
if (!httpPost)
uri.append(parameters);
final String parameters = xsltTripRequestParameters(from, via, to, date, dep, products, optimize, walkSpeed, accessibility, options);
InputStream is = null;
String firstChars = null;
try
{
is = httpClient.getInputStream(uri.toString(), httpPost ? parameters.substring(1) : null, null, httpRefererTrip);
if (httpPost)
is = httpClient.getInputStream(uri.toString(), parameters.substring(1), "application/x-www-form-urlencoded", null, httpRefererTrip);
else
is = httpClient.getInputStream(uri.append(parameters).toString(), null, httpRefererTrip);
firstChars = HttpClient.peekFirstChars(is);
return queryTrips(uri.toString(), is);
@ -2161,19 +2160,18 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
final boolean dep, final @Nullable Collection<Product> products, final @Nullable Optimize optimize, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, final @Nullable Set<Option> options) throws IOException
{
final String parameters = xsltTripRequestParameters(from, via, to, date, dep, products, optimize, walkSpeed, accessibility, options);
final StringBuilder uri = new StringBuilder(tripEndpoint);
if (!httpPost)
uri.append(parameters);
final String parameters = xsltTripRequestParameters(from, via, to, date, dep, products, optimize, walkSpeed, accessibility, options);
InputStream is = null;
String firstChars = null;
try
{
is = httpClient.getInputStream(uri.toString(), httpPost ? parameters.substring(1) : null, null, httpRefererTrip);
if (httpPost)
is = httpClient.getInputStream(uri.toString(), parameters.substring(1), "application/x-www-form-urlencoded", null, httpRefererTrip);
else
is = httpClient.getInputStream(uri.append(parameters).toString(), null, httpRefererTrip);
firstChars = HttpClient.peekFirstChars(is);
return queryTripsMobile(uri.toString(), from, via, to, is);
@ -2205,7 +2203,7 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
try
{
is = httpClient.getInputStream(uri.toString(), null, null, httpRefererTrip);
is = httpClient.getInputStream(uri.toString(), null, httpRefererTrip);
firstChars = HttpClient.peekFirstChars(is);
return queryTrips(uri.toString(), is);
@ -2237,7 +2235,7 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
try
{
is = httpClient.getInputStream(uri.toString(), null, null, httpRefererTrip);
is = httpClient.getInputStream(uri.toString(), null, httpRefererTrip);
firstChars = HttpClient.peekFirstChars(is);
is.mark(512);

View file

@ -426,7 +426,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
protected final SuggestLocationsResult jsonGetStops(final String uri) throws IOException
{
final CharSequence page = httpClient.get(uri, null, jsonGetStopsEncoding);
final CharSequence page = httpClient.get(uri, jsonGetStopsEncoding);
final Matcher mJson = P_AJAX_GET_STOPS_JSON.matcher(page);
if (mJson.matches())
@ -942,7 +942,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
try
{
final String endpoint = extXmlEndpoint != null ? extXmlEndpoint : queryEndpoint;
final InputStream is = httpClient.getInputStream(endpoint, request, null, null);
final InputStream is = httpClient.getInputStream(endpoint, request, "application/xml", null, null);
firstChars = HttpClient.peekFirstChars(is);
reader = new InputStreamReader(is, Charsets.ISO_8859_1);
@ -2498,7 +2498,7 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
protected final NearbyLocationsResult jsonNearbyLocations(final String uri) throws IOException
{
final CharSequence page = httpClient.get(uri, null, jsonNearbyLocationsEncoding);
final CharSequence page = httpClient.get(uri, jsonNearbyLocationsEncoding);
try
{

View file

@ -208,7 +208,7 @@ public abstract class AbstractTsiProvider extends AbstractNetworkProvider
final StringBuilder uri = new StringBuilder(stopFinderEndpoint);
uri.append(parameters);
final CharSequence page = httpClient.get(uri.toString(), null, Charsets.UTF_8);
final CharSequence page = httpClient.get(uri.toString(), Charsets.UTF_8);
try
{
final List<SuggestedLocation> locations = new ArrayList<SuggestedLocation>();
@ -299,7 +299,7 @@ public abstract class AbstractTsiProvider extends AbstractNetworkProvider
final StringBuilder uri = new StringBuilder(stopFinderEndpoint);
uri.append(parameters);
final CharSequence page = httpClient.get(uri.toString(), null, Charsets.UTF_8);
final CharSequence page = httpClient.get(uri.toString(), Charsets.UTF_8);
try
{
final List<Location> stations = new ArrayList<Location>();
@ -344,7 +344,7 @@ public abstract class AbstractTsiProvider extends AbstractNetworkProvider
final StringBuilder uri = new StringBuilder(stopFinderEndpoint);
uri.append(parameters);
final CharSequence page = httpClient.get(uri.toString(), null, Charsets.UTF_8);
final CharSequence page = httpClient.get(uri.toString(), Charsets.UTF_8);
try
{
final JSONObject head = new JSONObject(page.toString());
@ -761,7 +761,7 @@ public abstract class AbstractTsiProvider extends AbstractNetworkProvider
final StringBuilder uri = new StringBuilder(tripEndpoint);
uri.append(parameters);
final CharSequence page = httpClient.get(uri.toString(), null, Charsets.UTF_8);
final CharSequence page = httpClient.get(uri.toString(), Charsets.UTF_8);
try
{
final JSONObject head = new JSONObject(page.toString());

View file

@ -392,7 +392,7 @@ public class VrsProvider extends AbstractNetworkProvider
uri.append("&s=").append(Math.min(16, maxLocations)); // artificial server limit
}
final CharSequence page = httpClient.get(uri.toString(), null, Charsets.UTF_8);
final CharSequence page = httpClient.get(uri.toString(), Charsets.UTF_8);
try
{
@ -456,7 +456,7 @@ public class VrsProvider extends AbstractNetworkProvider
uri.append("&t=");
appendDate(uri, time);
}
final CharSequence page = httpClient.get(uri.toString(), null, Charsets.UTF_8);
final CharSequence page = httpClient.get(uri.toString(), Charsets.UTF_8);
try
{
@ -554,7 +554,7 @@ public class VrsProvider extends AbstractNetworkProvider
final StringBuilder uri = new StringBuilder(API_BASE);
uri.append("?eID=tx_vrsinfo_his_info&i=").append(ParserUtils.urlEncode(stationId));
final CharSequence page = httpClient.get(uri.toString(), null, Charsets.UTF_8);
final CharSequence page = httpClient.get(uri.toString(), Charsets.UTF_8);
try
{
@ -623,7 +623,7 @@ public class VrsProvider extends AbstractNetworkProvider
final String uri = API_BASE + "?eID=tx_vrsinfo_ass2_objects&sc=" + sc + "&ac=" + ac + "&pc=" + ac + "&t=sap&q="
+ ParserUtils.urlEncode(new Location(LocationType.ANY, null, null, constraint.toString()).name);
final CharSequence page = httpClient.get(uri, null, Charsets.UTF_8);
final CharSequence page = httpClient.get(uri, Charsets.UTF_8);
try
{
@ -751,7 +751,7 @@ public class VrsProvider extends AbstractNetworkProvider
uri.append("p");
}
final CharSequence page = httpClient.get(uri.toString(), null, Charsets.UTF_8);
final CharSequence page = httpClient.get(uri.toString(), Charsets.UTF_8);
try
{

View file

@ -87,26 +87,33 @@ public final class HttpClient
public CharSequence get(final String url) throws IOException
{
return get(url, null);
return get(url, (String) null);
}
public CharSequence get(final String url, final String authorization) throws IOException
{
return get(url, null, null, authorization);
return get(url, null, null, null, authorization);
}
public CharSequence get(final String urlStr, final String postRequest, final Charset requestEncoding) throws IOException
public CharSequence get(final String urlStr, final Charset requestEncoding) throws IOException
{
return get(urlStr, postRequest, requestEncoding, null);
return get(urlStr, null, null, requestEncoding);
}
private CharSequence get(final String urlStr, final String postRequest, Charset requestEncoding, final String authorization) throws IOException
public CharSequence get(final String urlStr, final String postRequest, final String requestContentType, final Charset requestEncoding)
throws IOException
{
return get(urlStr, postRequest, requestContentType, requestEncoding, null);
}
private CharSequence get(final String urlStr, final String postRequest, final String requestContentType, Charset requestEncoding,
final String authorization) throws IOException
{
if (requestEncoding == null)
requestEncoding = Charsets.ISO_8859_1;
final StringBuilder buffer = new StringBuilder(SCRAPE_INITIAL_CAPACITY);
final InputStream is = getInputStream(urlStr, postRequest, requestEncoding, null, authorization);
final InputStream is = getInputStream(urlStr, postRequest, requestContentType, requestEncoding, null, authorization);
final Reader pageReader = new InputStreamReader(is, requestEncoding);
copy(pageReader, buffer);
pageReader.close();
@ -115,17 +122,22 @@ public final class HttpClient
public InputStream getInputStream(final String url) throws IOException
{
return getInputStream(url, null, null, null);
return getInputStream(url, null, null);
}
public InputStream getInputStream(final String urlStr, final String postRequest, final Charset requestEncoding, final String referer)
throws IOException
public InputStream getInputStream(final String urlStr, final Charset requestEncoding, final String referer) throws IOException
{
return getInputStream(urlStr, postRequest, requestEncoding, referer, null);
return getInputStream(urlStr, null, null, requestEncoding, referer);
}
public InputStream getInputStream(final String urlStr, final String postRequest, Charset requestEncoding, final String referer,
final String authorization) throws IOException
public InputStream getInputStream(final String urlStr, final String postRequest, final String requestContentType, final Charset requestEncoding,
final String referer) throws IOException
{
return getInputStream(urlStr, postRequest, requestContentType, requestEncoding, referer, null);
}
public InputStream getInputStream(final String urlStr, final String postRequest, final String requestContentType, Charset requestEncoding,
final String referer, final String authorization) throws IOException
{
log.debug("{}: {}", postRequest != null ? "POST" : "GET", urlStr);
@ -168,7 +180,7 @@ public final class HttpClient
final byte[] postRequestBytes = postRequest.getBytes(requestEncoding.name());
connection.setRequestMethod("POST");
connection.addRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.addRequestProperty("Content-Type", requestContentType);
connection.addRequestProperty("Content-Length", Integer.toString(postRequestBytes.length));
final OutputStream os = connection.getOutputStream();