keep alive tråd

Added by John over 2 years ago

Hej,

Jag kör mot testmiljön. Jag blir märkligt nog konsekvent nedkopplad efter ca 1 sekund.

Jag kör nu en keepalive tråd där jag gör Touch Session varje sekund. Det håller igång anslutningen och löser mitt problem. Men så fort jag ökar intervallet mellan mina Touch Session till 2 sekunder eller mer så hinner jag bli nedkopplad.

Intreeserad att veta vad detta beror på då jag hade förväntat mig att bli nedkopplad först efter 300 sekunder.

tack
John


Replies (4)

RE: keep alive tråd - Added by Lars over 2 years ago

Vad menar du med "nedkopplad"? Touch Session håller din inloggning (session_key) vid liv men inte nödvändigtvis din "socket". Hur kopplar du upp?

RE: keep alive tråd - Added by John over 2 years ago

Jag använder python. Loggar in enligt nedan och gör sedan ett testanrop vilket fungerar. Väntar jag med mer än 2 sekunder failar dock anropet
Jag har alltså endast problem med REST API. public och private feed fungerar och ger heartbeats var 5:e sekund

from Crypto.Cipher import PKCS1_v1_5
from Crypto.PublicKey import RSA
import httplib
import urllib
import base64
import time
import json
import socket, ssl
import datetime

username = 'xxx'
password = 'xxx'
service = 'NEXTAPI'
URL = 'api.test.nordnet.se'
API_VERSION = '2'
connection = httplib.HTTPSConnection(URL)

timestamp = int(round(time.time() * 1000))
timestamp = str(timestamp)
b64_username = base64.b64encode(username.encode('utf-8')).decode("utf-8")
b64_password = base64.b64encode(password.encode('utf-8')).decode("utf-8")
b64_timestamp = base64.b64encode(timestamp.encode('utf-8')).decode("utf-8")
buf = b64_username + ":" + b64_password + ":" + b64_timestamp

key_file = open('/xxx/xxx/NEXTAPI_TEST_public.pem', 'r')
rsa = RSA.importKey(key_file.read())
cipher = PKCS1_v1_5.new(rsa)
enc = cipher.encrypt(str.encode(str(buf)))
b4_hash = base64.b64encode(enc).decode("utf-8")

headers = {'Accept': 'application/json'}
params = urllib.urlencode({'service': service, 'auth': b4_hash})
connection.request('POST', '/next/' + API_VERSION + '/login', params, headers)
resp = connection.getresponse()

response = resp.read()
json_data = json.loads(response.decode("utf-8"))
print(json.dumps(json_data,sort_keys=True,indent=4))

session_key = json_data['session_key'] + ':' + json_data['session_key']
b64_auth = base64.b64encode(bytes(session_key))
headers['Authorization'] = 'Basic '+ b64_auth

#när jag ändrar följande sleep till 2 sekunder eller mer failar anropet nedan. Med sleep på 1 sekund eller mindre får jag som förväntat {"logged_in": true}

sleep(1)

connection.request('PUT', '/next/' + API_VERSION + '/login', '', headers)
resp = connection.getresponse()
response = resp.read()
json_data = json.loads(response.decode("utf-8"))
print(json.dumps(json_data,sort_keys=True,indent=4))

felmeddelandet jag får om jag väntar mer än 2 sekunder är:
resp = connection.getresponse()
File "/usr/lib/python2.7/httplib.py", line 1027, in getresponse
response.begin()
File "/usr/lib/python2.7/httplib.py", line 407, in begin
version, status, reason = self._read_status()
File "/usr/lib/python2.7/httplib.py", line 371, in _read_status
raise BadStatusLine(line)
httplib.BadStatusLine: ''

RE: keep alive tråd - Added by Philip over 2 years ago

https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection
exception httplib.BadStatusLine
A subclass of HTTPException. Raised if a server responds with a HTTP status code that we don’t understand.

Kolla debug tools i webbläsaren eller ta en pcap o kolla vad du får för response code.

I övrigt så kan jag rekommendera att du testar e.x Requests paketet (måste installeras tyvärr) och använder requests.Session().
Jag kör det och har en async method som kontrollerar min session samt återansluter om det behövs, fungerar såklart med urllib o dylikt med :)

RE: keep alive tråd - Added by Philip over 2 years ago

Sorry, pcap är ju det enda alternativet av mina förslag...

(1-4/4)