// Copyright (C) 2014 The Android Open Source Project
//
// 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.
package com.googlesource.gerrit.plugins.github.oauth;

import java.io.IOException;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class OAuthGitWrappedResponse extends HttpServletResponseWrapper {
  public static final String GIT_REALM_NAME =
      "GitHub authentication for Gerrit Code Review";
  private static final String GIT_AUTHENTICATION_BASIC = "Basic ";
  private static final String WWW_AUTHENTICATE = "WWW-Authenticate";

  public OAuthGitWrappedResponse(HttpServletResponse response) {
    super(response);
  }

  @Override
  public void sendError(int sc) throws IOException {
    if (sc == SC_UNAUTHORIZED) {
      requestBasicAuthenticationHandshake();
    }
    super.sendError(sc);
  }

  @Override
  public void sendError(int sc, String msg) throws IOException {
    if (sc == SC_UNAUTHORIZED) {
      requestBasicAuthenticationHandshake();
    }
    super.sendError(sc, msg);
  }

  private void requestBasicAuthenticationHandshake() {
    setStatus(SC_UNAUTHORIZED);
    StringBuilder v = new StringBuilder();
    v.append(GIT_AUTHENTICATION_BASIC);
    v.append("realm=\"").append(GIT_REALM_NAME).append("\"");
    setHeader(WWW_AUTHENTICATE, v.toString());
  }
}
