/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you 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 org.apache.asyncweb.common;

/**
 * A mutable {@link HttpResponse}
 * 
 * @author The Apache MINA Project (dev@mina.apache.org)
 * @version $Rev$, $Date$
 */
public interface MutableHttpResponse extends MutableHttpMessage, HttpResponse {

    /**
     * Adds the cookie of this message by parsing the specified
     * <tt>headerValue</tt>.
     */
    void addCookie(String headerValue);

    /**
     * Sets the status of this response
     *
     * @param status  The response status
     */
    void setStatus(HttpResponseStatus status);

    /**
     * Sets the reason phrase which is associated with the current status of
     * this response.
     */
    void setStatusReasonPhrase(String reasonPhrase);

    /**
     * Normalizes this response to fix possible protocol violations.  The
     * following is the normalization step:
     * <ol>
     * <li>Adds '<tt>Connection</tt>' header with an appropriate value
     *     determined from the specified <tt>request</tt> and the status of
     *     this response.</li>
     * <li>Adds '<tt>Date</tt>' header with current time.</li>
     * <li>Removes body content if the {@link HttpMethod} of the specified
     *     <tt>request</tt> doesn't allow body or the status of this response
     *     doesn't allow body.</li>
     * <li>Adds '<tt>Content-length</tt>' header if '<tt>Transfer-coding</tt>'
     *     header doesn't exist.</li>
     * </ol>
     *
     * @param request the request that pairs with this response
     */
    void normalize(HttpRequest request);
}