You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
4.2 KiB
142 lines
4.2 KiB
package com.github.jreddit.oauth.client;
|
|
|
|
import java.io.IOException;
|
|
import java.io.UnsupportedEncodingException;
|
|
|
|
import org.apache.http.HttpRequest;
|
|
import org.apache.http.HttpResponse;
|
|
import org.apache.http.client.ClientProtocolException;
|
|
import org.apache.http.client.HttpClient;
|
|
import org.apache.http.client.methods.HttpGet;
|
|
import org.apache.http.client.methods.HttpPost;
|
|
import org.apache.http.client.methods.HttpUriRequest;
|
|
import org.apache.http.entity.StringEntity;
|
|
import org.apache.http.util.EntityUtils;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
import com.github.jreddit.oauth.RedditToken;
|
|
import com.github.jreddit.request.RedditGetRequest;
|
|
import com.github.jreddit.request.RedditPostRequest;
|
|
|
|
/**
|
|
* HTTP client implementation for a <i>RedditClient</i>.
|
|
*
|
|
* @author Simon Kassing
|
|
*
|
|
* @see RedditClient
|
|
*/
|
|
public class RedditHttpClient extends RedditClient {
|
|
|
|
private static final Logger LOGGER = LoggerFactory.getLogger(RedditHttpClient.class);
|
|
|
|
private final String userAgent;
|
|
|
|
private final HttpClient httpClient;
|
|
|
|
/**
|
|
* @param userAgent User agent of your application
|
|
* @param httpClient HTTP client to use for the requests
|
|
*/
|
|
public RedditHttpClient(String userAgent, HttpClient httpClient) {
|
|
this.userAgent = userAgent;
|
|
this.httpClient = httpClient;
|
|
}
|
|
|
|
@Override
|
|
public String post(RedditToken rToken, RedditPostRequest redditRequest) {
|
|
|
|
try {
|
|
|
|
// Create post request
|
|
HttpPost request = new HttpPost(OAUTH_API_DOMAIN + redditRequest.generateRedditURI());
|
|
|
|
// Add parameters to body
|
|
request.setEntity(new StringEntity(redditRequest.generateBody()));
|
|
|
|
// Add authorization
|
|
addAuthorization(request, rToken);
|
|
|
|
// Add user agent
|
|
addUserAgent(request);
|
|
|
|
// Add content type
|
|
request.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
|
|
|
|
return executeHttpRequest(request);
|
|
|
|
} catch (UnsupportedEncodingException uee) {
|
|
LOGGER.warn("Unsupported Encoding Exception thrown in POST request when encoding body", uee);
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
@Override
|
|
public String get(RedditToken rToken, RedditGetRequest redditRequest) {
|
|
|
|
// Create get request
|
|
HttpGet request = new HttpGet(OAUTH_API_DOMAIN + redditRequest.generateRedditURI());
|
|
|
|
// Add authorization
|
|
addAuthorization(request, rToken);
|
|
|
|
// Add user agent
|
|
addUserAgent(request);
|
|
|
|
return executeHttpRequest(request);
|
|
|
|
}
|
|
|
|
/**
|
|
* Execute the given HTTP request.
|
|
*
|
|
* @param request HTTP request
|
|
*
|
|
* @return Result, <i>null</i> if failed
|
|
*/
|
|
private String executeHttpRequest(HttpUriRequest request) {
|
|
try {
|
|
|
|
// Attempt to do execute request
|
|
HttpResponse response = httpClient.execute(request);
|
|
|
|
// Return response if successful
|
|
if (response != null) {
|
|
return EntityUtils.toString(response.getEntity(), "UTF-8");
|
|
}
|
|
|
|
} catch (UnsupportedEncodingException uee) {
|
|
LOGGER.warn("Unsupported Encoding Exception thrown in request", uee);
|
|
} catch (ClientProtocolException cpe) {
|
|
LOGGER.warn("Client Protocol Exception thrown in request", cpe);
|
|
} catch (IOException ioe) {
|
|
LOGGER.warn("I/O Exception thrown in request", ioe);
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
/**
|
|
* Add authorization to the HTTP request.
|
|
*
|
|
* @param request HTTP request
|
|
* @param rToken Reddit token (generally of the "bearer" type)
|
|
*/
|
|
private void addAuthorization(HttpRequest request, RedditToken rToken) {
|
|
request.addHeader("Authorization", rToken.getTokenType() + " " + rToken.getAccessToken());
|
|
}
|
|
|
|
/**
|
|
* Add user agent to the HTTP request.
|
|
*
|
|
* @param request HTTP request
|
|
*/
|
|
private void addUserAgent(HttpRequest request) {
|
|
request.addHeader("User-Agent", userAgent);
|
|
}
|
|
|
|
}
|