private Headers createRequestHeaders(Headers.Header scheme, Headers.Header host, Headers.Header uri, String pushResourcePath) { final Headers requestHeaders = new Headers(); requestHeaders.put(HTTPSPDYHeader.METHOD.name(version), "GET"); requestHeaders.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1"); requestHeaders.put(scheme); requestHeaders.put(host); requestHeaders.put(HTTPSPDYHeader.URI.name(version), pushResourcePath); String referrer = scheme.value() + "://" + host.value() + uri.value(); requestHeaders.put("referer", referrer); // Remember support for gzip encoding requestHeaders.put(headers.get("accept-encoding")); requestHeaders.put("x-spdy-push", "true"); return requestHeaders; }
private void convert(short fromVersion, short toVersion, Headers headers) { if (fromVersion != toVersion) { for (HTTPSPDYHeader httpHeader : HTTPSPDYHeader.values()) { Headers.Header header = headers.remove(httpHeader.name(fromVersion)); if (header != null) { String toName = httpHeader.name(toVersion); for (String value : header.values()) headers.add(toName, value); } } } }
@Override public void run() { if (!headers.isEmpty()) updateState(State.REQUEST); handle(); if (endRequest) performEndRequest(); } });
private Headers createPushHeaders(Headers.Header scheme, Headers.Header host, String pushResourcePath) { final Headers pushHeaders = new Headers(); if (version == SPDY.V2) pushHeaders.put(HTTPSPDYHeader.URI.name(version), scheme.value() + "://" + host.value() + pushResourcePath); else { pushHeaders.put(HTTPSPDYHeader.URI.name(version), pushResourcePath); pushHeaders.put(scheme); pushHeaders.put(host); } pushHeaders.put(HTTPSPDYHeader.STATUS.name(version), "200"); pushHeaders.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1"); return pushHeaders; }
Headers headers = new Headers(replyInfo.getHeaders(), false); headers.remove(HTTPSPDYHeader.SCHEME.name(version)); String status = headers.remove(HTTPSPDYHeader.STATUS.name(version)).value(); Matcher matcher = statusRegexp.matcher(status); matcher.matches(); generator.setResponse(code, reason); String httpVersion = headers.remove(HTTPSPDYHeader.VERSION.name(version)).value(); generator.setVersion(Integer.parseInt(httpVersion.replaceAll("\\D", ""))); Headers.Header host = headers.remove(HTTPSPDYHeader.HOST.name(version)); if (host != null) headers.put("host", host.value());
@Override public void messageComplete(long contentLength) throws IOException { if (stream == null) { assert content == null; if (headers.isEmpty()) proxyEngineSelector.onGoAway(session, new GoAwayInfo(0, SessionStatus.OK)); else syn(true); } else { stream.getStreamFrameListener().onData(stream, toDataInfo(content, true)); } headers.clear(); stream = null; content = null; }
private boolean isIfModifiedSinceHeaderPresent(Headers headers) { return headers.get("if-modified-since") != null; }
@Override protected void parsedHeader(Buffer name, Buffer value) throws IOException { String headerName = name.toString("UTF-8").toLowerCase(Locale.ENGLISH); String headerValue = value.toString("UTF-8"); switch (headerName) { case "host": headers.put(HTTPSPDYHeader.HOST.name(version), headerValue); break; default: headers.put(headerName, headerValue); break; } }
@Override public void onReply(final Stream stream, ReplyInfo replyInfo) { logger.debug("S -> P {} on {}", replyInfo, stream); short serverVersion = stream.getSession().getVersion(); Headers headers = new Headers(replyInfo.getHeaders(), false); addResponseProxyHeaders(stream, headers); customizeResponseHeaders(stream, headers); short clientVersion = this.clientStream.getSession().getVersion(); convert(serverVersion, clientVersion, headers); this.replyInfo = new ReplyInfo(headers, replyInfo.isClose()); if (replyInfo.isClose()) reply(stream); }
private void addViaHeader(Headers headers) { headers.add("Via", "http/1.1 " + getName()); }
private void respond(Stream stream, int status) { if (stream.isUnidirectional()) { stream.getSession().rst(new RstInfo(stream.getId(), StreamStatus.INTERNAL_ERROR)); } else { Headers headers = new Headers(); headers.put(HTTPSPDYHeader.STATUS.name(version), String.valueOf(status)); headers.put(HTTPSPDYHeader.VERSION.name(version), "HTTP/1.1"); stream.reply(new ReplyInfo(headers, true)); } }
private boolean isPushResource(String url, Headers responseHeaders) { for (Pattern pushRegexp : pushRegexps) { if (pushRegexp.matcher(url).matches()) { Headers.Header header = responseHeaders.get("content-type"); if (header == null) return true; String contentType = header.value().toLowerCase(Locale.ENGLISH); for (String pushContentType : pushContentTypes) if (contentType.startsWith(pushContentType)) return true; } } return false; }
@Override protected void startRequest(Buffer method, Buffer uri, Buffer httpVersion) throws IOException { SPDYServerConnector connector = (SPDYServerConnector)getConnector(); String scheme = connector.getSslContextFactory() != null ? "https" : "http"; headers.put(HTTPSPDYHeader.SCHEME.name(version), scheme); headers.put(HTTPSPDYHeader.METHOD.name(version), method.toString("UTF-8")); headers.put(HTTPSPDYHeader.URI.name(version), uri.toString("UTF-8")); headers.put(HTTPSPDYHeader.VERSION.name(version), httpVersion.toString("UTF-8")); }
@Override public StreamFrameListener onSyn(Stream serverStream, SynInfo serverSynInfo) { logger.debug("S -> P pushed {} on {}", serverSynInfo, serverStream); Headers headers = new Headers(serverSynInfo.getHeaders(), false); addResponseProxyHeaders(serverStream, headers); customizeResponseHeaders(serverStream, headers); Stream clientStream = (Stream)serverStream.getAssociatedStream().getAttribute(CLIENT_STREAM_ATTRIBUTE); convert(serverStream.getSession().getVersion(), clientStream.getSession().getVersion(), headers); StreamHandler handler = new StreamHandler(clientStream, serverSynInfo); serverStream.setAttribute(STREAM_HANDLER_ATTRIBUTE, handler); clientStream.syn(new SynInfo(headers, serverSynInfo.isClose()), getTimeout(), TimeUnit.MILLISECONDS, handler); return this; }
protected void addRequestProxyHeaders(Stream stream, Headers headers) { addViaHeader(headers); String address = (String)stream.getSession().getAttribute("org.eclipse.jetty.spdy.remoteAddress"); if (address != null) headers.add("X-Forwarded-For", address); }
@Override public void completeHeader(HttpFields fields, boolean allContentAdded) throws IOException Headers headers = new Headers(); String version = "HTTP/1.1"; headers.put(HTTPSPDYHeader.VERSION.name(ServerHTTPSPDYAsyncConnection.this.version), version); StringBuilder status = new StringBuilder().append(_status); if (_reason != null) status.append(" ").append(_reason.toString("UTF-8")); headers.put(HTTPSPDYHeader.STATUS.name(ServerHTTPSPDYAsyncConnection.this.version), status.toString()); logger.debug("HTTP < {} {}", version, status); String name = field.getName().toLowerCase(Locale.ENGLISH); String value = field.getValue(); headers.put(name, value); logger.debug("HTTP < {}: {}", name, value);
protected void reply(Stream stream, ReplyInfo replyInfo) { if (!stream.isUnidirectional()) stream.reply(replyInfo); if (replyInfo.getHeaders().get(HTTPSPDYHeader.STATUS.name(version)).value().startsWith("200") && !stream.isClosed()) { // We have a 200 OK with some content to send Headers.Header scheme = headers.get(HTTPSPDYHeader.SCHEME.name(version)); Headers.Header host = headers.get(HTTPSPDYHeader.HOST.name(version)); Headers.Header uri = headers.get(HTTPSPDYHeader.URI.name(version)); Set<String> pushResources = pushStrategy.apply(stream, headers, replyInfo.getHeaders()); for (String pushResourcePath : pushResources) { final Headers requestHeaders = createRequestHeaders(scheme, host, uri, pushResourcePath); final Headers pushHeaders = createPushHeaders(scheme, host, pushResourcePath); stream.syn(new SynInfo(pushHeaders, false), getMaxIdleTime(), TimeUnit.MILLISECONDS, new Handler.Adapter<Stream>() { @Override public void completed(Stream pushStream) { ServerHTTPSPDYAsyncConnection pushConnection = new ServerHTTPSPDYAsyncConnection(getConnector(), getEndPoint(), getServer(), version, connection, pushStrategy, pushStream); pushConnection.beginRequest(requestHeaders, true); } }); } } }
@Override public void onData(final Stream stream, final DataInfo dataInfo) { logger.debug("S -> P {} on {}", dataInfo, stream); if (replyInfo != null) { if (dataInfo.isClose()) replyInfo.getHeaders().put("content-length", String.valueOf(dataInfo.available())); reply(stream); } data(stream, dataInfo); }
public void beginRequest(final Headers headers, final boolean endRequest) { this.headers = headers.isEmpty() ? null : headers; post(new Runnable() { @Override public void run() { if (!headers.isEmpty()) updateState(State.REQUEST); handle(); if (endRequest) performEndRequest(); } }); }