# Copyright 2015 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""An HTTP server to use for external repository integration tests."""

import base64
from BaseHTTPServer import BaseHTTPRequestHandler
import getopt
import os
import SocketServer
import sys

auth = None


class Handler(BaseHTTPRequestHandler):
  """Handlers for testing HTTP server."""

  def do_HEAD(self):  # pylint: disable=invalid-name
    self.send_response(200)
    self.send_header('Content-type', 'text/html')
    self.end_headers()

  def do_AUTHHEAD(self):  # pylint: disable=invalid-name
    self.send_response(401)
    self.send_header('WWW-Authenticate', 'Basic realm=\"Bazel\"')
    self.send_header('Content-type', 'text/html')
    self.end_headers()

  def do_GET(self):  # pylint: disable=invalid-name
    if auth is None:
      self.do_HEAD()
      self.serve_file()
      return

    foo_bar = base64.b64encode('foo:bar')

    if self.headers.getheader('Authorization') is None:
      self.do_AUTHHEAD()
      self.wfile.write('Login required.')
    elif self.headers.getheader('Authorization') == 'Basic %s' % foo_bar:
      self.do_HEAD()
      try:
        self.wfile.write(self.headers.getheader('Authorization'))
        self.serve_file()
      except IOError:
        self.wfile.write('Authorized.')
    else:
      self.do_AUTHHEAD()
      self.wfile.write(self.headers.getheader('Authorization'))
      self.wfile.write('not authenticated')

  def serve_file(self):
    with open(str(os.getcwd()) + self.path) as file_to_serve:
      self.wfile.write(file_to_serve.read())


if __name__ == '__main__':
  try:
    opts, args = getopt.getopt(sys.argv[1:], 'p:a:', ['port=', 'auth='])
  except getopt.GetoptError:
    print 'Error parsing args'
    sys.exit(1)

  port = 12345
  for o, a in opts:
    if o in ('-p', '--port'):
      port = int(a)
    if o in ('-a', '--auth'):
      auth = a
  httpd = SocketServer.TCPServer(('', port), Handler)
  try:
    print 'Serving forever on %d.' % port
    httpd.serve_forever()
  except:  # pylint: disable=bare-except
    print 'Goodbye.'
