// NO-OP
}
public void onSynStream(SpdyStream str) throws IOException {
this.spdyStream = str;
SpdyFrame frame = str.reqFrame;
// We need to make a copy - the frame buffer will be reused.
// We use the 'wrap' methods of MimeHeaders - which should be
// lighter on mem in some cases.
RequestInfo rp = request.getRequestProcessor();
rp.setStage(org.apache.coyote.Constants.STAGE_PREPARE);
// Request received.
MimeHeaders mimeHeaders = request.getMimeHeaders();
// Set this every time in case limit has been changed via JMX
mimeHeaders.setLimit(endpoint.getMaxHeaderCount());
for (int i = 0; i < frame.nvCount; i++) {
int nameLen = frame.read16();
if (nameLen > frame.remaining()) {
throw new IOException("Name too long");
}
keyBuffer.setBytes(frame.data, frame.off, nameLen);
if (keyBuffer.equals("method")) {
frame.advance(nameLen);
int valueLen = frame.read16();
if (valueLen > frame.remaining()) {
throw new IOException("Name too long");
}
request.method().setBytes(frame.data, frame.off, valueLen);
frame.advance(valueLen);
} else if (keyBuffer.equals("url")) {
frame.advance(nameLen);
int valueLen = frame.read16();
if (valueLen > frame.remaining()) {
throw new IOException("Name too long");
}
request.unparsedURI().setBytes(frame.data, frame.off, valueLen);
int questionPos = -1;
int end = frame.off + valueLen;
for(int k = frame.off; k < end; k ++) {
if (frame.data[k] == '?') {
questionPos = k;
break;
}
}
if (questionPos >= 0) {
request.queryString().setBytes(frame.data, questionPos + 1, end - questionPos - 1);
request.requestURI().setBytes(frame.data, frame.off, questionPos - frame.off);
} else {
request.requestURI().setBytes(frame.data, frame.off, valueLen);
}
if (SpdyContext.debug) {
System.err.println("URL= " + request.requestURI());
}
frame.advance(valueLen);
} else if (keyBuffer.equals("version")) {
frame.advance(nameLen);
int valueLen = frame.read16();
if (valueLen > frame.remaining()) {
throw new IOException("Name too long");
}
frame.advance(valueLen);
} else {
MessageBytes value = mimeHeaders.addValue(frame.data,
frame.off, nameLen);
frame.advance(nameLen);
int valueLen = frame.read16();
if (valueLen > frame.remaining()) {
throw new IOException("Name too long");
}
value.setBytes(frame.data, frame.off, valueLen);
frame.advance(valueLen);
}
}
onRequest();
}