web-client.py 4.06 KB
import sys
import requests
import json
from datetime import datetime
from time import (
    sleep,
    time,
    )
from threading import Thread
from argparse import ArgumentParser


headers = {'content-type': 'application/json'}
threads = {}
end_threads = []
durations = {}
json_responses = {}


def error(s):
    print('ERROR: {}'.format(s))
    sys.exit()


def required(name, default=None):
    value = getattr(option, name)
    if not value and not default:
        error('--{} harus diisi'.format(name))
    p[name] = value or default


def create_thread(func, args=[]):
    thread = Thread(target=func, args=args)
    # Exit the server thread when the main thread terminates
    thread.daemon = True
    return thread


def send(p):
    key = p['id']
    log_info('Request: {}'.format(p))
    start = time()
    try:
        resp = requests.post(url, data=json.dumps(p), headers=headers)
        durations[key] = time() - start
        json_resp = resp.json()
        log_info('Response: {}'.format(json_resp))
        json_responses[key] = json_resp
    finally:
        end_threads.append(key)


def log_info(s):
    t = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
    t = t[:-3]
    msg = '{} {}'.format(t, s)
    print(msg)


default_url = 'http://localhost:7000/rpc'
default_host = 'pemda'
default_count = 1
default_method = 'echo'

help_url = 'default ' + default_url
help_host = 'default ' + default_host
help_count = 'default {}'.format(default_count)
help_method = 'default ' + default_method
help_invoice_id = 'dibutuhkan saat --method inquiry, payment, atau reversal'
help_amount = 'dibutuhkan saat --method payment dan reversal'
help_ntb = 'dibutuhkan saat --method payment dan reversal'
help_stan = 'dibutuhkan saat --method payment dan reversal'
help_bit = 'bit tambahan, contoh: --bit=42:TOKOPEDIA'
help_conf = 'konfigurasi tambahan, contoh untuk multi: --conf=pajak:bphtb'

parser = ArgumentParser()
parser.add_argument('--url', default=default_url, help=help_url)
parser.add_argument('--host', default=default_host, help=help_host)
parser.add_argument(
    '--count', type=int, default=default_count, help=help_count)
parser.add_argument('--method', default=default_method, help=help_method)
parser.add_argument('--invoice-id', help=help_invoice_id)
parser.add_argument('--amount', type=int, help=help_amount)
parser.add_argument('--ntb', help=help_ntb)
parser.add_argument('--stan', help=help_stan)
parser.add_argument('--bit', help=help_bit)
parser.add_argument('--conf', help=help_conf)
option = parser.parse_args(sys.argv[1:])

url = option.url
count = option.count
p = dict(host=option.host)
if option.method != 'echo':
    p['invoice_id'] = option.invoice_id
    if option.method in ('payment', 'reversal'):
        required('amount')
        if option.method == 'payment':
            required('ntb', datetime.now().strftime('%y%m%d%H%m%s'))
            required('stan', datetime.now().strftime('%H%M%S'))
        else:
            required('ntb')
            required('stan')
    if option.bit:
        bits = dict()
        for t in option.bit.split(','):
            bit, value = t.split(':')
            bits[bit] = value
        p['bits'] = bits
    if option.conf:
        conf = dict()
        for t in option.conf.split(','):
            key, val = t.split(':')
            conf[key] = val
        p['conf'] = conf
data = dict(method=option.method, params=[p], jsonrpc='2.0')

for i in range(count):
    data['id'] = i
    thread = create_thread(send, [dict(data)])
    threads[i] = thread

for key in threads: 
    thread = threads[key]
    thread.start()
    sleep(0.2)

while threads:
    sleep(1)
    if not end_threads:
        continue
    i = end_threads[0]
    if i in threads:
        thread = threads[i]
        thread.join()
        del threads[i]
    index = end_threads.index(i)
    del end_threads[index]

for key in durations:
    val = durations[key]
    resp = json_responses[key]
    if 'error' in resp:
        break
    result = resp['result']
    if result['code'] == 0:
        stan = result['data']['11']
    else:
        stan = '-'
    print('thread {} stan {} {} detik'.format(key, stan, val))