//
//  ========================================================================
//  Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd.
//  ------------------------------------------------------------------------
//  All rights reserved. This program and the accompanying materials
//  are made available under the terms of the Eclipse Public License v1.0
//  and Apache License v2.0 which accompanies this distribution.
//
//      The Eclipse Public License is available at
//      http://www.eclipse.org/legal/epl-v10.html
//
//      The Apache License v2.0 is available at
//      http://www.opensource.org/licenses/apache2.0.php
//
//  You may elect to redistribute this code under either of these licenses.
//  ========================================================================
//

package org.eclipse.jetty.http2.frames;

import org.eclipse.jetty.http.MetaData;

public class HeadersFrame extends Frame
{
    private final int streamId;
    private final MetaData metaData;
    private final PriorityFrame priority;
    private final boolean endStream;

    /**
     * <p>Creates a new {@code HEADERS} frame with an unspecified stream {@code id}.</p>
     * <p>The stream {@code id} will be generated by the implementation while sending
     * this frame to the other peer.</p>
     *
     * @param metaData  the metadata containing HTTP request information
     * @param priority  the PRIORITY frame associated with this HEADERS frame
     * @param endStream whether this frame ends the stream
     */
    public HeadersFrame(MetaData metaData, PriorityFrame priority, boolean endStream)
    {
        this(0, metaData, priority, endStream);
    }

    /**
     * <p>Creates a new {@code HEADERS} frame with the specified stream {@code id}.</p>
     * <p>{@code HEADERS} frames with a specific stream {@code id} are typically used
     * in responses to request {@code HEADERS} frames.</p>
     *
     * @param streamId  the stream id
     * @param metaData  the metadata containing HTTP request/response information
     * @param priority  the PRIORITY frame associated with this HEADERS frame
     * @param endStream whether this frame ends the stream
     */
    public HeadersFrame(int streamId, MetaData metaData, PriorityFrame priority, boolean endStream)
    {
        super(FrameType.HEADERS);
        this.streamId = streamId;
        this.metaData = metaData;
        this.priority = priority;
        this.endStream = endStream;
    }

    public int getStreamId()
    {
        return streamId;
    }

    public MetaData getMetaData()
    {
        return metaData;
    }

    public PriorityFrame getPriority()
    {
        return priority;
    }

    public boolean isEndStream()
    {
        return endStream;
    }

    @Override
    public String toString()
    {
        return String.format("%s#%d{end=%b}", super.toString(), streamId, endStream);
    }
}
