blob: c1faa4df4404ea29869a2f10d8f503d1791a19e4 [file] [log] [blame]
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:http2/transport.dart';
main(List<String> args) async {
if (args == null || args.length != 1) {
print('Usage: dart display_headers.dart <HTTPS_URI>');
exit(1);
}
var uriArg = args[0];
if (!uriArg.startsWith('https://')) {
print('URI must start with https://');
exit(1);
}
var uri = Uri.parse(uriArg);
var socket = await connect(uri);
// The default client settings will disable server pushes. We
// therefore do not need to deal with [stream.peerPushes].
var transport = new ClientTransportConnection.viaSocket(socket);
var headers = [
new Header.ascii(':method', 'GET'),
new Header.ascii(':path', uri.path),
new Header.ascii(':scheme', uri.scheme),
new Header.ascii(':authority', uri.host),
];
var stream = transport.makeRequest(headers, endStream: true);
await for (var message in stream.incomingMessages) {
if (message is HeadersStreamMessage) {
for (var header in message.headers) {
var name = utf8.decode(header.name);
var value = utf8.decode(header.value);
print('$name: $value');
}
} else if (message is DataStreamMessage) {
// Use [message.bytes] (but respect 'content-encoding' header)
}
}
await transport.finish();
}
Future<Socket> connect(Uri uri) async {
bool useSSL = uri.scheme == 'https';
if (useSSL) {
var secureSocket = await SecureSocket.connect(uri.host, uri.port,
supportedProtocols: ['h2']);
if (secureSocket.selectedProtocol != 'h2') {
throw new Exception("Failed to negogiate http/2 via alpn. Maybe server "
"doesn't support http/2.");
}
return secureSocket;
} else {
return await Socket.connect(uri.host, uri.port);
}
}