/* * Copyright (c) 2019-2020. Developed by Hedgecode. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.hedgecode.chess.scanner.portal; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.List; import java.util.Map; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.hedgecode.chess.scanner.ChessHogScannerConstants; import org.hedgecode.chess.scanner.ChessHogScannerException; import org.hedgecode.chess.scanner.Scanner; import org.hedgecode.chess.scanner.regex.RegexMatcher; import org.hedgecode.chess.scanner.regex.RegexMatcherResult; import org.hedgecode.chess.scanner.regex.RegexResult; /** * AbstractRequestScanner * * @author Dmitry Samoshin aka gotty */ public abstract class AbstractRequestScanner implements Scanner { protected String request(String url) throws ChessHogScannerException { HttpGet request = new HttpGet(url); CloseableHttpResponse response = null; StringBuilder sb = new StringBuilder(); try { response = getClient().execute(request); try (BufferedReader br = new BufferedReader( new InputStreamReader( response.getEntity().getContent(), ChessHogScannerConstants.CHARSET ) )) { String line; while ((line = br.readLine()) != null) { sb.append( line ).append( ChessHogScannerConstants.CRLF ); } } } catch (IOException cause) { throw new ChessHogScannerException( String.format("Error occurred for requesting URL: %s", url), cause ); } finally { if (response != null) { try { response.close(); } catch (IOException ignored) {} } } return sb.toString(); } protected String matchRequest(String url, String match) throws ChessHogScannerException { List result = matchRequest(url, match, true); return result.isEmpty() ? null : result.get(0); } protected List matchRequest(String url, String match, boolean isFirst) throws ChessHogScannerException { RegexResult result = matchRequest( url, new RegexMatcherResult( match, isFirst, false ) ); return result.resultList(); } protected String matchRequest(String url, String startMatch, String endMatch) throws ChessHogScannerException { return matchRequest(url, startMatch, endMatch, true); } protected String matchRequest(String url, String startMatch, String endMatch, boolean isFirst) throws ChessHogScannerException { RegexResult result = matchRequest( url, new RegexMatcherResult( startMatch, endMatch, isFirst, false ) ); return result.isEmpty() ? null : result.resultList().get(0); } /* protected String matchRequest(String url, String match) throws ChessHogScannerException { List result = matchRequest(url, match, true); return result.isEmpty() ? null : result.get(0); } protected List matchRequest(String url, String match, boolean isFirst) throws ChessHogScannerException { HttpGet request = new HttpGet(url); CloseableHttpResponse response = null; List result = new ArrayList<>(); try { response = getClient().execute(request); Pattern pattern = Pattern.compile(match); try (BufferedReader br = new BufferedReader( new InputStreamReader( response.getEntity().getContent(), ChessHogScannerConstants.CHARSET ) )) { String line; while ((line = br.readLine()) != null) { Matcher matcher = pattern.matcher(line); if (matcher.find()) { result.add( matcher.group(1) ); if (isFirst) { break; } } } } } catch (IOException cause) { throw new ChessHogScannerException( String.format("Error occurred for requesting URL: %s", url), cause ); } finally { if (response != null) { try { response.close(); } catch (IOException ignored) {} } } return result; } protected String matchRequest(String url, String startMatch, String endMatch) throws ChessHogScannerException { return matchRequest(url, startMatch, endMatch, true); } protected String matchRequest(String url, String startMatch, String endMatch, boolean isFirst) throws ChessHogScannerException { HttpGet request = new HttpGet(url); CloseableHttpResponse response = null; StringBuilder sb = new StringBuilder(); try { response = getClient().execute(request); Pattern startPattern = Pattern.compile(startMatch); Pattern endPattern = Pattern.compile(endMatch); try (BufferedReader br = new BufferedReader( new InputStreamReader( response.getEntity().getContent(), ChessHogScannerConstants.CHARSET ) )) { String line; boolean isMatch = false; while ((line = br.readLine()) != null) { Matcher matcher = isMatch ? endPattern.matcher(line) : startPattern.matcher(line); if (matcher.find()) { sb.append(line); if (isMatch && isFirst) { break; } isMatch = !isMatch; } else { if (isMatch) { sb.append(line); } } } } } catch (IOException cause) { throw new ChessHogScannerException( String.format("Error occurred for requesting URL: %s", url), cause ); } finally { if (response != null) { try { response.close(); } catch (IOException ignored) {} } } return sb.length() > 0 ? sb.toString() : null; } */ protected RegexResult matchRequest(String url, RegexMatcher matcher) throws ChessHogScannerException { HttpGet request = new HttpGet(url); CloseableHttpResponse response = null; try { response = getClient().execute(request); try (BufferedReader br = new BufferedReader( new InputStreamReader( response.getEntity().getContent(), ChessHogScannerConstants.CHARSET ) )) { String line; while ((line = br.readLine()) != null) { matcher.match(line); if (matcher.isBreak()) { break; } } } } catch (IOException cause) { throw new ChessHogScannerException( String.format("Error occurred for requesting URL: %s", url), cause ); } finally { if (response != null) { try { response.close(); } catch (IOException ignored) {} } } return matcher.result(); } /* protected String urlEncode(String query) throws ChessHogScannerException { String encodeQuery; try { encodeQuery = URLEncoder.encode( query, ChessHogScannerConstants.CHARSET.name() ); } catch (UnsupportedEncodingException cause) { throw new ChessHogScannerException( String.format("Unsupported encoding: %s", ChessHogScannerConstants.CHARSET.name()), cause ); } return encodeQuery; } */ private CloseableHttpClient getClient() { return HttpClients.createMinimal(); } }