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:{USER}@{HOST} SIP/2.0
Call-ID: {CID}
CSeq: {CSEQ} INVITE
Max-Forwards: 70
User-Agent: SIP.js/0.7.2
From: <sip:{USER}>
Supported: outbound
Via: SIP/2.0/WSS {VIA};branch={BRANCH}
Contact: <sip:{USER};transport=wss;ob>
Allow: ACK,CANCEL,BYE,OPTIONS,INFO,NOTIFY
To: <sip:{USER}@{HOST}>
Content-Length: {SIZE}
Content-Type: application/sdp

v=0
o=- {SESSION} 2 IN IP4 192.168.56.151
s=-
c=IN IP4 192.168.56.151
t=0 0
m=audio {PORT} RTP/AVP 0 100
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000 
a=maxptime:20
"""

SIP2 = SIP2.replace("\n", "\r\n")

def randomString(size):
  return ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(size))

def runAndClose():
  SIP = SIP2.replace("{CID}",randomString(16)).replace("{USER}", randomString(16)).replace("{BRANCH}", randomString(10)).replace("{VIA}", randomString(10)).replace("{SESSION}", str(random.randint(0100000, 999999999))).replace("{PORT}", str(random.randint(5000,50000))).replace("{CSEQ}", str(random.randint(5000,9999999))).replace("{HOST}", randomString(10))
  SIP = SIP.replace("{SIZE}", str(len(SIP[SIP.find("\r\n\r\n")+4:])))
  WSF = struct.pack("!BBH", 129, 126, len(SIP))
  s = socket.create_connection((HOST, PORT))
  s = ssl.wrap_socket(s)
  s.setblocking(1)
  s.settimeout(25)
  #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(5)
  s.close()

def run():
  SIP = SIP2.replace("{CID}",randomString(16)).replace("{USER}", randomString(16)).replace("{BRANCH}", randomString(10)).replace("{VIA}", randomString(10)).replace("{SESSION}", str(random.randint(0100000, 999999999))).replace("{PORT}", str(random.randint(5000,50000))).replace("{CSEQ}", str(random.randint(5000,9999999))).replace("{HOST}", randomString(10))
  SIP = SIP.replace("{SIZE}", str(len(SIP[SIP.find("\r\n\r\n")+4:])))
  WSF = struct.pack("!BBH", 129, 126, len(SIP))
  s = socket.create_connection((HOST, PORT))
  s = ssl.wrap_socket(s)
  s.setblocking(1)
  s.settimeout(25)
  #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)

  while True:
    try:
      s.recv(1024)
    except ssl.SSLError as e:
      if e.message != "The read operation timed out":
        print "Error on 2nd connection"
        print e
      break
        
  print "Done"

print "starting first"
runAndClose()
print "first closed"
time.sleep(10)
print "opening 2nd client"
run()
