Skip to content

Instantly share code, notes, and snippets.

@dave5623
Forked from leolee192/relay.py
Created March 1, 2017 21:16
Show Gist options
  • Save dave5623/2570b2885f75972d3bf1a44ce1a561d5 to your computer and use it in GitHub Desktop.
Save dave5623/2570b2885f75972d3bf1a44ce1a561d5 to your computer and use it in GitHub Desktop.

Revisions

  1. @leolee192 leolee192 revised this gist Feb 18, 2016. 1 changed file with 1 addition and 0 deletions.
    1 change: 1 addition & 0 deletions relay.py
    Original file line number Diff line number Diff line change
    @@ -29,6 +29,7 @@ def run(self):
    logging.error(e)
    break
    logging.info('%s terminating' % self)
    self.sink.shutdown(socket.SHUT_WR)
    PipeThread.pipes.remove(self)
    logging.info('%s pipes active' % len(PipeThread.pipes))

  2. @zjiekai zjiekai created this gist Feb 18, 2016.
    66 changes: 66 additions & 0 deletions relay.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,66 @@
    #!/usr/bin/python

    import logging
    import socket
    from threading import Thread


    class PipeThread(Thread):
    pipes = []

    def __init__(self, source, sink):
    Thread.__init__(self)
    self.source = source
    self.sink = sink

    logging.info('new pipe thread %s (%s -> %s)' % \
    (self, source.getpeername(), sink.getpeername()))
    PipeThread.pipes.append(self)
    logging.info('%s pipes active' % len(PipeThread.pipes))

    def run(self):
    while True:
    try:
    data = self.source.recv(1024)
    if not data:
    break
    self.sink.send(data)
    except Exception as e:
    logging.error(e)
    break
    logging.info('%s terminating' % self)
    PipeThread.pipes.remove(self)
    logging.info('%s pipes active' % len(PipeThread.pipes))


    class Relay(Thread):
    def __init__(self, port, dst_host, dst_port):
    Thread.__init__(self)
    logging.info('relaying: localhost:%s -> %s:%s' % (port, dst_host, dst_port))
    self.dst_host = dst_host
    self.dst_port = dst_port
    self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    self.sock.bind(('0.0.0.0', port))
    self.sock.listen(1)

    def run(self):
    while True:
    newsock, address = self.sock.accept()
    logging.info('new session for %s %s' % address)
    fwd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    fwd.connect((self.dst_host, self.dst_port))
    PipeThread(newsock, fwd).start()
    PipeThread(fwd, newsock).start()


    if __name__ == '__main__':
    logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s')
    logging.info('starting relay')

    import sys

    port = int(sys.argv[1])
    dst_host = sys.argv[2]
    dst_port = int(sys.argv[3])
    Relay(port, dst_host, dst_port).start()
    34 changes: 34 additions & 0 deletions server0.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,34 @@
    #!/usr/bin/python

    from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
    import logging


    class Handler(BaseHTTPRequestHandler):
    def _set_headers(self):
    self.send_response(200)
    self.end_headers()

    def do_GET(self):
    logging.info('do_GET')
    self._set_headers()
    self.wfile.write('reply GET\n')

    def do_POST(self):
    logging.info('do_POST')
    content_len = int(self.headers.getheader('content-length', 0))
    post_body = self.rfile.read(content_len)
    self._set_headers()
    self.wfile.write('reply POST\n' + post_body + '\n')


    def run(port):
    HTTPServer(('0.0.0.0', port), Handler).serve_forever()


    if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s')
    import sys

    port = int(sys.argv[1])
    run(port)