Skip to content

Commit 4925fac

Browse files
committed
minor clean up
1 parent cab08eb commit 4925fac

File tree

2 files changed

+113
-12
lines changed

2 files changed

+113
-12
lines changed

client/src/main/java/Foo.java

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import io.netty.buffer.ByteBuf;
2+
import io.netty.buffer.ByteBufAllocator;
3+
import io.netty.buffer.ByteBufUtil;
4+
import io.netty.buffer.Unpooled;
5+
import io.netty.handler.codec.http.DefaultFullHttpRequest;
6+
import io.netty.handler.codec.http.HttpHeaderNames;
7+
import io.netty.handler.codec.http.HttpHeaderValues;
8+
import io.netty.handler.codec.http.HttpHeaders;
9+
import io.netty.handler.codec.http.HttpMethod;
10+
import io.netty.handler.codec.http.HttpVersion;
11+
import io.netty.util.AsciiString;
12+
13+
import java.util.Iterator;
14+
import java.util.Map;
15+
16+
public class Foo {
17+
18+
public static void main(String[] args) {
19+
HttpVersion httpVersion = HttpVersion.HTTP_1_0;
20+
HttpMethod method = HttpMethod.GET;
21+
ByteBuf buf = ByteBufAllocator.DEFAULT.buffer();
22+
ByteBuf content = Unpooled.EMPTY_BUFFER;
23+
// new DefaultFullHttpRequest(httpVersion,method, urlAddress,content);
24+
DefaultFullHttpRequest nettyHttpRequest = new DefaultFullHttpRequest(httpVersion, method, "http://localhost/aaa/bbb", content);
25+
// 头里加入host信息
26+
nettyHttpRequest.headers().add(HttpHeaderNames.HOST, new AsciiString("192.168.3.52:8081"));
27+
nettyHttpRequest.headers().add(HttpHeaderNames.USER_AGENT, new AsciiString("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:53.0) Gecko/20100101 Firefox/53.0"));
28+
nettyHttpRequest.headers().add(HttpHeaderNames.CONTENT_TYPE, new AsciiString("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"));
29+
nettyHttpRequest.headers().add(HttpHeaderNames.ACCEPT_LANGUAGE, new AsciiString("zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3"));
30+
nettyHttpRequest.headers().add(HttpHeaderNames.ACCEPT_ENCODING, new AsciiString("gzip, deflate"));
31+
nettyHttpRequest.headers().add(HttpHeaderNames.CONTENT_LENGTH, HttpHeaderValues.ZERO);
32+
nettyHttpRequest.headers().add(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE);
33+
try {
34+
long st = System.nanoTime();
35+
encodeHeaders(nettyHttpRequest.headers(), buf);
36+
long et = System.nanoTime();
37+
System.out.println("cost time :" + ((et - st) / 1_000_000));
38+
} catch (Exception e) {
39+
40+
}
41+
}
42+
43+
protected static void encodeHeaders(HttpHeaders headers, ByteBuf buf) throws Exception {
44+
Iterator<Map.Entry<CharSequence, CharSequence>> iter = headers.iteratorCharSequence();
45+
while (iter.hasNext()) {
46+
Map.Entry<CharSequence, CharSequence> header = iter.next();
47+
long st = System.nanoTime();
48+
encoderHeader(header.getKey(), header.getValue(), buf);
49+
long et = System.nanoTime();
50+
System.out.println("encode header " + header.getKey() + " value " + header.getValue() + " cost time :" + ((et - st) / 1_000_000));
51+
}
52+
}
53+
54+
public static void encoderHeader(CharSequence name, CharSequence value, ByteBuf buf) throws Exception {
55+
final int nameLen = name.length();
56+
final int valueLen = value.length();
57+
final int entryLen = nameLen + valueLen + 4;
58+
buf.ensureWritable(entryLen);
59+
int offset = buf.writerIndex();
60+
writeAscii(buf, offset, name, nameLen);
61+
offset += nameLen;
62+
buf.setByte(offset++, ':');
63+
buf.setByte(offset++, ' ');
64+
writeAscii(buf, offset, value, valueLen);
65+
offset += valueLen;
66+
buf.setByte(offset++, '\r');
67+
buf.setByte(offset++, '\n');
68+
buf.writerIndex(offset);
69+
}
70+
71+
private static void writeAscii(ByteBuf buf, int offset, CharSequence value, int valueLen) {
72+
if (value instanceof AsciiString) {
73+
long st = System.nanoTime();
74+
ByteBufUtil.copy((AsciiString) value, 0, buf, offset, valueLen);
75+
long et = System.nanoTime();
76+
// System.out.println("writeAscii header "+value+" value cost time :"+(et-st));
77+
78+
} else {
79+
80+
writeCharSequence(buf, offset, value, valueLen);
81+
82+
}
83+
}
84+
85+
private static void writeCharSequence(ByteBuf buf, int offset, CharSequence value, int valueLen) {
86+
for (int i = 0; i < valueLen; ++i) {
87+
buf.setByte(offset++, c2b(value.charAt(i)));
88+
}
89+
}
90+
}

client/src/main/java/org/asynchttpclient/Realm.java

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
public class Realm {
3838

3939
private static final String DEFAULT_NC = "00000001";
40+
// MD5("")
4041
private static final String EMPTY_ENTITY_MD5 = "d41d8cd98f00b204e9800998ecf8427e";
4142

4243
private final String principal;
@@ -218,7 +219,7 @@ protected MessageDigest initialValue() {
218219
}
219220
}
220221
};
221-
222+
222223
private static MessageDigest getMessageDigest() {
223224
MessageDigest md = DIGEST_TL.get();
224225
md.reset();
@@ -420,26 +421,35 @@ private byte[] md5FromRecycledStringBuilder(StringBuilder sb, MessageDigest md)
420421
return md.digest();
421422
}
422423

423-
private byte[] secretDigest(StringBuilder sb, MessageDigest md) {
424+
private byte[] ha1(StringBuilder sb, MessageDigest md) {
425+
// if algorithm is "MD5" or is unspecified => A1 = username ":" realm-value ":" passwd
426+
// if algorithm is "MD5-sess" => A1 = MD5( username-value ":" realm-value ":" passwd ) ":" nonce-value ":" cnonce-value
424427

425428
sb.append(principal).append(':').append(realmName).append(':').append(password);
426-
byte[] ha1 = md5FromRecycledStringBuilder(sb, md);
429+
byte[] core = md5FromRecycledStringBuilder(sb, md);
427430

428431
if (algorithm == null || algorithm.equals("MD5")) {
429-
return ha1;
432+
// A1 = username ":" realm-value ":" passwd
433+
return core;
430434
} else if ("MD5-sess".equals(algorithm)) {
431-
appendBase16(sb, ha1);
435+
// A1 = MD5(username ":" realm-value ":" passwd ) ":" nonce ":" cnonce
436+
appendBase16(sb, core);
432437
sb.append(':').append(nonce).append(':').append(cnonce);
433438
return md5FromRecycledStringBuilder(sb, md);
434439
}
435440

436441
throw new UnsupportedOperationException("Digest algorithm not supported: " + algorithm);
437442
}
438443

439-
private byte[] dataDigest(StringBuilder sb, String digestUri, MessageDigest md) {
444+
private byte[] ha2(StringBuilder sb, String digestUri, MessageDigest md) {
440445

446+
// if qop is "auth" or is unspecified => A2 = Method ":" digest-uri-value
447+
// if qop is "auth-int" => A2 = Method ":" digest-uri-value ":" H(entity-body)
441448
sb.append(methodName).append(':').append(digestUri);
442449
if ("auth-int".equals(qop)) {
450+
// when qop == "auth-int", A2 = Method ":" digest-uri-value ":" H(entity-body)
451+
// but we don't have the request body here
452+
// we would need a new API
443453
sb.append(':').append(EMPTY_ENTITY_MD5);
444454

445455
} else if (qop != null && !qop.equals("auth")) {
@@ -449,7 +459,8 @@ private byte[] dataDigest(StringBuilder sb, String digestUri, MessageDigest md)
449459
return md5FromRecycledStringBuilder(sb, md);
450460
}
451461

452-
private void appendDataBase(StringBuilder sb) {
462+
private void appendMiddlePart(StringBuilder sb) {
463+
// request-digest = MD5(H(A1) ":" nonce ":" nc ":" cnonce ":" qop ":" H(A2))
453464
sb.append(':').append(nonce).append(':');
454465
if ("auth".equals(qop) || "auth-int".equals(qop)) {
455466
sb.append(nc).append(':').append(cnonce).append(':').append(qop).append(':');
@@ -463,12 +474,12 @@ private void newResponse(MessageDigest md) {
463474
StringBuilder sb = StringBuilderPool.DEFAULT.stringBuilder();
464475

465476
// WARNING: DON'T MOVE, BUFFER IS RECYCLED!!!!
466-
byte[] secretDigest = secretDigest(sb, md);
467-
byte[] dataDigest = dataDigest(sb, digestUri, md);
477+
byte[] ha1 = ha1(sb, md);
478+
byte[] ha2 = ha2(sb, digestUri, md);
468479

469-
appendBase16(sb, secretDigest);
470-
appendDataBase(sb);
471-
appendBase16(sb, dataDigest);
480+
appendBase16(sb, ha1);
481+
appendMiddlePart(sb);
482+
appendBase16(sb, ha2);
472483

473484
byte[] responseDigest = md5FromRecycledStringBuilder(sb, md);
474485
response = toHexString(responseDigest);

0 commit comments

Comments
 (0)