提交 ec2a0e60 编写于 作者: R Richard Levitte

s_client: Better response success check for CONNECT

Instead of looking for "200" and "established" (and failing all other
2xx responses or "Established"), let's look for a line that's not a
header (i.e. doesn't contain a ':') and where the first space is
followed by a '2'.
Reviewed-by: NRich Salz <rsalz@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/1664)
上级 9d6fcd42
...@@ -2020,24 +2020,44 @@ int s_client_main(int argc, char **argv) ...@@ -2020,24 +2020,44 @@ int s_client_main(int argc, char **argv)
break; break;
case PROTO_CONNECT: case PROTO_CONNECT:
{ {
int foundit = 0; enum {
error_proto, /* Wrong protocol, not even HTTP */
error_connect, /* CONNECT failed */
success
} foundit = error_connect;
BIO *fbio = BIO_new(BIO_f_buffer()); BIO *fbio = BIO_new(BIO_f_buffer());
BIO_push(fbio, sbio); BIO_push(fbio, sbio);
BIO_printf(fbio, "CONNECT %s HTTP/1.0\r\n\r\n", connectstr); BIO_printf(fbio, "CONNECT %s HTTP/1.0\r\n\r\n", connectstr);
(void)BIO_flush(fbio); (void)BIO_flush(fbio);
/* wait for multi-line response to end CONNECT response */ /*
do { * The first line is the HTTP response. According to RFC 7230,
mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ); * it's formated exactly like this:
if (strstr(mbuf, "200") != NULL *
&& strstr(mbuf, "established") != NULL) * HTTP/d.d ddd Reason text\r\n
foundit++; */
} while (mbuf_len > 3 && foundit == 0); mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ);
if (mbuf[8] != ' ') {
BIO_printf(bio_err,
"%s: HTTP CONNECT failed, incorrect response "
"from proxy\n", prog);
foundit = error_proto;
} else if (mbuf[9] != '2') {
BIO_printf(bio_err, "%s: HTTP CONNECT failed: %s ", prog,
&mbuf[9]);
} else {
foundit = success;
}
if (foundit != error_proto) {
/* Read past all following headers */
do {
mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ);
} while (mbuf_len > 2);
}
(void)BIO_flush(fbio); (void)BIO_flush(fbio);
BIO_pop(fbio); BIO_pop(fbio);
BIO_free(fbio); BIO_free(fbio);
if (!foundit) { if (foundit != success) {
BIO_printf(bio_err, "%s: HTTP CONNECT failed\n", prog);
goto shut; goto shut;
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册