import os, sys
import random
import string
import socket
import time
import struct
import ssl
from threading import Thread


HOST = "172.16.19.215"
PORT = 4443

WS_HTTP = "GET /chat HTTP/1.1\r\nHost: server.example.com\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\nOrigin: http://example.com\r\nSec-WebSocket-Protocol: sip\r\nSec-WebSocket-Version: 13\r\n\r\n"


SIP2 = """INVITE sip:ba_user@conference SIP/2.0
Call-ID: {CID}
Session-Expires: 6000;refresher=uac
CSeq: 123 INVITE
Max-Forwards: 70
User-Agent: SIP.js/0.7.2
From: <sip:none.invalide>
Supported: outbound
Via: SIP/2.0/WSS 0h81ak6a76nl.invalid;branch=z9hG4bK1447546
Contact: <sip:none.invalide;transport=wss;ob>
Allow: ACK,CANCEL,BYE,OPTIONS,INFO,NOTIFY
To: <sip:ba_user@conference>
Content-Length: {SIZE}
Content-Type: application/sdp

v=0
o=- 5983451742484108846 2 IN IP4 192.168.56.151
s=-
c=IN IP4 192.168.56.151
t=0 0
m=audio 22076 RTP/AVP 0 100
a=rtp:23454 IN IP4 192.168.56.151
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000 
a=maxptime:20
"""

SIP2 = SIP2.replace("\n", "\r\n")
SIP2 = SIP2.replace("{SIZE}", str(len(SIP2[SIP2.find("\r\n\r\n")+4:])))
#print SIP2[SIP2.find("\r\n\r\n")+4:].replace("\r\n", "\\r\\n")
#print len(SIP2[SIP2.find("\r\n\r\n")+4:])
#print SIP2


def run():
  SIP = SIP2.replace("{CID}",''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(16)))
  #print "SIP", SIP
  WSF = struct.pack("!BBH", 129, 126, len(SIP))
  s = socket.create_connection((HOST, PORT))
  s = ssl.wrap_socket(s)
  s.setblocking(1)
  s.settimeout(5)
  #print "start"
  s.send(WS_HTTP)
  data = ""
  while True:
    data+=s.recv(1024)
    if data.find("\r\n\r\n") != -1:
      break

  s.send(WSF)
  s.send(SIP)

  time.sleep(1)
  while True:
    try:
      s.recv(1024)
    except ssl.SSLError as e:
      if e.message != "The read operation timed out":
        print e
      break
        
  print "Done"

for i in xrange(30):
  t = Thread(target=run)
  t.daemon = True
  t.start()
  time.sleep(1)

time.sleep(100)
