swift-server/async-http-client

Doesn't work with usefixie and quotaguard with `invalidProxyResponse `

MihaelIsaev opened this issue · 3 comments

I tried to use it with usefixie.com and quotaguard.com and getting invalidProxyResponse error.

I tried to set breakpoints to debug the issue and see that under the hood these services returns 400 Bad Request

let auth = HTTPClient.Authorization.basic(username: "fixie", password: "___")
let proxyConfig = HTTPClient.Configuration.Proxy.server(host: "___.usefixie.com", port: 80, authorization: auth)
app.http.client.configuration.proxy = proxyConfig
//app.http.client.configuration.redirectConfiguration = .follow(max: 100, allowCycles: true)
do {
    let res = try app.client.get(URI("https://ip.quotaguard.com/")).wait()
    app.logger.critical("\(res.body?.string)")
} catch {
    app.logger.critical("Error: \(error)") // getting HTTPClientError.invalidProxyResponse here
}

at the same time with nodejs everything works fine

var http = require('http');

function buildAuthHeader(user, pass) {
    return 'Basic ' + new Buffer(user + ':' + pass).toString('base64');
}

proxy = '___.usefixie.com';
proxy_port = 80;
host = 'ip.quotaguard.com';
url = 'https://ip.quotaguard.com';
user = 'fixie';
pass = '___';

var options = {
    port: proxy_port,
    host: proxy,
    path: url,
    headers: {
        Host: host,
        'Proxy-Authorization': buildAuthHeader(user, pass),
    }
};

http.get(options, function(res) {
  console.log("StatusCode: " + res.statusCode + " Message: " + res.statusMessage);
  let chunks = []
    res.on('data', chunk => chunks.push(chunk))
    res.on('end', () => {
      console.log('DONE', Buffer.concat(chunks).toString('utf8'))
    })
}).end();

Can you use Wireshark or something similar to capture the request to the proxy and then provide it here?

@Lukasa thanks for pointing me to Wireshark, I completely forgot about it!

I realized that Host header is missing which causes 400 Bad Request: missing required Host header

I added missing header into HTTP1ProxyConnectionHandler and now it works like a charm!

@Lukasa thank you very much for merging it that fast! Need it in production asap, could you please tag it?