package com.firefly.server.http2; import com.firefly.codec.http2.model.*; import com.firefly.codec.http2.model.MetaData.Request; import com.firefly.codec.http2.model.MetaData.Response; import com.firefly.codec.http2.stream.HTTPConnection; import com.firefly.codec.http2.stream.HTTPOutputStream; import com.firefly.utils.StringUtils; import com.firefly.utils.function.Action1; import com.firefly.utils.io.BufferUtils; import com.firefly.utils.json.Json; import com.firefly.utils.json.JsonArray; import com.firefly.utils.json.JsonObject; import java.nio.ByteBuffer; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; import java.util.function.Supplier; public class SimpleRequest { Request request; SimpleResponse response; HTTPConnection connection; Action1<ByteBuffer> content; Action1<SimpleRequest> contentComplete; Action1<SimpleRequest> messageComplete; List<ByteBuffer> requestBody = new ArrayList<>(); List<Cookie> cookies; String stringBody; ConcurrentHashMap<String, Object> attributes = new ConcurrentHashMap<>(); public SimpleRequest(Request request, Response response, HTTPOutputStream output) { this.request = request; response.setStatus(HttpStatus.OK_200); response.setHttpVersion(HttpVersion.HTTP_1_1); this.response = new SimpleResponse(response, output); } public HttpVersion getHttpVersion() { return request.getHttpVersion(); } public HttpFields getFields() { return request.getFields(); } public long getContentLength() { return getFields().getLongField(HttpHeader.CONTENT_LENGTH.asString()); } public Iterator<HttpField> iterator() { return request.iterator(); } public String getMethod() { return request.getMethod(); } public HttpURI getURI() { return request.getURI(); } public String getURIString() { return request.getURIString(); } public Supplier<HttpFields> getTrailerSupplier() { return request.getTrailerSupplier(); } public void forEach(Consumer<? super HttpField> action) { request.forEach(action); } public Spliterator<HttpField> spliterator() { return request.spliterator(); } public Object get(String key) { return attributes.get(key); } public Object put(String key, Object value) { return attributes.put(key, value); } public Object remove(String key) { return attributes.remove(key); } public ConcurrentHashMap<String, Object> getAttributes() { return attributes; } @Override public String toString() { return request.toString(); } public Request getRequest() { return request; } public SimpleResponse getResponse() { return response; } public SimpleResponse getAsyncResponse() { response.setAsynchronous(true); return response; } public HTTPConnection getConnection() { return connection; } public List<ByteBuffer> getRequestBody() { return requestBody; } public SimpleRequest content(Action1<ByteBuffer> content) { this.content = content; return this; } public SimpleRequest contentComplete(Action1<SimpleRequest> contentComplete) { this.contentComplete = contentComplete; return this; } public SimpleRequest messageComplete(Action1<SimpleRequest> messageComplete) { this.messageComplete = messageComplete; return this; } public String getStringBody(String charset) { if (stringBody == null) { stringBody = BufferUtils.toString(requestBody, charset); return stringBody; } else { return stringBody; } } public String getStringBody() { return getStringBody("UTF-8"); } public <T> T getJsonBody(Class<T> clazz) { return Json.toObject(getStringBody(), clazz); } public JsonObject getJsonObjectBody() { return Json.toJsonObject(getStringBody()); } public JsonArray getJsonArrayBody() { return Json.toJsonArray(getStringBody()); } public List<Cookie> getCookies() { if (cookies == null) { String v = request.getFields().get(HttpHeader.COOKIE); if (StringUtils.hasText(v)) { cookies = CookieParser.parseCookie(v); } } return cookies; } }