http2
http2 copied to clipboard
how to set proxy ?
I have two questions:
- I don't know how to send data with post method.
- how to set proxy. Thanks.
@wendux In case you are still interested, in order to send data with your request, you can use sendData on the stream object of your request. E.g.:
final body = utf8.encode('{"json_key":"json_value"}');
final stream = transport.makeRequest(
[
Header.ascii(':method', 'PUT'),
Header.ascii(':path', '/'),
Header.ascii(':scheme', uri.scheme),
Header.ascii(':authority', uri.host),
Header.ascii('content-type', 'application/json'),
Header.ascii('content-length', body.length.toString()),
],
);
stream.sendData(body);
Also, note the usage of content-type/content-length headers (specified lowercase because of #49)
I have same questions:
- how to set proxy. Thanks.
Example for http2 over http tunnel proxy
void main() async {
var transport = await connectTunnel('127.0.0.1', 8888, 'www.google.com');
var stream = transport.makeRequest([
Header.ascii(':method', 'GET'),
Header.ascii(':path', '/'),
Header.ascii(':scheme', 'https'),
Header.ascii(':authority', 'www.google.com'),
], 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('Header: $name: $value');
}
} else if (message is DataStreamMessage) {
print('Body: $message');
}
}
await transport.finish();
}
/// https://www.ietf.org/rfc/rfc2817.txt
Future<ClientTransportConnection> connectTunnel(String proxyHost, int proxyPort, String targetHost,
[int targetPort = 443]) async {
var proxy = await Socket.connect(proxyHost, proxyPort, timeout: const Duration(seconds: 1));
const CRLF = "\r\n";
proxy.write("CONNECT $targetHost:$targetPort HTTP/1.1"); // request line
proxy.write(CRLF);
proxy.write("Host: $targetHost:$targetPort"); // header
proxy.write(CRLF);
proxy.write(CRLF);
var completer = Completer<bool>.sync();
var sub = proxy.listen((event) {
var response = ascii.decode(event);
var lines = response.split(CRLF);
// status line
var statusLine = lines.first;
if (statusLine.startsWith("HTTP/1.1 200")) {
completer.complete();
} else {
completer.completeError(statusLine);
}
}, onError: completer.completeError);
await completer.future; // established
await sub.pause();
var socket = await SecureSocket.secure(proxy, host: targetHost, supportedProtocols: const ["h2"]);
return ClientTransportConnection.viaSocket(socket);
}