|  | @@ -27,6 +27,7 @@ import cStringIO
 | 
	
		
			
			| 27 | 27 |  import os
 | 
	
		
			
			| 28 | 28 |  
 | 
	
		
			
			| 29 | 29 |  from datetime import datetime, timedelta
 | 
	
		
			
			|  | 30 | +from requests import get as http_get
 | 
	
		
			
			| 30 | 31 |  from itertools import chain
 | 
	
		
			
			| 31 | 32 |  from flask import (
 | 
	
		
			
			| 32 | 33 |      Flask, request, render_template, url_for, Response, make_response,
 | 
	
	
		
			
			|  | @@ -39,7 +40,7 @@ from searx.engines import (
 | 
	
		
			
			| 39 | 40 |  )
 | 
	
		
			
			| 40 | 41 |  from searx.utils import (
 | 
	
		
			
			| 41 | 42 |      UnicodeWriter, highlight_content, html_to_text, get_themes,
 | 
	
		
			
			| 42 |  | -    get_static_files, get_result_templates
 | 
	
		
			
			|  | 43 | +    get_static_files, get_result_templates, gen_useragent
 | 
	
		
			
			| 43 | 44 |  )
 | 
	
		
			
			| 44 | 45 |  from searx.version import VERSION_STRING
 | 
	
		
			
			| 45 | 46 |  from searx.languages import language_codes
 | 
	
	
		
			
			|  | @@ -531,6 +532,40 @@ def preferences():
 | 
	
		
			
			| 531 | 532 |                    theme=get_current_theme_name())
 | 
	
		
			
			| 532 | 533 |  
 | 
	
		
			
			| 533 | 534 |  
 | 
	
		
			
			|  | 535 | +@app.route('/image_proxy', methods=['GET'])
 | 
	
		
			
			|  | 536 | +def image_proxy():
 | 
	
		
			
			|  | 537 | +    url = request.args.get('url')
 | 
	
		
			
			|  | 538 | +
 | 
	
		
			
			|  | 539 | +    if not url:
 | 
	
		
			
			|  | 540 | +        return '', 400
 | 
	
		
			
			|  | 541 | +
 | 
	
		
			
			|  | 542 | +    resp = http_get(url,
 | 
	
		
			
			|  | 543 | +                    stream=True,
 | 
	
		
			
			|  | 544 | +                    timeout=settings['server'].get('request_timeout', 2),
 | 
	
		
			
			|  | 545 | +                    headers={'User-Agent': gen_useragent()})
 | 
	
		
			
			|  | 546 | +
 | 
	
		
			
			|  | 547 | +    if resp.status_code != 200:
 | 
	
		
			
			|  | 548 | +        logger.debug('image-proxy: wrong response code: {0}'.format(resp.status_code))
 | 
	
		
			
			|  | 549 | +        if resp.status_code >= 400:
 | 
	
		
			
			|  | 550 | +            return '', resp.status_code
 | 
	
		
			
			|  | 551 | +        return '', 400
 | 
	
		
			
			|  | 552 | +
 | 
	
		
			
			|  | 553 | +    if not resp.headers.get('content-type', '').startswith('image/'):
 | 
	
		
			
			|  | 554 | +        logger.debug('image-proxy: wrong content-type: {0}'.format(resp.get('content-type')))
 | 
	
		
			
			|  | 555 | +        return '', 400
 | 
	
		
			
			|  | 556 | +
 | 
	
		
			
			|  | 557 | +    img = ''
 | 
	
		
			
			|  | 558 | +    chunk_counter = 0
 | 
	
		
			
			|  | 559 | +
 | 
	
		
			
			|  | 560 | +    for chunk in resp.iter_content(1024*1024):
 | 
	
		
			
			|  | 561 | +        chunk_counter += 1
 | 
	
		
			
			|  | 562 | +        if chunk_counter > 5:
 | 
	
		
			
			|  | 563 | +            return '', 502  # Bad gateway - file is too big (>5M)
 | 
	
		
			
			|  | 564 | +        img += chunk
 | 
	
		
			
			|  | 565 | +
 | 
	
		
			
			|  | 566 | +    return Response(img, mimetype=resp.headers['content-type'])
 | 
	
		
			
			|  | 567 | +
 | 
	
		
			
			|  | 568 | +
 | 
	
		
			
			| 534 | 569 |  @app.route('/stats', methods=['GET'])
 | 
	
		
			
			| 535 | 570 |  def stats():
 | 
	
		
			
			| 536 | 571 |      """Render engine statistics page."""
 |