/** * Checks to see if the transfer encoding in a specified {@link HttpMessage} is chunked * * @param message The message to check * @return True if transfer encoding is chunked, otherwise false */ public static boolean isTransferEncodingChunked(HttpMessage message) { return message.headers().contains(Names.TRANSFER_ENCODING, Values.CHUNKED, true); }
public static boolean isContentLengthSet(HttpMessage m) { return m.headers().contains(Names.CONTENT_LENGTH); }
@Override public void writeRequested(ChannelHandlerContext ctx, MessageEvent e) throws Exception { if (e.getMessage() instanceof HttpResponse) { HttpResponse response = (HttpResponse) e.getMessage(); Integer id = ids.poll(); if (id != null && id.intValue() != NO_ID && !response.headers().contains(SpdyHttpHeaders.Names.STREAM_ID)) { SpdyHttpHeaders.setStreamId(response, id); } } super.writeRequested(ctx, e); }
@Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { if (e.getMessage() instanceof HttpMessage) { boolean contains = ((HttpMessage) e.getMessage()).headers().contains(SpdyHttpHeaders.Names.STREAM_ID); if (!contains) { ids.add(NO_ID); } else { ids.add(SpdyHttpHeaders.getStreamId((HttpMessage) e.getMessage())); } } else if (e.getMessage() instanceof SpdyRstStreamFrame) { // remove id from the queue ids.remove(((SpdyRstStreamFrame) e.getMessage()).getStreamId()); } super.messageReceived(ctx, e); }
/** * Returns the content length of the specified web socket message. If the * specified message is not a web socket message, {@code -1} is returned. */ private static int getWebSocketContentLength(HttpMessage message) { // WebSockset messages have constant content-lengths. HttpHeaders h = message.headers(); if (message instanceof HttpRequest) { HttpRequest req = (HttpRequest) message; if (HttpMethod.GET.equals(req.getMethod()) && h.contains(Names.SEC_WEBSOCKET_KEY1) && h.contains(Names.SEC_WEBSOCKET_KEY2)) { return 8; } } else if (message instanceof HttpResponse) { HttpResponse res = (HttpResponse) message; if (res.getStatus().getCode() == 101 && h.contains(Names.SEC_WEBSOCKET_ORIGIN) && h.contains(Names.SEC_WEBSOCKET_LOCATION)) { return 16; } } // Not a web socket message return -1; }
@Override protected boolean isContentAlwaysEmpty(HttpMessage msg) { // Unlike HTTP, RTSP always assumes zero-length body if Content-Length // header is absent. boolean empty = super.isContentAlwaysEmpty(msg); if (empty) { return true; } if (!msg.headers().contains(RtspHeaders.Names.CONTENT_LENGTH)) { return true; } return empty; } }
/** * Check if the given request is a multipart request * * @return True if the request is a Multipart request */ public static boolean isMultipart(HttpRequest request) throws ErrorDataDecoderException { if (request.headers().contains(HttpHeaders.Names.CONTENT_TYPE)) { return getMultipartDataBoundary(request.headers().get(HttpHeaders.Names.CONTENT_TYPE)) != null; } else { return false; } }
protected boolean isContentAlwaysEmpty(HttpMessage msg) { if (msg instanceof HttpResponse) { HttpResponse res = (HttpResponse) msg; int code = res.getStatus().getCode(); // Correctly handle return codes of 1xx. // // See: // - http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html Section 4.4 // - https://github.com/netty/netty/issues/222 if (code >= 100 && code < 200) { if (code == 101 && !res.headers().contains(HttpHeaders.Names.SEC_WEBSOCKET_ACCEPT)) { // It's Hixie 76 websocket handshake response return false; } return true; } switch (code) { case 204: case 205: case 304: return true; } } return false; }
/** * Returns {@code true} if and only if the specified message contains the * {@code "Expect: 100-continue"} header. */ public static boolean is100ContinueExpected(HttpMessage message) { // Expect: 100-continue is for requests only. if (!(message instanceof HttpRequest)) { return false; } // It works only on HTTP/1.1 or later. if (message.getProtocolVersion().compareTo(HttpVersion.HTTP_1_1) < 0) { return false; } // In most cases, there will be one or zero 'Expect' header. String value = message.headers().get(Names.EXPECT); if (value == null) { return false; } if (Values.CONTINUE.equalsIgnoreCase(value)) { return true; } // Multiple 'Expect' headers. Search through them. return message.headers().contains(Names.EXPECT, Values.CONTINUE, true); }
if (httpResponse.headers().contains(SpdyHttpHeaders.Names.ASSOCIATED_TO_STREAM_ID)) { SpdySynStreamFrame spdySynStreamFrame = createSynStreamFrame(httpResponse); currentStreamId = spdySynStreamFrame.getStreamId();
if (m.headers().contains(HttpHeaders.Names.CONTENT_LENGTH)) { m.headers().set( HttpHeaders.Names.CONTENT_LENGTH,
if (m.headers().contains(HttpHeaders.Names.CONTENT_LENGTH)) { m.headers().set( HttpHeaders.Names.CONTENT_LENGTH,
@Override public boolean containsKey(Object key) { return key instanceof String && httpHeaders.contains((String) key); }
headers.set(HttpHeaders.Names.COOKIE, CookieEncoder.encode(request.getCookies())); if (config.isCompressionEnforced() && !headers.contains(HttpHeaders.Names.ACCEPT_ENCODING)) headers.set(HttpHeaders.Names.ACCEPT_ENCODING, GZIP_DEFLATE); } else if (!headers.contains(HttpHeaders.Names.CONNECTION)) { String connectionHeaderValue = connectionHeader(allowConnectionPooling, httpVersion == HttpVersion.HTTP_1_1); if (connectionHeaderValue != null) if (!headers.contains(HttpHeaders.Names.HOST)) headers.set(HttpHeaders.Names.HOST, hostHeader(request, uri)); if (!headers.contains(HttpHeaders.Names.ACCEPT)) headers.set(HttpHeaders.Names.ACCEPT, "*/*"); if (!headers.contains(HttpHeaders.Names.USER_AGENT) && config.getUserAgent() != null) headers.set(HttpHeaders.Names.USER_AGENT, config.getUserAgent());
public static boolean accepts(HttpRequest request) { return request.headers().contains("range"); }
private void setHeaderField(HttpResponse resp, String headerField, String value, boolean override) { if (override || !resp.headers().contains(headerField)) { resp.headers().add(headerField, value); } }
public static boolean isModified(String etag, long last, HttpRequest nettyRequest) { if (nettyRequest.headers().contains(IF_NONE_MATCH)) { String browserEtag = nettyRequest.headers().get(IF_NONE_MATCH); if (browserEtag.equals(etag)) { return false; } return true; } if (nettyRequest.headers().contains(IF_MODIFIED_SINCE)) { String ifModifiedSince = nettyRequest.headers().get(IF_MODIFIED_SINCE); if (!StringUtils.isEmpty(ifModifiedSince)) { try { Date browserDate = Utils.getHttpDateFormatter().parse(ifModifiedSince); if (browserDate.getTime() >= last) { return false; } } catch (ParseException ex) { Logger.warn("Can't parse HTTP date", ex); } return true; } } return true; }
private static String getTargetURI(HttpClientChannel httpClientChannel) throws URISyntaxException { HttpChannelConfig httpClientConfig = httpClientChannel.getConfig(); HttpRequestForm requestForm = httpClientConfig.getRequestForm(); if (requestForm == null) { // See RFC-7230, section 5.3.1 origin-form and section 5.3.2 absolute-form // default to origin-form when Host header present, otherwise absolute-form if (httpClientConfig.hasWriteHeaders() && httpClientConfig.getWriteHeaders().contains(Names.HOST)) { requestForm = ORIGIN_FORM; } else { requestForm = ABSOLUTE_FORM; } } QueryStringEncoder query = httpClientConfig.getWriteQuery(); ChannelAddress httpRemoteAddress = httpClientChannel.getRemoteAddress(); URI httpRemoteURI = query != null ? query.toUri() : httpRemoteAddress.getLocation(); switch (requestForm) { case ORIGIN_FORM: String requestPath = httpRemoteURI.getPath(); String requestQuery = httpRemoteURI.getQuery(); return (requestQuery != null) ? format("%s?%s", requestPath, requestQuery) : requestPath; case ABSOLUTE_FORM: default: return httpRemoteURI.toString(); } } }