blob: cdb51f65a56aac4f57dee927a14b0fef25941040 [file] [log] [blame]
/*
* Copyright (C) 2014 Square, Inc.
*
* 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.squareup.okhttp.internal.spdy;
import java.io.IOException;
import java.util.List;
import okio.BufferedSource;
/**
* {@link com.squareup.okhttp.Protocol#HTTP_2 HTTP/2} only.
* Processes server-initiated HTTP requests on the client. Implementations must
* quickly dispatch callbacks to avoid creating a bottleneck.
*
* <p>While {@link #onReset} may occur at any time, the following callbacks are
* expected in order, correlated by stream ID.
* <ul>
* <li>{@link #onRequest}</li>
* <li>{@link #onHeaders} (unless canceled)</li>
* <li>{@link #onData} (optional sequence of data frames)</li>
* </ul>
*
* <p>As a stream ID is scoped to a single HTTP/2 connection, implementations
* which target multiple connections should expect repetition of stream IDs.
*
* <p>Return true to request cancellation of a pushed stream. Note that this
* does not guarantee future frames won't arrive on the stream ID.
*/
public interface PushObserver {
/**
* Describes the request that the server intends to push a response for.
*
* @param streamId server-initiated stream ID: an even number.
* @param requestHeaders minimally includes {@code :method}, {@code :scheme},
* {@code :authority}, and (@code :path}.
*/
boolean onRequest(int streamId, List<Header> requestHeaders);
/**
* The response headers corresponding to a pushed request. When {@code last}
* is true, there are no data frames to follow.
*
* @param streamId server-initiated stream ID: an even number.
* @param responseHeaders minimally includes {@code :status}.
* @param last when true, there is no response data.
*/
boolean onHeaders(int streamId, List<Header> responseHeaders, boolean last);
/**
* A chunk of response data corresponding to a pushed request. This data
* must either be read or skipped.
*
* @param streamId server-initiated stream ID: an even number.
* @param source location of data corresponding with this stream ID.
* @param byteCount number of bytes to read or skip from the source.
* @param last when true, there are no data frames to follow.
*/
boolean onData(int streamId, BufferedSource source, int byteCount, boolean last)
throws IOException;
/** Indicates the reason why this stream was canceled. */
void onReset(int streamId, ErrorCode errorCode);
PushObserver CANCEL = new PushObserver() {
@Override public boolean onRequest(int streamId, List<Header> requestHeaders) {
return true;
}
@Override public boolean onHeaders(int streamId, List<Header> responseHeaders, boolean last) {
return true;
}
@Override public boolean onData(int streamId, BufferedSource source, int byteCount,
boolean last) throws IOException {
source.skip(byteCount);
return true;
}
@Override public void onReset(int streamId, ErrorCode errorCode) {
}
};
}