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: 974
Content-Type: application/sdp

v=0
o=- 5983451742484108846 2 IN IP4 172.16.19.146
s=-
t=0 0
a=group:BUNDLE audio
a=msid-semantic: WMS
m=audio 23454 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126
c=IN IP4 172.16.19.146
a=rtp:23454 IN IP4 172.16.19.146
a=candidate:1093296888 1 udp 2113937151 172.16.19.146 23454 typ host generation 0
a=ice-ufrag:OiL59DXzNUWIjCq0
a=ice-pwd:APbovMtgw7wiw+cL
a=fingerprint:sha-256 5F:95:B7:53:9B:F8:C2:71:DA:16:1D:DB:5F:18:DA:21:C6:15:0A:8E:5C:79:3B:62:D9:DE:D5:65:D2:20:4A:91
a=setup:actpass
a=mid:audio
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=recvonly
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=fmtp:111 minptime=10; useinbandfec=1
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:106 CN/32000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtpmap:126 telephone-event/8000
a=maxptime:60
"""
SIP2 = SIP2.replace("\n", "\r\n")


def run():
  SIP = SIP2.replace("{CID}",''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(16)))
  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)
  s.send(WS_HTTP)
  data = ""
  while True:
    data+=s.recv(1024)
    if data.find("\r\n\r\n") != -1:
      break

  for i in xrange(20):
    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)
