http2 icon indicating copy to clipboard operation
http2 copied to clipboard

how to set proxy ?

Open wendux opened this issue 6 years ago • 3 comments

I have two questions:

  1. I don't know how to send data with post method.
  2. how to set proxy. Thanks.

wendux avatar Sep 13 '19 01:09 wendux

@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)

rencevio avatar Sep 24 '19 11:09 rencevio

I have same questions:

  1. how to set proxy. Thanks.

imwcl avatar Aug 24 '20 13:08 imwcl

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);
}

yrom avatar Dec 22 '20 11:12 yrom