Guest User

Untitled

a guest
Jan 18th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.30 KB | None | 0 0
  1. import subprocess
  2. import time
  3.  
  4. from werkzeug.wsgi import get_content_length
  5. from flask import Flask, Response, request
  6.  
  7. from subprocess_input_streamer import SubprocessInputStreamer
  8.  
  9.  
  10. class SubprocessStreamProxy:
  11. def __init__(self, input_streamer: SubprocessInputStreamer):
  12. self.input_streamer = input_streamer
  13.  
  14. def write(self, b: bytes):
  15. if not self.input_streamer.running:
  16. self.input_streamer.start()
  17.  
  18. self.input_streamer.write(b)
  19.  
  20. def flush(self):
  21. self.input_streamer.stop()
  22.  
  23.  
  24. class SplitStreamWriter:
  25. def __init__(self, output_streams):
  26. self.output_streams = output_streams
  27.  
  28. def write(self, b):
  29. for stream in self.output_streams:
  30. stream.write(b)
  31. return len(b)
  32.  
  33. def flush(self):
  34. for stream in self.output_streams:
  35. stream.flush()
  36.  
  37.  
  38. def main():
  39. app = Flask('stream-split')
  40.  
  41. @app.route('/upload', methods=['POST'])
  42. def upload():
  43. temp_files = [
  44. open('./data/stream-split-a', mode='wb'),
  45. open('./data/stream-split-b', mode='wb'),
  46. open('./data/stream-split-c', mode='wb'),
  47. ]
  48. spx = SubprocessInputStreamer(
  49. ['exiftool', '-'], popen_kwargs={'stdin': subprocess.PIPE, 'stdout': subprocess.PIPE}
  50. )
  51. writer = SplitStreamWriter(temp_files + [SubprocessStreamProxy(spx)])
  52.  
  53. content_length = get_content_length(request.environ)
  54. print('Starting to read request: content_length=%s' % content_length)
  55. start = time.time()
  56.  
  57. stream = request.stream
  58. while True:
  59. data = stream.read(500 * 1024)
  60. if not data:
  61. break
  62. writer.write(data)
  63. writer.flush()
  64.  
  65. end = time.time()
  66. print('Finished reading request: time=%s' % (end - start))
  67.  
  68. print('Temp files: %s' % [f.name for f in temp_files])
  69. for f in temp_files:
  70. f.close()
  71.  
  72. if spx.error:
  73. print('SPX ERROR: error=%s, spx.stderr=%s' % (spx.error, spx.stderr))
  74. else:
  75. print('SPX: ')
  76. print(spx.stdout.decode() if spx.stdout else '<NO STDOUT>')
  77. print(spx.stderr.decode() if spx.stderr else '<NO STDERR>')
  78.  
  79. return Response(status=200)
  80.  
  81. app.run('0.0.0.0', 5000)
  82.  
  83.  
  84. if __name__ == '__main__':
  85. main()
Add Comment
Please, Sign In to add comment