3030from random import randrange
3131from time import sleep
3232from datetime import datetime
33+ from future .builtins import bytes
3334
3435if sys .version_info [0 :2 ] == (2 , 6 ):
3536 import unittest2 as unittest
3637else :
3738 import unittest
3839
3940try :
40- from urllib2 import urlopen , Request
41+ # python2
42+ from urllib2 import urlopen , Request , HTTPError
4143except ImportError :
44+ # python3
4245 from urllib .request import Request , urlopen
46+ from urllib .error import HTTPError
4347
4448sys .path .append ('.' )
4549
@@ -399,9 +403,9 @@ def test_webhook(self):
399403 d .addTelegramMessageHandler (
400404 self .telegramHandlerTest )
401405
402- # Select random port for travis
403- port = randrange (1024 , 49152 )
404- self .updater .start_webhook ('127.0.0.1' , port ,
406+ ip = '127.0.0.1'
407+ port = randrange (1024 , 49152 ) # Select random port for travis
408+ self .updater .start_webhook (ip , port ,
405409 url_path = 'TOKEN' ,
406410 cert = './tests/test_updater.py' ,
407411 key = './tests/test_updater.py' )
@@ -417,34 +421,19 @@ def test_webhook(self):
417421 update = Update (1 )
418422 update .message = message
419423
420- try :
421- payload = bytes (update .to_json (), encoding = 'utf-8' )
422- except TypeError :
423- payload = bytes (update .to_json ())
424-
425- header = {
426- 'content-type' : 'application/json' ,
427- 'content-length' : str (len (payload ))
428- }
429-
430- r = Request ('http://127.0.0.1:%d/TOKEN' % port ,
431- data = payload ,
432- headers = header )
433-
434- urlopen (r )
424+ self ._send_webhook_msg (ip , port , update .to_json (), 'TOKEN' )
435425
436426 sleep (1 )
437427 self .assertEqual (self .received_message , 'Webhook Test' )
438428
439429 print ("Test other webhook server functionalities..." )
440- request = Request ('http://localhost:%d/webookhandler.py' % port )
441- response = urlopen (request )
430+ response = self ._send_webhook_msg (ip , port , None , 'webookhandler.py' )
442431 self .assertEqual (b'' , response .read ())
443432 self .assertEqual (200 , response .code )
444433
445- request .get_method = lambda : 'HEAD'
434+ response = self ._send_webhook_msg (ip , port , None , 'webookhandler.py' ,
435+ get_method = lambda : 'HEAD' )
446436
447- response = urlopen (request )
448437 self .assertEqual (b'' , response .read ())
449438 self .assertEqual (200 , response .code )
450439
@@ -460,9 +449,9 @@ def test_webhook_no_ssl(self):
460449 d .addTelegramMessageHandler (
461450 self .telegramHandlerTest )
462451
463- # Select random port for travis
464- port = randrange (1024 , 49152 )
465- self .updater .start_webhook ('127.0.0.1' , port )
452+ ip = '127.0.0.1'
453+ port = randrange (1024 , 49152 ) # Select random port for travis
454+ self .updater .start_webhook (ip , port )
466455 sleep (0.5 )
467456
468457 # Now, we send an update to the server via urlopen
@@ -473,23 +462,77 @@ def test_webhook_no_ssl(self):
473462 update = Update (1 )
474463 update .message = message
475464
476- try :
477- payload = bytes (update .to_json (), encoding = 'utf-8' )
478- except TypeError :
479- payload = bytes (update .to_json ())
465+ self ._send_webhook_msg (ip , port , update .to_json ())
466+ sleep (1 )
467+ self .assertEqual (self .received_message , 'Webhook Test 2' )
468+
469+ def test_webhook_invalid_posts (self ):
470+ self ._setup_updater ('' , messages = 0 )
471+
472+ ip = '127.0.0.1'
473+ port = randrange (1024 , 49152 ) # select random port for travis
474+ thr = Thread (target = self .updater ._start_webhook ,
475+ args = (ip , port , '' , None , None ))
476+ thr .start ()
480477
481- header = {
482- 'content-type' : 'application/json' ,
483- 'content-length' : str (len (payload ))
478+ sleep (0.5 )
479+
480+ try :
481+ with self .assertRaises (HTTPError ) as ctx :
482+ self ._send_webhook_msg (ip , port ,
483+ '<root><bla>data</bla></root>' ,
484+ content_type = 'application/xml' )
485+ self .assertEqual (ctx .exception .code , 403 )
486+
487+ with self .assertRaises (HTTPError ) as ctx :
488+ self ._send_webhook_msg (ip , port , 'dummy-payload' ,
489+ content_len = - 2 )
490+ self .assertEqual (ctx .exception .code , 403 )
491+
492+ # TODO: prevent urllib or the underlying from adding content-length
493+ # with self.assertRaises(HTTPError) as ctx:
494+ # self._send_webhook_msg(ip, port, 'dummy-payload',
495+ # content_len=None)
496+ # self.assertEqual(ctx.exception.code, 411)
497+
498+ with self .assertRaises (HTTPError ) as ctx :
499+ self ._send_webhook_msg (ip , port , 'dummy-payload' ,
500+ content_len = 'not-a-number' )
501+ self .assertEqual (ctx .exception .code , 403 )
502+
503+ finally :
504+ self .updater ._stop_httpd ()
505+ thr .join ()
506+
507+ def _send_webhook_msg (self , ip , port , payload_str , url_path = '' ,
508+ content_len = - 1 , content_type = 'application/json' ,
509+ get_method = None ):
510+ headers = {
511+ 'content-type' : content_type ,
484512 }
485513
486- r = Request ('http://127.0.0.1:%d/' % port ,
487- data = payload ,
488- headers = header )
514+ if not payload_str :
515+ content_len = None
516+ payload = None
517+ else :
518+ payload = bytes (payload_str , encoding = 'utf-8' )
519+
520+ if content_len == - 1 :
521+ content_len = len (payload )
489522
490- urlopen (r )
491- sleep (1 )
492- self .assertEqual (self .received_message , 'Webhook Test 2' )
523+ if content_len is not None :
524+ headers ['content-length' ] = str (content_len )
525+
526+ url = 'http://{ip}:{port}/{path}' .format (ip = ip , port = port ,
527+ path = url_path )
528+
529+ req = Request (url , data = payload , headers = headers )
530+
531+
532+ if get_method is not None :
533+ req .get_method = get_method
534+
535+ return urlopen (req )
493536
494537 def signalsender (self ):
495538 sleep (0.5 )
0 commit comments