From 620bf6e3a29fc8c8c53a0286c7f0e87194b15234 Mon Sep 17 00:00:00 2001 From: andrewlalis Date: Wed, 1 Apr 2026 18:47:07 -0400 Subject: [PATCH] Commit ddoc since we can't build it. --- .gitea/workflows/deploy.yaml | 5 - .gitignore | 3 +- docs/ddoc/data/handy_http_data.html | 40 + docs/ddoc/data/handy_http_data.json.html | 38 + .../handy_http_data.json.readJsonBodyAs.html | 36 + .../handy_http_data.json.writeJsonBody.html | 38 + ...andy_http_data.multipart.MAX_ELEMENTS.html | 37 + ...ta.multipart.MultipartElement.content.html | 35 + ...a.multipart.MultipartElement.filename.html | 37 + ...ta.multipart.MultipartElement.headers.html | 35 + ..._http_data.multipart.MultipartElement.html | 39 + ..._data.multipart.MultipartElement.name.html | 37 + ....multipart.MultipartFormData.elements.html | 35 + ..._data.multipart.MultipartFormData.has.html | 37 + ...http_data.multipart.MultipartFormData.html | 38 + ...ta.multipart.MultipartFormatException.html | 37 + ...ltipart.MultipartFormatException.this.html | 35 + docs/ddoc/data/handy_http_data.multipart.html | 43 + ...data.multipart.parseMultipartFormData.html | 39 + ...multipart.readBodyAsMultipartFormData.html | 35 + docs/ddoc/data/handy_http_data.xml.html | 37 + .../data/handy_http_data.xml.readXMLBody.html | 35 + .../handy_http_data.xml.writeXMLBody.html | 36 + docs/ddoc/data/index.html | 35 + docs/ddoc/data/script.js | 180 ++ docs/ddoc/data/search-docs.html | 26 + docs/ddoc/data/search-docs.js | 421 +++++ docs/ddoc/data/search-results.html | 82 + docs/ddoc/data/style.css | 1661 +++++++++++++++++ ...ler.BaseHandlerRequestFilter.doFilter.html | 35 + ...ered_handler.BaseHandlerRequestFilter.html | 36 + ...handler.BaseHandlerRequestFilter.this.html | 35 + ...rs.filtered_handler.FilterChain.build.html | 36 + ...filtered_handler.FilterChain.doFilter.html | 38 + ...handlers.filtered_handler.FilterChain.html | 39 + ...ers.filtered_handler.FilterChain.this.html | 35 + ...ltered_handler.FilteredHandler.handle.html | 35 + ...lers.filtered_handler.FilteredHandler.html | 40 + ...ltered_handler.FilteredHandler.this.1.html | 38 + ...ltered_handler.FilteredHandler.this.2.html | 37 + ...filtered_handler.FilteredHandler.this.html | 1 + ...ed_handler.HttpRequestFilter.doFilter.html | 35 + ...rs.filtered_handler.HttpRequestFilter.html | 39 + .../handy_http_handlers.filtered_handler.html | 44 + docs/ddoc/handlers/handy_http_handlers.html | 40 + ...p_handlers.path_handler.DeleteMapping.html | 35 + ...rs.path_handler.DeleteMapping.pattern.html | 35 + ...http_handlers.path_handler.GetMapping.html | 35 + ...dlers.path_handler.GetMapping.pattern.html | 35 + ...tp_handlers.path_handler.PatchMapping.html | 35 + ...ers.path_handler.PatchMapping.pattern.html | 35 + ...path_handler.PathHandler.addMapping.1.html | 39 + ...path_handler.PathHandler.addMapping.2.html | 35 + ...path_handler.PathHandler.addMapping.3.html | 35 + ...path_handler.PathHandler.addMapping.4.html | 35 + ...path_handler.PathHandler.addMapping.5.html | 35 + ...s.path_handler.PathHandler.addMapping.html | 1 + ...dlers.path_handler.PathHandler.handle.html | 37 + ...ttp_handlers.path_handler.PathHandler.html | 48 + ..._handler.PathHandler.registerHandlers.html | 37 + ...andler.PathHandler.setNotFoundHandler.html | 36 + ...andlers.path_handler.PathHandler.this.html | 36 + ...s.path_handler.PathHandlerContextData.html | 36 + ...handler.PathHandlerContextData.params.html | 35 + ...h_handler.PathHandlerContextData.this.html | 35 + ...ttp_handlers.path_handler.PathMapping.html | 37 + ...dlers.path_handler.PathMapping.method.html | 35 + ...lers.path_handler.PathMapping.pattern.html | 35 + ...ttp_handlers.path_handler.PostMapping.html | 35 + ...lers.path_handler.PostMapping.pattern.html | 35 + ...http_handlers.path_handler.PutMapping.html | 35 + ...dlers.path_handler.PutMapping.pattern.html | 35 + ...tp_handlers.path_handler.getMethodBit.html | 35 + ..._handlers.path_handler.getPathParamAs.html | 35 + ...p_handlers.path_handler.getPathParams.html | 36 + .../handy_http_handlers.path_handler.html | 42 + ...ndlers.path_handler.methodMaskFromAll.html | 35 + ...rs.path_handler.methodMaskFromMethods.html | 35 + ...andlers.path_handler_sample_module.h1.html | 35 + ...andlers.path_handler_sample_module.h2.html | 35 + ...andlers.path_handler_sample_module.h3.html | 35 + ...p_handlers.path_handler_sample_module.html | 36 + docs/ddoc/handlers/index.html | 35 + docs/ddoc/handlers/script.js | 180 ++ docs/ddoc/handlers/search-docs.html | 26 + docs/ddoc/handlers/search-docs.js | 421 +++++ docs/ddoc/handlers/search-results.html | 106 ++ docs/ddoc/handlers/style.css | 1661 +++++++++++++++++ ...http_primitives.address.ClientAddress.html | 36 + ...ess.ClientAddress.ipv4InternetAddress.html | 35 + ...ess.ClientAddress.ipv6InternetAddress.html | 35 + ...imitives.address.ClientAddress.ofIPv4.html | 35 + ...imitives.address.ClientAddress.ofIPv6.html | 35 + ...es.address.ClientAddress.ofUnixSocket.html | 35 + ...itives.address.ClientAddress.toString.html | 35 + ...primitives.address.ClientAddress.type.html | 35 + ...dress.ClientAddress.unixSocketAddress.html | 35 + ...mitives.address.ClientAddress.unknown.html | 35 + ..._primitives.address.ClientAddressType.html | 35 + ...ves.address.IPv4InternetAddress.bytes.html | 35 + ...rimitives.address.IPv4InternetAddress.html | 36 + ...ives.address.IPv4InternetAddress.port.html | 35 + ...ves.address.IPv6InternetAddress.bytes.html | 35 + ...rimitives.address.IPv6InternetAddress.html | 36 + ...ives.address.IPv6InternetAddress.port.html | 35 + ..._primitives.address.UnixSocketAddress.html | 36 + ...itives.address.UnixSocketAddress.path.html | 35 + .../handy_http_primitives.address.html | 39 + ...uilder.ServerHttpRequestBuilder.build.html | 35 + ...erverHttpRequestBuilder.clientAddress.html | 35 + ....ServerHttpRequestBuilder.contextData.html | 35 + ...lder.ServerHttpRequestBuilder.headers.html | 35 + ...ives.builder.ServerHttpRequestBuilder.html | 35 + ....ServerHttpRequestBuilder.httpVersion.html | 35 + ....ServerHttpRequestBuilder.inputStream.html | 35 + ...ilder.ServerHttpRequestBuilder.method.html | 35 + ....ServerHttpRequestBuilder.queryParams.html | 35 + ....builder.ServerHttpRequestBuilder.url.html | 35 + ...r.ServerHttpRequestBuilder.withBody.1.html | 35 + ...r.ServerHttpRequestBuilder.withBody.2.html | 35 + ...der.ServerHttpRequestBuilder.withBody.html | 1 + ...rHttpRequestBuilder.withClientAddress.html | 35 + ...verHttpRequestBuilder.withContextData.html | 35 + ...r.ServerHttpRequestBuilder.withHeader.html | 35 + ...verHttpRequestBuilder.withInputStream.html | 35 + ...r.ServerHttpRequestBuilder.withMethod.html | 35 + ...rverHttpRequestBuilder.withQueryParam.html | 35 + ...lder.ServerHttpRequestBuilder.withUrl.html | 35 + ....ServerHttpRequestBuilder.withVersion.html | 35 + ...ilder.ServerHttpResponseBuilder.build.html | 35 + ...ves.builder.ServerHttpResponseBuilder.html | 35 + ...verHttpResponseBuilder.initialHeaders.html | 35 + ...rverHttpResponseBuilder.initialStatus.html | 35 + ...erverHttpResponseBuilder.outputStream.html | 35 + ....ServerHttpResponseBuilder.withHeader.html | 35 + ...rHttpResponseBuilder.withOutputStream.html | 35 + ....ServerHttpResponseBuilder.withStatus.html | 35 + .../handy_http_primitives.builder.html | 36 + ...ves.handler.HttpRequestHandler.handle.html | 36 + ...primitives.handler.HttpRequestHandler.html | 37 + ...tives.handler.HttpRequestHandler.of.1.html | 35 + ...tives.handler.HttpRequestHandler.of.2.html | 35 + ...mitives.handler.HttpRequestHandler.of.html | 1 + .../handy_http_primitives.handler.html | 37 + .../primitives/handy_http_primitives.html | 51 + ...ap.CaseInsensitiveStringMultiValueMap.html | 35 + ...tivalue_map.MultiValueMap.Builder.add.html | 35 + ...value_map.MultiValueMap.Builder.build.html | 35 + ....multivalue_map.MultiValueMap.Builder.html | 38 + ...es.multivalue_map.MultiValueMap.Entry.html | 36 + ...ultivalue_map.MultiValueMap.Entry.key.html | 35 + ...alue_map.MultiValueMap.Entry.toString.html | 35 + ...ivalue_map.MultiValueMap.Entry.values.html | 36 + ...ives.multivalue_map.MultiValueMap.add.html | 36 + ..._map.MultiValueMap.asAssociativeArray.html | 36 + ...es.multivalue_map.MultiValueMap.clear.html | 35 + ...multivalue_map.MultiValueMap.contains.html | 35 + ....MultiValueMap.fromAssociativeArray.1.html | 35 + ....MultiValueMap.fromAssociativeArray.2.html | 35 + ...ap.MultiValueMap.fromAssociativeArray.html | 1 + ...s.multivalue_map.MultiValueMap.getAll.html | 36 + ...multivalue_map.MultiValueMap.getFirst.html | 37 + ...imitives.multivalue_map.MultiValueMap.html | 55 + ...ves.multivalue_map.MultiValueMap.keys.html | 35 + ...s.multivalue_map.MultiValueMap.length.html | 35 + ....multivalue_map.MultiValueMap.opApply.html | 36 + ...value_map.MultiValueMap.opBinaryRight.html | 42 + ...ultivalue_map.MultiValueMap.opIndex.1.html | 36 + ...ultivalue_map.MultiValueMap.opIndex.2.html | 37 + ....multivalue_map.MultiValueMap.opIndex.html | 1 + ...s.multivalue_map.MultiValueMap.remove.html | 36 + ...multivalue_map.MultiValueMap.toString.html | 36 + ...es.multivalue_map.StringMultiValueMap.html | 36 + .../handy_http_primitives.multivalue_map.html | 39 + ...tp_primitives.optional.Optional.empty.html | 35 + ...ndy_http_primitives.optional.Optional.html | 37 + ...p_primitives.optional.Optional.isNull.html | 35 + ..._http_primitives.optional.Optional.of.html | 35 + ...p_primitives.optional.Optional.opCast.html | 38 + ...p_primitives.optional.Optional.orElse.html | 37 + ...tives.optional.Optional.orElseThrow.1.html | 35 + ...tives.optional.Optional.orElseThrow.2.html | 37 + ...mitives.optional.Optional.orElseThrow.html | 1 + ...tp_primitives.optional.Optional.value.html | 35 + .../handy_http_primitives.optional.html | 36 + ...http_primitives.optional.mapIfPresent.html | 36 + ...dy_http_primitives.request.HttpMethod.html | 35 + ...y_http_primitives.request.HttpVersion.html | 35 + ...ttp_primitives.request.QueryParameter.html | 35 + ...primitives.request.QueryParameter.key.html | 35 + ...mitives.request.QueryParameter.values.html | 35 + ...quest.ServerHttpRequest.clientAddress.html | 35 + ...request.ServerHttpRequest.contextData.html | 35 + ...request.ServerHttpRequest.getHeaderAs.html | 37 + ....request.ServerHttpRequest.getParamAs.html | 37 + ...ves.request.ServerHttpRequest.headers.html | 35 + ..._primitives.request.ServerHttpRequest.html | 42 + ...request.ServerHttpRequest.httpVersion.html | 35 + ...request.ServerHttpRequest.inputStream.html | 35 + ...ives.request.ServerHttpRequest.method.html | 35 + ...request.ServerHttpRequest.queryParams.html | 35 + ...es.request.ServerHttpRequest.readBody.html | 41 + ...est.ServerHttpRequest.readBodyAsBytes.html | 36 + ...st.ServerHttpRequest.readBodyAsString.html | 36 + ...mitives.request.ServerHttpRequest.url.html | 35 + .../handy_http_primitives.request.html | 37 + ...imitives.request.parseQueryParameters.html | 35 + ...http_primitives.response.ContentTypes.html | 35 + ...y_http_primitives.response.HttpStatus.html | 36 + ...imitives.response.HttpStatusException.html | 37 + ...s.response.HttpStatusException.status.html | 35 + ...s.response.HttpStatusException.this.1.html | 35 + ...s.response.HttpStatusException.this.2.html | 35 + ...s.response.HttpStatusException.this.3.html | 35 + ...ves.response.HttpStatusException.this.html | 1 + ...s.response.ServerHttpResponse.headers.html | 35 + ...rimitives.response.ServerHttpResponse.html | 36 + ...ponse.ServerHttpResponse.outputStream.html | 35 + ...es.response.ServerHttpResponse.status.html | 35 + ...nse.ServerHttpResponse.writeBodyBytes.html | 36 + ...se.ServerHttpResponse.writeBodyString.html | 36 + ...p_primitives.response.StatusInfo.code.html | 35 + ...y_http_primitives.response.StatusInfo.html | 35 + ...p_primitives.response.StatusInfo.text.html | 35 + .../handy_http_primitives.response.html | 40 + ...tp_primitives.testing.assertHasHeader.html | 35 + ..._http_primitives.testing.assertStatus.html | 35 + ...itives.testing.assertStatusBadRequest.html | 35 + ...mitives.testing.assertStatusForbidden.html | 35 + ...sting.assertStatusInternalServerError.html | 35 + ...imitives.testing.assertStatusNotFound.html | 35 + ...ttp_primitives.testing.assertStatusOk.html | 35 + ...ives.testing.assertStatusUnauthorized.html | 35 + .../handy_http_primitives.testing.html | 36 + docs/ddoc/primitives/index.html | 37 + docs/ddoc/primitives/script.js | 180 ++ docs/ddoc/primitives/search-docs.html | 26 + docs/ddoc/primitives/search-docs.js | 421 +++++ docs/ddoc/primitives/search-results.html | 132 ++ docs/ddoc/primitives/style.css | 1661 +++++++++++++++++ ...y_http_transport.helpers.consumeUntil.html | 36 + .../handy_http_transport.helpers.html | 38 + .../handy_http_transport.helpers.indexOf.html | 35 + ...dy_http_transport.helpers.stripSpaces.html | 36 + ...p_transport.helpers.writeUIntToBuffer.html | 36 + docs/ddoc/transport/handy_http_transport.html | 39 + ...sport.http1.epoll.Http1EpollTransport.html | 35 + ...http1.epoll.Http1EpollTransport.start.html | 35 + ....http1.epoll.Http1EpollTransport.this.html | 35 + ...dy_http_transport.http1.epoll.accept4.html | 35 + .../handy_http_transport.http1.epoll.html | 35 + .../transport/handy_http_transport.http1.html | 37 + ...ort.http1.photon.PhotonHttp1Transport.html | 38 + ...photon.PhotonHttp1Transport.runServer.html | 35 + ...ttp1.photon.PhotonHttp1Transport.stop.html | 35 + ...ttp1.photon.PhotonHttp1Transport.this.html | 35 + .../handy_http_transport.http1.photon.html | 38 + ...1.task_pool.Http1TransportConfig.host.html | 35 + ....http1.task_pool.Http1TransportConfig.html | 36 + ...1.task_pool.Http1TransportConfig.port.html | 35 + ...pool.Http1TransportConfig.workerCount.html | 35 + ...ttp1.task_pool.TaskPoolHttp1Transport.html | 38 + ...pool.TaskPoolHttp1Transport.runServer.html | 35 + ...task_pool.TaskPoolHttp1Transport.stop.html | 35 + ...task_pool.TaskPoolHttp1Transport.this.html | 36 + ...ansport.http1.task_pool.defaultConfig.html | 38 + .../handy_http_transport.http1.task_pool.html | 41 + ...nsport.http1.transport.Http1Transport.html | 36 + ...p1.transport.Http1Transport.isRunning.html | 35 + ...t.http1.transport.Http1Transport.port.html | 35 + ...ansport.Http1Transport.requestHandler.html | 35 + ...p1.transport.Http1Transport.runServer.html | 35 + ....http1.transport.Http1Transport.start.html | 35 + ...t.http1.transport.Http1Transport.stop.html | 35 + ...t.http1.transport.Http1Transport.this.html | 35 + ...ttp1.transport.HttpRequestParseResult.html | 35 + ..._transport.http1.transport.getAddress.html | 35 + ...ransport.http1.transport.handleClient.html | 38 + .../handy_http_transport.http1.transport.html | 41 + ...ransport.http1.transport.parseHeaders.html | 38 + ...sport.http1.transport.readHttpRequest.html | 35 + ...rt.http1.transport.testHttp1Transport.html | 37 + .../transport/handy_http_transport.http2.html | 35 + ...tp_transport.interfaces.HttpTransport.html | 35 + ...nsport.interfaces.HttpTransport.start.html | 35 + ...ansport.interfaces.HttpTransport.stop.html | 35 + .../handy_http_transport.interfaces.html | 37 + ...transport.interfaces.startInNewThread.html | 37 + ...esponseOutputStream.areHeadersFlushed.html | 36 + ...utput_stream.HttpResponseOutputStream.html | 41 + ..._stream.HttpResponseOutputStream.this.html | 35 + ...HttpResponseOutputStream.writeHeaders.html | 36 + ...ttpResponseOutputStream.writeToStream.html | 37 + ...http_transport.response_output_stream.html | 38 + docs/ddoc/transport/index.html | 35 + docs/ddoc/transport/script.js | 180 ++ docs/ddoc/transport/search-docs.html | 26 + docs/ddoc/transport/search-docs.js | 421 +++++ docs/ddoc/transport/search-results.html | 114 ++ docs/ddoc/transport/style.css | 1661 +++++++++++++++++ ...omponents.WebSocketBinaryMessage.conn.html | 35 + ...ets.components.WebSocketBinaryMessage.html | 35 + ...onents.WebSocketBinaryMessage.payload.html | 35 + ...components.WebSocketCloseMessage.conn.html | 35 + ...kets.components.WebSocketCloseMessage.html | 36 + ...ponents.WebSocketCloseMessage.message.html | 35 + ...ents.WebSocketCloseMessage.statusCode.html | 35 + ...onents.WebSocketException.__anonymous.html | 35 + ...sockets.components.WebSocketException.html | 38 + ...ts.components.WebSocketMessageHandler.html | 38 + ...bSocketMessageHandler.onBinaryMessage.html | 35 + ...ebSocketMessageHandler.onCloseMessage.html | 36 + ...cketMessageHandler.onConnectionClosed.html | 35 + ...essageHandler.onConnectionEstablished.html | 35 + ...WebSocketMessageHandler.onTextMessage.html | 35 + ....components.WebSocketTextMessage.conn.html | 35 + ...ckets.components.WebSocketTextMessage.html | 35 + ...mponents.WebSocketTextMessage.payload.html | 35 + .../handy_http_websockets.components.html | 39 + ....connection.WebSocketConnection.close.html | 35 + ...WebSocketConnection.getMessageHandler.html | 35 + ...WebSocketConnection.getRequestHandler.html | 36 + ...ockets.connection.WebSocketConnection.html | 38 + ...ets.connection.WebSocketConnection.id.html | 35 + ...ction.WebSocketConnection.inputStream.html | 35 + ...tion.WebSocketConnection.outputStream.html | 35 + ...WebSocketConnection.sendBinaryMessage.html | 35 + ....WebSocketConnection.sendCloseMessage.html | 36 + ...n.WebSocketConnection.sendTextMessage.html | 35 + ...s.connection.WebSocketConnection.this.html | 35 + .../handy_http_websockets.connection.html | 36 + ...ockets.frame.WebSocketCloseStatusCode.html | 36 + ...ts.frame.WebSocketFrame.finalFragment.html | 35 + ..._http_websockets.frame.WebSocketFrame.html | 36 + ...ebsockets.frame.WebSocketFrame.opcode.html | 35 + ...bsockets.frame.WebSocketFrame.payload.html | 35 + ...websockets.frame.WebSocketFrameOpcode.html | 36 + .../handy_http_websockets.frame.html | 41 + ...ebsockets.frame.receiveWebSocketFrame.html | 35 + ...ockets.frame.sendWebSocketBinaryFrame.html | 35 + ...sockets.frame.sendWebSocketCloseFrame.html | 35 + ...p_websockets.frame.sendWebSocketFrame.html | 35 + ...bsockets.frame.sendWebSocketPingFrame.html | 35 + ...bsockets.frame.sendWebSocketPongFrame.html | 35 + ...bsockets.frame.sendWebSocketTextFrame.html | 35 + ...WebSocketRequestHandler.addConnection.html | 35 + ...r.WebSocketRequestHandler.broadcast.1.html | 35 + ...r.WebSocketRequestHandler.broadcast.2.html | 35 + ...ler.WebSocketRequestHandler.broadcast.html | 1 + ...bSocketRequestHandler.connectionCount.html | 35 + ...andler.WebSocketRequestHandler.handle.html | 38 + ...ckets.handler.WebSocketRequestHandler.html | 44 + ...SocketRequestHandler.removeConnection.html | 37 + ....handler.WebSocketRequestHandler.this.html | 36 + .../handy_http_websockets.handler.html | 38 + .../websockets/handy_http_websockets.html | 42 + docs/ddoc/websockets/index.html | 35 + docs/ddoc/websockets/script.js | 180 ++ docs/ddoc/websockets/search-docs.html | 26 + docs/ddoc/websockets/search-docs.js | 421 +++++ docs/ddoc/websockets/search-results.html | 90 + docs/ddoc/websockets/style.css | 1661 +++++++++++++++++ 362 files changed, 23740 insertions(+), 7 deletions(-) create mode 100644 docs/ddoc/data/handy_http_data.html create mode 100644 docs/ddoc/data/handy_http_data.json.html create mode 100644 docs/ddoc/data/handy_http_data.json.readJsonBodyAs.html create mode 100644 docs/ddoc/data/handy_http_data.json.writeJsonBody.html create mode 100644 docs/ddoc/data/handy_http_data.multipart.MAX_ELEMENTS.html create mode 100644 docs/ddoc/data/handy_http_data.multipart.MultipartElement.content.html create mode 100644 docs/ddoc/data/handy_http_data.multipart.MultipartElement.filename.html create mode 100644 docs/ddoc/data/handy_http_data.multipart.MultipartElement.headers.html create mode 100644 docs/ddoc/data/handy_http_data.multipart.MultipartElement.html create mode 100644 docs/ddoc/data/handy_http_data.multipart.MultipartElement.name.html create mode 100644 docs/ddoc/data/handy_http_data.multipart.MultipartFormData.elements.html create mode 100644 docs/ddoc/data/handy_http_data.multipart.MultipartFormData.has.html create mode 100644 docs/ddoc/data/handy_http_data.multipart.MultipartFormData.html create mode 100644 docs/ddoc/data/handy_http_data.multipart.MultipartFormatException.html create mode 100644 docs/ddoc/data/handy_http_data.multipart.MultipartFormatException.this.html create mode 100644 docs/ddoc/data/handy_http_data.multipart.html create mode 100644 docs/ddoc/data/handy_http_data.multipart.parseMultipartFormData.html create mode 100644 docs/ddoc/data/handy_http_data.multipart.readBodyAsMultipartFormData.html create mode 100644 docs/ddoc/data/handy_http_data.xml.html create mode 100644 docs/ddoc/data/handy_http_data.xml.readXMLBody.html create mode 100644 docs/ddoc/data/handy_http_data.xml.writeXMLBody.html create mode 100644 docs/ddoc/data/index.html create mode 100644 docs/ddoc/data/script.js create mode 100644 docs/ddoc/data/search-docs.html create mode 100644 docs/ddoc/data/search-docs.js create mode 100644 docs/ddoc/data/search-results.html create mode 100644 docs/ddoc/data/style.css create mode 100644 docs/ddoc/handlers/handy_http_handlers.filtered_handler.BaseHandlerRequestFilter.doFilter.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.filtered_handler.BaseHandlerRequestFilter.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.filtered_handler.BaseHandlerRequestFilter.this.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilterChain.build.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilterChain.doFilter.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilterChain.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilterChain.this.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilteredHandler.handle.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilteredHandler.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilteredHandler.this.1.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilteredHandler.this.2.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilteredHandler.this.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.filtered_handler.HttpRequestFilter.doFilter.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.filtered_handler.HttpRequestFilter.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.filtered_handler.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.DeleteMapping.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.DeleteMapping.pattern.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.GetMapping.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.GetMapping.pattern.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PatchMapping.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PatchMapping.pattern.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.1.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.2.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.3.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.4.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.5.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.handle.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.registerHandlers.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.setNotFoundHandler.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.this.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandlerContextData.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandlerContextData.params.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandlerContextData.this.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PathMapping.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PathMapping.method.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PathMapping.pattern.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PostMapping.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PostMapping.pattern.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PutMapping.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.PutMapping.pattern.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.getMethodBit.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.getPathParamAs.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.getPathParams.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.methodMaskFromAll.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler.methodMaskFromMethods.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler_sample_module.h1.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler_sample_module.h2.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler_sample_module.h3.html create mode 100644 docs/ddoc/handlers/handy_http_handlers.path_handler_sample_module.html create mode 100644 docs/ddoc/handlers/index.html create mode 100644 docs/ddoc/handlers/script.js create mode 100644 docs/ddoc/handlers/search-docs.html create mode 100644 docs/ddoc/handlers/search-docs.js create mode 100644 docs/ddoc/handlers/search-results.html create mode 100644 docs/ddoc/handlers/style.css create mode 100644 docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.ipv4InternetAddress.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.ipv6InternetAddress.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.ofIPv4.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.ofIPv6.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.ofUnixSocket.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.toString.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.type.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.unixSocketAddress.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.unknown.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.address.ClientAddressType.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.address.IPv4InternetAddress.bytes.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.address.IPv4InternetAddress.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.address.IPv4InternetAddress.port.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.address.IPv6InternetAddress.bytes.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.address.IPv6InternetAddress.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.address.IPv6InternetAddress.port.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.address.UnixSocketAddress.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.address.UnixSocketAddress.path.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.address.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.build.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.clientAddress.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.contextData.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.headers.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.httpVersion.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.inputStream.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.method.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.queryParams.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.url.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withBody.1.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withBody.2.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withBody.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withClientAddress.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withContextData.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withHeader.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withInputStream.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withMethod.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withQueryParam.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withUrl.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withVersion.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.build.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.initialHeaders.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.initialStatus.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.outputStream.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.withHeader.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.withOutputStream.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.withStatus.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.builder.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.handler.HttpRequestHandler.handle.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.handler.HttpRequestHandler.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.handler.HttpRequestHandler.of.1.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.handler.HttpRequestHandler.of.2.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.handler.HttpRequestHandler.of.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.handler.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.CaseInsensitiveStringMultiValueMap.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Builder.add.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Builder.build.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Builder.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Entry.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Entry.key.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Entry.toString.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Entry.values.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.add.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.asAssociativeArray.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.clear.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.contains.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.fromAssociativeArray.1.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.fromAssociativeArray.2.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.fromAssociativeArray.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.getAll.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.getFirst.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.keys.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.length.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.opApply.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.opBinaryRight.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.opIndex.1.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.opIndex.2.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.opIndex.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.remove.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.toString.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.StringMultiValueMap.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.multivalue_map.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.optional.Optional.empty.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.optional.Optional.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.optional.Optional.isNull.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.optional.Optional.of.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.optional.Optional.opCast.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.optional.Optional.orElse.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.optional.Optional.orElseThrow.1.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.optional.Optional.orElseThrow.2.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.optional.Optional.orElseThrow.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.optional.Optional.value.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.optional.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.optional.mapIfPresent.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.request.HttpMethod.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.request.HttpVersion.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.request.QueryParameter.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.request.QueryParameter.key.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.request.QueryParameter.values.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.clientAddress.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.contextData.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.getHeaderAs.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.getParamAs.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.headers.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.httpVersion.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.inputStream.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.method.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.queryParams.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.readBody.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.readBodyAsBytes.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.readBodyAsString.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.url.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.request.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.request.parseQueryParameters.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.response.ContentTypes.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.response.HttpStatus.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.status.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.this.1.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.this.2.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.this.3.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.this.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.headers.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.outputStream.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.status.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.writeBodyBytes.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.writeBodyString.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.response.StatusInfo.code.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.response.StatusInfo.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.response.StatusInfo.text.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.response.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.testing.assertHasHeader.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.testing.assertStatus.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.testing.assertStatusBadRequest.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.testing.assertStatusForbidden.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.testing.assertStatusInternalServerError.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.testing.assertStatusNotFound.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.testing.assertStatusOk.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.testing.assertStatusUnauthorized.html create mode 100644 docs/ddoc/primitives/handy_http_primitives.testing.html create mode 100644 docs/ddoc/primitives/index.html create mode 100644 docs/ddoc/primitives/script.js create mode 100644 docs/ddoc/primitives/search-docs.html create mode 100644 docs/ddoc/primitives/search-docs.js create mode 100644 docs/ddoc/primitives/search-results.html create mode 100644 docs/ddoc/primitives/style.css create mode 100644 docs/ddoc/transport/handy_http_transport.helpers.consumeUntil.html create mode 100644 docs/ddoc/transport/handy_http_transport.helpers.html create mode 100644 docs/ddoc/transport/handy_http_transport.helpers.indexOf.html create mode 100644 docs/ddoc/transport/handy_http_transport.helpers.stripSpaces.html create mode 100644 docs/ddoc/transport/handy_http_transport.helpers.writeUIntToBuffer.html create mode 100644 docs/ddoc/transport/handy_http_transport.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.epoll.Http1EpollTransport.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.epoll.Http1EpollTransport.start.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.epoll.Http1EpollTransport.this.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.epoll.accept4.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.epoll.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.photon.PhotonHttp1Transport.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.photon.PhotonHttp1Transport.runServer.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.photon.PhotonHttp1Transport.stop.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.photon.PhotonHttp1Transport.this.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.photon.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.task_pool.Http1TransportConfig.host.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.task_pool.Http1TransportConfig.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.task_pool.Http1TransportConfig.port.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.task_pool.Http1TransportConfig.workerCount.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.task_pool.TaskPoolHttp1Transport.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.task_pool.TaskPoolHttp1Transport.runServer.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.task_pool.TaskPoolHttp1Transport.stop.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.task_pool.TaskPoolHttp1Transport.this.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.task_pool.defaultConfig.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.task_pool.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.isRunning.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.port.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.requestHandler.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.runServer.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.start.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.stop.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.this.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.transport.HttpRequestParseResult.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.transport.getAddress.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.transport.handleClient.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.transport.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.transport.parseHeaders.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.transport.readHttpRequest.html create mode 100644 docs/ddoc/transport/handy_http_transport.http1.transport.testHttp1Transport.html create mode 100644 docs/ddoc/transport/handy_http_transport.http2.html create mode 100644 docs/ddoc/transport/handy_http_transport.interfaces.HttpTransport.html create mode 100644 docs/ddoc/transport/handy_http_transport.interfaces.HttpTransport.start.html create mode 100644 docs/ddoc/transport/handy_http_transport.interfaces.HttpTransport.stop.html create mode 100644 docs/ddoc/transport/handy_http_transport.interfaces.html create mode 100644 docs/ddoc/transport/handy_http_transport.interfaces.startInNewThread.html create mode 100644 docs/ddoc/transport/handy_http_transport.response_output_stream.HttpResponseOutputStream.areHeadersFlushed.html create mode 100644 docs/ddoc/transport/handy_http_transport.response_output_stream.HttpResponseOutputStream.html create mode 100644 docs/ddoc/transport/handy_http_transport.response_output_stream.HttpResponseOutputStream.this.html create mode 100644 docs/ddoc/transport/handy_http_transport.response_output_stream.HttpResponseOutputStream.writeHeaders.html create mode 100644 docs/ddoc/transport/handy_http_transport.response_output_stream.HttpResponseOutputStream.writeToStream.html create mode 100644 docs/ddoc/transport/handy_http_transport.response_output_stream.html create mode 100644 docs/ddoc/transport/index.html create mode 100644 docs/ddoc/transport/script.js create mode 100644 docs/ddoc/transport/search-docs.html create mode 100644 docs/ddoc/transport/search-docs.js create mode 100644 docs/ddoc/transport/search-results.html create mode 100644 docs/ddoc/transport/style.css create mode 100644 docs/ddoc/websockets/handy_http_websockets.components.WebSocketBinaryMessage.conn.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.components.WebSocketBinaryMessage.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.components.WebSocketBinaryMessage.payload.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.components.WebSocketCloseMessage.conn.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.components.WebSocketCloseMessage.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.components.WebSocketCloseMessage.message.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.components.WebSocketCloseMessage.statusCode.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.components.WebSocketException.__anonymous.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.components.WebSocketException.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.onBinaryMessage.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.onCloseMessage.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.onConnectionClosed.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.onConnectionEstablished.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.onTextMessage.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.components.WebSocketTextMessage.conn.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.components.WebSocketTextMessage.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.components.WebSocketTextMessage.payload.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.components.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.close.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.getMessageHandler.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.getRequestHandler.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.id.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.inputStream.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.outputStream.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.sendBinaryMessage.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.sendCloseMessage.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.sendTextMessage.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.this.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.connection.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.frame.WebSocketCloseStatusCode.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.frame.WebSocketFrame.finalFragment.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.frame.WebSocketFrame.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.frame.WebSocketFrame.opcode.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.frame.WebSocketFrame.payload.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.frame.WebSocketFrameOpcode.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.frame.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.frame.receiveWebSocketFrame.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketBinaryFrame.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketCloseFrame.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketFrame.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketPingFrame.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketPongFrame.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketTextFrame.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.addConnection.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.broadcast.1.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.broadcast.2.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.broadcast.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.connectionCount.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.handle.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.removeConnection.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.this.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.handler.html create mode 100644 docs/ddoc/websockets/handy_http_websockets.html create mode 100644 docs/ddoc/websockets/index.html create mode 100644 docs/ddoc/websockets/script.js create mode 100644 docs/ddoc/websockets/search-docs.html create mode 100644 docs/ddoc/websockets/search-docs.js create mode 100644 docs/ddoc/websockets/search-results.html create mode 100644 docs/ddoc/websockets/style.css diff --git a/.gitea/workflows/deploy.yaml b/.gitea/workflows/deploy.yaml index 4c94041..56c9bb7 100644 --- a/.gitea/workflows/deploy.yaml +++ b/.gitea/workflows/deploy.yaml @@ -13,11 +13,6 @@ jobs: with: key: ${{ secrets.DEPLOY_KEY }} known_hosts: ${{ secrets.SSH_HOST }} - - uses: dlang-community/setup-dlang@v2 - with: - compiler: ldc-latest - - name: Build DDoc - run: ./ddoc-build.sh - uses: actions/setup-python@v6 with: python-version: '3.12' diff --git a/.gitignore b/.gitignore index 7d87afd..d290a89 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,4 @@ site/ .cache/ # Ignore working dir for ddoc building. -.ddoc/ -docs/ddoc/ \ No newline at end of file +.ddoc/ \ No newline at end of file diff --git a/docs/ddoc/data/handy_http_data.html b/docs/ddoc/data/handy_http_data.html new file mode 100644 index 0000000..583bfaf --- /dev/null +++ b/docs/ddoc/data/handy_http_data.html @@ -0,0 +1,40 @@ + + + + handy_http_data (handy_http_data) + + + + + + + + + + +
+
+

handy_http_data

Undocumented in source.

Modules

json
module handy_http_data.json

Defines functions to read and write JSON values when handling HTTP requests.

multipart
module handy_http_data.multipart

Defines data structures and parsing methods for dealing with multipart +encoded request bodies.

xml
module handy_http_data.xml

Defines functions for reading and writing XML content while handling HTTP +requests, using the dxml library: https://code.dlang.org/packages/dxml

Public Imports

handy_http_data.json
public +import handy_http_data.json;
Undocumented in source.
handy_http_data.multipart
public +import handy_http_data.multipart;
Undocumented in source.
handy_http_data.xml
public +import handy_http_data.xml;
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/data/handy_http_data.json.html b/docs/ddoc/data/handy_http_data.json.html new file mode 100644 index 0000000..b25472f --- /dev/null +++ b/docs/ddoc/data/handy_http_data.json.html @@ -0,0 +1,38 @@ + + + + handy_http_data.json (handy_http_data.json) + + + + + + + + + + +
+
+

handy_http_data.json

Defines functions to read and write JSON values when handling HTTP requests.

Members

Functions

readJsonBodyAs
T readJsonBodyAs(ServerHttpRequest request)

Reads a JSON value from the body of the given HTTP request, parsing it using +the ASDF library according to the template type T.

writeJsonBody
void writeJsonBody(ServerHttpResponse response, T bodyContent)

Writes a JSON value to the body of the given HTTP response, serializing it +using the ASDF library. Will also set Content-Type and Content-Length +headers before writing.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/data/handy_http_data.json.readJsonBodyAs.html b/docs/ddoc/data/handy_http_data.json.readJsonBodyAs.html new file mode 100644 index 0000000..c5cf365 --- /dev/null +++ b/docs/ddoc/data/handy_http_data.json.readJsonBodyAs.html @@ -0,0 +1,36 @@ + + + + readJsonBodyAs (handy_http_data.json.readJsonBodyAs) + + + + + + + + + + +
+
+

readJsonBodyAs

Reads a JSON value from the body of the given HTTP request, parsing it using +the ASDF library according to the template type T.

Throws a BAD_REQUEST HttpStatusException if deserialization fails.

T
readJsonBodyAs
(
T
)
(
ref ServerHttpRequest request
)

Parameters

request ServerHttpRequest

The request to read the JSON from.

Return Value

Type: T

The value that was read.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/data/handy_http_data.json.writeJsonBody.html b/docs/ddoc/data/handy_http_data.json.writeJsonBody.html new file mode 100644 index 0000000..1fe612d --- /dev/null +++ b/docs/ddoc/data/handy_http_data.json.writeJsonBody.html @@ -0,0 +1,38 @@ + + + + writeJsonBody (handy_http_data.json.writeJsonBody) + + + + + + + + + + +
+
+

writeJsonBody

Writes a JSON value to the body of the given HTTP response, serializing it +using the ASDF library. Will also set Content-Type and Content-Length +headers before writing.

Throws an INTERNAL_SERVER_ERROR HttpStatusException if serialization or +writing fails.

void
writeJsonBody
(
T
)
(
ref ServerHttpResponse response
,)

Parameters

response ServerHttpResponse

The response to write to.

bodyContent T

The content to write.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/data/handy_http_data.multipart.MAX_ELEMENTS.html b/docs/ddoc/data/handy_http_data.multipart.MAX_ELEMENTS.html new file mode 100644 index 0000000..c3dd5fb --- /dev/null +++ b/docs/ddoc/data/handy_http_data.multipart.MAX_ELEMENTS.html @@ -0,0 +1,37 @@ + + + + MAX_ELEMENTS (handy_http_data.multipart.MAX_ELEMENTS) + + + + + + + + + + +
+
+

MAX_ELEMENTS

The maximum number of parts to read in a multipart/form-data body. This is +declared as a safety measure to avoid infinite reading of malicious or +corrupted payloads.

const
auto MAX_ELEMENTS = 1024;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/data/handy_http_data.multipart.MultipartElement.content.html b/docs/ddoc/data/handy_http_data.multipart.MultipartElement.content.html new file mode 100644 index 0000000..d41eec9 --- /dev/null +++ b/docs/ddoc/data/handy_http_data.multipart.MultipartElement.content.html @@ -0,0 +1,35 @@ + + + + MultipartElement.content (handy_http_data.multipart.MultipartElement.content) + + + + + + + + + + +
+
+

MultipartElement.content

The body content of this element.

struct MultipartElement
string content;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/data/handy_http_data.multipart.MultipartElement.filename.html b/docs/ddoc/data/handy_http_data.multipart.MultipartElement.filename.html new file mode 100644 index 0000000..3842a45 --- /dev/null +++ b/docs/ddoc/data/handy_http_data.multipart.MultipartElement.filename.html @@ -0,0 +1,37 @@ + + + + MultipartElement.filename (handy_http_data.multipart.MultipartElement.filename) + + + + + + + + + + +
+
+

MultipartElement.filename

The filename of this element, as declared by this part's +Content-Disposition header filename property. Note that this may be +null if no filename exists.

struct MultipartElement
Optional!string filename;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/data/handy_http_data.multipart.MultipartElement.headers.html b/docs/ddoc/data/handy_http_data.multipart.MultipartElement.headers.html new file mode 100644 index 0000000..80427bc --- /dev/null +++ b/docs/ddoc/data/handy_http_data.multipart.MultipartElement.headers.html @@ -0,0 +1,35 @@ + + + + MultipartElement.headers (handy_http_data.multipart.MultipartElement.headers) + + + + + + + + + + +
+
+

MultipartElement.headers

The headers that were present with this element.

struct MultipartElement
string[string] headers;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/data/handy_http_data.multipart.MultipartElement.html b/docs/ddoc/data/handy_http_data.multipart.MultipartElement.html new file mode 100644 index 0000000..0619400 --- /dev/null +++ b/docs/ddoc/data/handy_http_data.multipart.MultipartElement.html @@ -0,0 +1,39 @@ + + + + MultipartElement (handy_http_data.multipart.MultipartElement) + + + + + + + + + + +
+
+

MultipartElement

A single element that's part of a multipart/form-data body.

Members

Variables

content
string content;

The body content of this element.

filename
Optional!string filename;

The filename of this element, as declared by this part's +Content-Disposition header filename property. Note that this may be +null if no filename exists.

headers
string[string] headers;

The headers that were present with this element.

name
string name;

The name of this element, as declared by this part's Content-Disposition +header name property. There is no guarantee that this name is unique +among all elements.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/data/handy_http_data.multipart.MultipartElement.name.html b/docs/ddoc/data/handy_http_data.multipart.MultipartElement.name.html new file mode 100644 index 0000000..239b5ac --- /dev/null +++ b/docs/ddoc/data/handy_http_data.multipart.MultipartElement.name.html @@ -0,0 +1,37 @@ + + + + MultipartElement.name (handy_http_data.multipart.MultipartElement.name) + + + + + + + + + + +
+
+

MultipartElement.name

The name of this element, as declared by this part's Content-Disposition +header name property. There is no guarantee that this name is unique +among all elements.

struct MultipartElement
string name;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/data/handy_http_data.multipart.MultipartFormData.elements.html b/docs/ddoc/data/handy_http_data.multipart.MultipartFormData.elements.html new file mode 100644 index 0000000..671920a --- /dev/null +++ b/docs/ddoc/data/handy_http_data.multipart.MultipartFormData.elements.html @@ -0,0 +1,35 @@ + + + + MultipartFormData.elements (handy_http_data.multipart.MultipartFormData.elements) + + + + + + + + + + +
+
+

MultipartFormData.elements

Undocumented in source.
struct MultipartFormData
MultipartElement[] elements;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/data/handy_http_data.multipart.MultipartFormData.has.html b/docs/ddoc/data/handy_http_data.multipart.MultipartFormData.has.html new file mode 100644 index 0000000..d3c0705 --- /dev/null +++ b/docs/ddoc/data/handy_http_data.multipart.MultipartFormData.has.html @@ -0,0 +1,37 @@ + + + + MultipartFormData.has (handy_http_data.multipart.MultipartFormData.has) + + + + + + + + + + +
+
+

MultipartFormData.has

Determines if this form-data has an element with the given name. This +is case-sensitive. Note that there may be more than one element with a +given name.

struct MultipartFormData
const
bool
has
()

Parameters

elementName string

The name of the element to search for.

Return Value

Type: bool

True if this form-data has such an element.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/data/handy_http_data.multipart.MultipartFormData.html b/docs/ddoc/data/handy_http_data.multipart.MultipartFormData.html new file mode 100644 index 0000000..088b9a6 --- /dev/null +++ b/docs/ddoc/data/handy_http_data.multipart.MultipartFormData.html @@ -0,0 +1,38 @@ + + + + MultipartFormData (handy_http_data.multipart.MultipartFormData) + + + + + + + + + + +
+
+

MultipartFormData

A multipart/form-data body containing multiple elements, and some helper +methods for those elements.

Members

Functions

has
bool has(string elementName)

Determines if this form-data has an element with the given name. This +is case-sensitive. Note that there may be more than one element with a +given name.

Variables

elements
MultipartElement[] elements;
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/data/handy_http_data.multipart.MultipartFormatException.html b/docs/ddoc/data/handy_http_data.multipart.MultipartFormatException.html new file mode 100644 index 0000000..074f4e5 --- /dev/null +++ b/docs/ddoc/data/handy_http_data.multipart.MultipartFormatException.html @@ -0,0 +1,37 @@ + + + + MultipartFormatException (handy_http_data.multipart.MultipartFormatException) + + + + + + + + + + +
+
+

MultipartFormatException

An exception that's thrown if parsing multipart/form-data fails due to +invalid formatting or unexpected characters. This is a sub-class of the +HttpStatusException, with each multipart exception being a BAD_REQUEST.

class MultipartFormatException : HttpStatusException {}

Constructors

this
this(string message)
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/data/handy_http_data.multipart.MultipartFormatException.this.html b/docs/ddoc/data/handy_http_data.multipart.MultipartFormatException.this.html new file mode 100644 index 0000000..669915a --- /dev/null +++ b/docs/ddoc/data/handy_http_data.multipart.MultipartFormatException.this.html @@ -0,0 +1,35 @@ + + + + MultipartFormatException.this (handy_http_data.multipart.MultipartFormatException.this) + + + + + + + + + + +
+
+

MultipartFormatException.this

Undocumented in source.
class MultipartFormatException
this
(
string message
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/data/handy_http_data.multipart.html b/docs/ddoc/data/handy_http_data.multipart.html new file mode 100644 index 0000000..a96bc5b --- /dev/null +++ b/docs/ddoc/data/handy_http_data.multipart.html @@ -0,0 +1,43 @@ + + + + handy_http_data.multipart (handy_http_data.multipart) + + + + + + + + + + +
+
+

handy_http_data.multipart

Defines data structures and parsing methods for dealing with multipart +encoded request bodies.

Members

Classes

MultipartFormatException
class MultipartFormatException

An exception that's thrown if parsing multipart/form-data fails due to +invalid formatting or unexpected characters. This is a sub-class of the +HttpStatusException, with each multipart exception being a BAD_REQUEST.

Functions

parseMultipartFormData
MultipartFormData parseMultipartFormData(string content, string boundary)

A simple linear parser for multipart/form-data encoded content. Reads a +series of elements separated by a given boundary. An exception is thrown +if the given content doesn't conform to standard multipart format.

readBodyAsMultipartFormData
MultipartFormData readBodyAsMultipartFormData(ServerHttpRequest request, bool allowInfiniteRead)

Reads a request's body as multipart/form-data encoded elements.

Structs

MultipartElement
struct MultipartElement

A single element that's part of a multipart/form-data body.

MultipartFormData
struct MultipartFormData

A multipart/form-data body containing multiple elements, and some helper +methods for those elements.

Variables

MAX_ELEMENTS
auto MAX_ELEMENTS;

The maximum number of parts to read in a multipart/form-data body. This is +declared as a safety measure to avoid infinite reading of malicious or +corrupted payloads.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/data/handy_http_data.multipart.parseMultipartFormData.html b/docs/ddoc/data/handy_http_data.multipart.parseMultipartFormData.html new file mode 100644 index 0000000..d586ec8 --- /dev/null +++ b/docs/ddoc/data/handy_http_data.multipart.parseMultipartFormData.html @@ -0,0 +1,39 @@ + + + + parseMultipartFormData (handy_http_data.multipart.parseMultipartFormData) + + + + + + + + + + +
+
+

parseMultipartFormData

A simple linear parser for multipart/form-data encoded content. Reads a +series of elements separated by a given boundary. An exception is thrown +if the given content doesn't conform to standard multipart format.

The main purpose of this function is to parse the multipart boundaries and +hand-off parsing of each element to readElement.

parseMultipartFormData
(
string content
,
string boundary
)

Parameters

content string

The content to parse.

boundary string

The boundary between parts. This is usually present in an HTTP + request's Content-Type header.

Return Value

The multipart/form-data content that's been parsed.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/data/handy_http_data.multipart.readBodyAsMultipartFormData.html b/docs/ddoc/data/handy_http_data.multipart.readBodyAsMultipartFormData.html new file mode 100644 index 0000000..b753673 --- /dev/null +++ b/docs/ddoc/data/handy_http_data.multipart.readBodyAsMultipartFormData.html @@ -0,0 +1,35 @@ + + + + readBodyAsMultipartFormData (handy_http_data.multipart.readBodyAsMultipartFormData) + + + + + + + + + + +
+
+

readBodyAsMultipartFormData

Reads a request's body as multipart/form-data encoded elements.

readBodyAsMultipartFormData
(
ref ServerHttpRequest request
,
bool allowInfiniteRead = false
)

Parameters

request ServerHttpRequest

The request to read from.

allowInfiniteRead bool

Whether to read until no more data is available.

Return Value

The multipart/form-data that was read.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/data/handy_http_data.xml.html b/docs/ddoc/data/handy_http_data.xml.html new file mode 100644 index 0000000..35cf9eb --- /dev/null +++ b/docs/ddoc/data/handy_http_data.xml.html @@ -0,0 +1,37 @@ + + + + handy_http_data.xml (handy_http_data.xml) + + + + + + + + + + +
+
+

handy_http_data.xml

Defines functions for reading and writing XML content while handling HTTP +requests, using the dxml library: https://code.dlang.org/packages/dxml

Members

Functions

readXMLBody
DOMEntity!string readXMLBody(ServerHttpRequest request)

Reads an XML request body.

writeXMLBody
void writeXMLBody(ServerHttpResponse response, void delegate(ref XMLWriter!(Appender!string)) dg)

Writes an XML response body, by using the provided delegate function to +compose the XML tag tree using a provided XMLWriter.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/data/handy_http_data.xml.readXMLBody.html b/docs/ddoc/data/handy_http_data.xml.readXMLBody.html new file mode 100644 index 0000000..2cfaef4 --- /dev/null +++ b/docs/ddoc/data/handy_http_data.xml.readXMLBody.html @@ -0,0 +1,35 @@ + + + + readXMLBody (handy_http_data.xml.readXMLBody) + + + + + + + + + + +
+
+

readXMLBody

Reads an XML request body.

DOMEntity!string
readXMLBody
(
ref ServerHttpRequest request
)

Parameters

request ServerHttpRequest

The request to read from.

Return Value

Type: DOMEntity!string

The DOMEntity representing the XML payload.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/data/handy_http_data.xml.writeXMLBody.html b/docs/ddoc/data/handy_http_data.xml.writeXMLBody.html new file mode 100644 index 0000000..5affc1b --- /dev/null +++ b/docs/ddoc/data/handy_http_data.xml.writeXMLBody.html @@ -0,0 +1,36 @@ + + + + writeXMLBody (handy_http_data.xml.writeXMLBody) + + + + + + + + + + +
+
+

writeXMLBody

Writes an XML response body, by using the provided delegate function to +compose the XML tag tree using a provided XMLWriter.

See https://jmdavisprog.com/docs/dxml/0.4.4/dxml_writer.html#.xmlWriter

void
writeXMLBody
(
ref ServerHttpResponse response
,
void delegate
(
ref XMLWriter!(Appender!string)
)
dg
)

Parameters

response ServerHttpResponse

The HTTP response to write to.

dg void delegate
(
ref XMLWriter!(Appender!string)
)

The delegate function that will be called to generate the XML.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/data/index.html b/docs/ddoc/data/index.html new file mode 100644 index 0000000..01fe8a1 --- /dev/null +++ b/docs/ddoc/data/index.html @@ -0,0 +1,35 @@ + + + + index (index) + + + + + + + + + + +
+
+

index

Modules

handy_http_data
module handy_http_data
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/data/script.js b/docs/ddoc/data/script.js new file mode 100644 index 0000000..b47257e --- /dev/null +++ b/docs/ddoc/data/script.js @@ -0,0 +1,180 @@ +window.addEventListener("load", function() { + + var lineWrappers = document.querySelectorAll(".with-line-wrappers"); + for(var i = 0; i < lineWrappers.length; i++) { + var l = lineWrappers[i]; + + var codeblock = document.createElement("div"); + codeblock.className = "codeblock"; + l.parentNode.insertBefore(codeblock, l); + + var header = document.createElement("header"); + codeblock.appendChild(header); + codeblock.appendChild(l); + + var btn = document.createElement("button"); + btn.setAttribute("type", "button"); + var canCopyToClipboard = document.queryCommandSupported("copy"); + btn.addEventListener("click", (function(l) { return function() { + document.body.classList.add("hide-line-numbers"); + window.getSelection().selectAllChildren(l); + if(canCopyToClipboard) + if(!document.execCommand("copy")) { + alert("copy failed, try ctrl+c manually"); + } + };})(l)); + btn.textContent = canCopyToClipboard ? "Copy to Clipboard" : "Select All"; + header.appendChild(btn); + + var btn = document.createElement("button"); + btn.setAttribute("type", "button"); + btn.addEventListener("click", function() { + document.body.classList.toggle("hide-line-numbers"); + }); + btn.textContent = "Toggle Line Numbers"; + header.appendChild(btn); + } + + /* // still sucks in firefox! + document.addEventListener("copy", function(event) { + document.body.classList.add("hide-line-numbers"); + }); + */ + + document.body.addEventListener("mouseover", function(event) { + if(event.target.hasAttribute("data-ident")) { + var all = document.querySelectorAll("[data-ident=\""+event.target.getAttribute("data-ident")+"\"]"); + for(var i = 0; i < all.length; i++) + all[i].className += " active"; + } + }); + document.body.addEventListener("mouseout", function(event) { + if(event.target.hasAttribute("data-ident")) { + var all = document.querySelectorAll("[data-ident=\""+event.target.getAttribute("data-ident")+"\"]"); + for(var i = 0; i < all.length; i++) + all[i].className = all[i].className.replace(" active", ""); + } + }); + /* + document.body.addEventListener("dblclick", function(event) { + if(event.target.hasAttribute("data-ident")) { + location.href = "/" + event.target.getAttribute("data-ident"); + } + }); + */ + + var sn = document.getElementById("source-navigation"); + if(sn) { + sn.addEventListener("click", function(event) { + if(event.target.tagName != "A" || event.target.className == "docs") + return true; + if(event.target.nextSibling) { + var s = event.target.nextSibling; + if(s.style.display == "" || s.style.display == "none" || s.className.indexOf("search-hit") != -1) { + s.style.display = "block"; + var items = s.getElementsByTagName("ul"); + var i; + for(i = 0; i < items.length; i++) + items[i].style.display = ""; + items = s.getElementsByTagName("li"); + for(i = 0; i < items.length; i++) + items[i].style.display = ""; + } else + s.style.display = ""; + } + + //var id = event.target.href.substring(event.target.href.indexOf("#") + 1); + //sn.style.marginTop = (document.getElementById(id).offsetTop - event.target.offsetTop + 16) + "px"; + }); + + var search = document.createElement("input"); + search.setAttribute("type", "search"); + function searchHelper() { + var regex = new RegExp(search.value, "i"); + var items = document.querySelectorAll("#source-navigation a[href^=\"#\"]"); + var stxt = search.value; + for(var i = 0; i < items.length; i++) { + var a = items[i]; + if(stxt.length && regex.test(a.textContent)) { + var p = a.parentNode; + while(p.tagName != "DIV") { + if(p.tagName == "LI") + p.style.display = "list-item"; + else + p.style.display = "block"; + p.className += " search-hit"; + p = p.parentNode; + } + } else { + var p = a.parentNode; + if(stxt.length == 0) { + p.style.display = ""; + while(p.tagName != "DIV") { + p.style.display = ""; + p = p.parentNode; + } + } else + p.style.display = "none"; + p.className = p.className.replace(" search-hit", ""); + } + } + } + search.addEventListener("keyup", searchHelper); + sn.insertBefore(search, sn.firstChild); + } + + /* + function updateDynamicStyle() { + var thing = document.getElementById("page-content"); + var newStyle = document.getElementById("dynamic-style"); + if(!newStyle) { + newStyle = document.createElement("style"); + newStyle.setAttribute("id", "dynamic-style"); + newStyle.type = "text/css"; + document.head.appendChild(newStyle); + } + + var maxContentWidth = window.innerWidth; + // 800 is the threshold for putting nav vertically + if(maxContentWidth < 800) + maxContentWidth = 800; + else + maxContentWidth = + document.body.offsetWidth - + document.getElementById("page-nav").offsetWidth - + document.getElementById("page-nav").offsetLeft - + 64; + + // sanity check lol + if(maxContentWidth < 800) + maxContentWidth = 800; + + newStyle.innerHTML = ".member-list:not(.constructors) dt .simplified-prototype:hover { width: " + (thing.offsetWidth - 32) + "px; } #page-content pre.d_code, #page-content .overload-option, #page-content .member-list dt { max-width: " + (maxContentWidth) + "px; }"; + } + + updateDynamicStyle(); + + window.onresize = updateDynamicStyle; + */ + + // Disable line numbers in IE because the copy/paste with them sucks - it includes all line numbers + // in the middle making it too hard to use. Copy/paste is more important than line displays. + if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) { + var items = document.querySelectorAll(".with-line-wrappers"); + for(var a = 0; a < items.length; a++) + items[a].className = items[a].className.replace("with-line-wrappers", ""); + } + + // Keybind to focus search bar on '?' keydown. + document.addEventListener("keydown", (event) => { + if (event.key == "?") { + var searchBox = document.getElementsByName("searchTerm")[0]; + // Hack so the '?' doesn't auto-populate in the search bar. + this.setTimeout(() => { + searchBox.focus(); + }, 100); + } + }); + + +}); diff --git a/docs/ddoc/data/search-docs.html b/docs/ddoc/data/search-docs.html new file mode 100644 index 0000000..522aab4 --- /dev/null +++ b/docs/ddoc/data/search-docs.html @@ -0,0 +1,26 @@ + + + + + + + + diff --git a/docs/ddoc/data/search-docs.js b/docs/ddoc/data/search-docs.js new file mode 100644 index 0000000..768a988 --- /dev/null +++ b/docs/ddoc/data/search-docs.js @@ -0,0 +1,421 @@ +/* + This is the source for offline web search; it will be embedded + in a generated search page along with the search index xml. + + You will almost certainly want to gzip this when delivering it! + Also be sure it has the proper cache headers to give a remotely + acceptable performance result. Configure the web server to do + both these. When storing it for offline usage, you might just + leave it unzipped though for convenience of use without a web server. + + Tip to the end user: you might want to open this page and keep it + open in a reused tab. + + The file generated should be the skeleton.html with the search + index in a + + + + + + +
+
+
+ +
+ + + + + diff --git a/docs/ddoc/data/style.css b/docs/ddoc/data/style.css new file mode 100644 index 0000000..e6754c4 --- /dev/null +++ b/docs/ddoc/data/style.css @@ -0,0 +1,1661 @@ +/* a few things you can change to pick a basic color scheme */ + +/* + FIXME: have some automatic magic for choosing light vs dark and picking an accent color. + + Ideally, we'll get to the point where you can just say: + project name + project logo + project links + + light/dark scheme + project color + + and it will adapt the rest to a good-enough state automatically. +*/ + +#page-header, +#suggestion-box { + background-color: rgb(49, 57, 176); + background-color: rgb(49, 110, 47); + background-color: rgb(176, 57, 49); +} + +#page-header, +#suggestion-box, +#page-footer, +#page-nav { + border-color: rgb(41, 48, 148); + border-color: rgb(41, 110, 48); + border-color: rgb(148, 48, 41); + border-color: rgb(204, 204, 204); +} + +#page-nav { + background-color: rgb(245, 245, 255); + background-color: rgb(245, 250, 245); + background-color: rgb(245, 245, 245); + +} + +a:link { + color: #0000ff; + color: #bb0000; +} + +a:visited { + color: #004488; + color: #bb0044; +} + + +body { + font-family: "Roboto Slab", sans-serif; + tab-size: 4; +} + +h1, #page-nav a, .quickindex a.xref, .breadcrumb, dt > a { + font-family: Consolas, "Bitstream Vera Sans Mono", "Andale Mono", Monaco, "DejaVu Sans Mono", "Lucida Console", monospace; +} + + +/* done with basic colors */ + +html { + font-size: 100%; +} + +h1 { + font-size: 2.2rem; +} + +h2 { + font-size: 1.6rem; + margin-top: 1.5em; + font-family: "Roboto Slab", sans-serif; + font-weight: normal; +} + +h3 { + font-size: 1.26rem; +} + +body { + /*font-family: sans-serif;*/ + color: #111; + background-color: white; +} + +.big-o { + white-space: nowrap; +} + +.member-list .dt, +.overload-option, +pre { + box-sizing: border-box; + overflow: auto; + max-width: 800px; /* The script sets the real one */ + max-width: calc(80vw - 16em - 4em); +} + + +#page-header { + height: 32px; + line-height: 32px; + margin-bottom: 6px; + border-bottom-width: 1px; + border-bottom-style: solid; + color: white; + margin: -0.5em; + padding: 0em 0.5em; + margin-bottom: 0.0em; + overflow: hidden; +} + +#page-header span { + vertical-align: top; +} + +#page-header #logotype { + float: left; +} + +#page-header #search { + float: right; +} + +#page-header nav { + display: inline-block; + margin-left: 2em; + vertical-align: top; +} + +#page-header nav a { + display: inline-block; + color: white; + font-weight: bold; + margin-right: 2em; +} + +#page-body { + clear: both; + margin: 0px auto; + max-width: 1200px; + min-height: 800px; + min-height: calc(100vh - 3em - 32px); + display: flex; + box-sizing: border-box; +} + +#page-body #page-nav { + flex: 0 0 16em; + width: 16em; + min-width: 16em; + max-width: 16em; + order: 1; + padding-top: 0.25em; + padding-left: 1em; + padding-right: 0px; + min-height: 800px; + min-height: calc(100vh - 3em - 32px); + + border-right-style: solid; + border-right-width: 1px; + border-left-style: solid; + border-left-width: 1px; + box-sizing: border-box; +} + +#page-body #page-content { + flex: 1 1 auto; + order: 2; + padding: 0.25em; + padding-left: 1.75em; + box-sizing: border-box; + max-width: 960px; +} + +@media all and (max-width: 800px) { + #page-body { + display: block; + min-height: 0px; + } + + #page-body #page-nav { + display: block; + width: auto; + max-width: 800px; + border-top-style: solid; + border-top-width: 1px; + border-right: none; + min-height: 0px; + } + + #page-body #page-content { + padding-left: 0.25em; + } + + .member-list .dt, + .overload-option, + pre { + box-sizing: border-box; + overflow: auto; + max-width: 800px; /* The script sets the real one */ + max-width: calc(100vw - 2em); + } + + #page-header { + line-height: 20px; + height: auto; + min-height: 32px; + overflow: visible; + } + #page-header::after { + content: ' '; + display: block; + clear: both; + } +} + +#page-footer { + margin-top: 0em; + padding-top: 2em; + color: #999; + font-size: 0.9rem; + text-align: center; + border-top-style: solid; + border-top-width: 1px; +} + +a:link { + text-decoration: none; +} + +a:link:hover { + text-decoration: underline !important; /* important so it overrides even id level things on non-hover */ +} + +/* +pre.d_code { background-color: #fdf6e3; color: #002b36; padding: 0.25em; border: solid 1px #ccc; } +.d_code .kwrd { color: #b58900; font-weight: bold; } +.d_code .com { color: #666; font-style: italic; } +.d_code .num { color: #dc322f; font-weight: normal; } +.d_code .str { color: #2aa198; font-style: italic; } +.d_code .op { color: #586e75; font-weight: bold; } +.d_code .type { color: #268bd2; font-weight: bold; } +.d_code .cons { color: #859900; font-weight: bold; } + +.highlighted .kwrd { color: #b58900; font-weight: bold; } +.highlighted .com { color: #666; font-style: italic; } /* #93a1a1; * / +.highlighted .num { color: #dc322f; font-weight: normal; } +.highlighted .str { color: #2aa198; font-style: italic; } +.highlighted .op { color: #586e75; font-weight: bold; } +.highlighted .type { color: #268bd2; font-weight: bold; } +.highlighted .cons { color: #859900; font-weight: bold; } +*/ + +/* .member-list p, */ +#table-of-contents, +.enum-members, +.documentation-comment .tip, +.documentation-comment .note, +.documentation-comment .warning, +.documentation-comment .pitfall, +.documentation-comment li, +.documentation-comment p { + /* white-space: pre-line; */ + /* max-width: 74ch; */ + /*font-size: 1.1rem;*/ + font-size: 1.0rem; + line-height: 1.5; +} + +/* +.parameter-item::after { + content: ','; +} + +.parameter-item:last-child::after { + content: ''; +} +*/ + +.aggregate-declaration { + margin: 1em; +} + +.aggregate-member { + padding-left: 2em; +} + +/* +.aggregate-member::after { + content: ";"; +} +*/ + +.aggregate-member > a { + color: inherit; +} + +.template-constraint-expression, +.parameter-item { + padding-left: 2em; +} + + +/* +ol.overloads { + margin-bottom: -1px; + white-space: nowrap; +} + +ol.overloads::before { + content: "Overloads: "; +} + +ol.overloads li { + display: inline-block; + border: solid 1px #ccc; + list-style-position: inside; + text-align: center; + width: 5em; +} + +ol.overloads li.overload-option { + background-color: #eee; +} + +ol.overloads li a { + display: block; +} + +ol.overloads li.active-overload-option { + border-bottom: solid 1px white; +} + +ol.overloads + .aggregate-prototype, +ol.overloads + .function-prototype { + margin-top: 0px; +} +*/ + +.aggregate-prototype #help-link, +.function-prototype #help-link { + border-radius: 100%; + position: absolute; + top: -0.5em; + right: -0.5em; + display: block; + border: solid 1px #ccc; + background-color: white; + width: 1em; + height: 1em; + text-align: center; + font-size: 1.1rem; + padding-bottom: 3px; +} + +.aggregate-prototype #help-link:hover, +.function-prototype #help-link:hover { + text-decoration: none; + background-color: #ccc; +} + +.function-prototype .attributes { + color: #666; +} + +.declaration-prototype, +.aggregate-prototype, +.function-prototype { + border: solid 1px #ccc; + padding: 2em; + margin: 1em; + font-family: monospace; + position: relative; +} + +.declaration-prototype { + padding: 3em 2em; +} + +.parameters-list:empty { + display: none; +} + +/* +.parameters-list .parameters-list { + display: inline; +} +*/ + +.toplevel.parameters-list { + display: table; +} + +.toplevel.parameters-list > .parameter-item { + display: table-row; +} + +.toplevel.parameters-list > .parameter-item > *:first-child { + padding-left: 2em !important; +} + +.toplevel.parameters-list > .parameter-item + .comma { + display: none; +} + +.toplevel.parameters-list > .parameter-item > *:last-child::after { + content: ","; +} +.toplevel.parameters-list > .parameter-item:last-of-type > *:last-child::after { + content: ""; +} + +.parameter-attribute { + padding-left: 1em; +} + +.toplevel.parameters-list > .parameter-item .parameter-type-holder, +.toplevel.parameters-list > .parameter-item .parameter-name, +.toplevel.parameters-list > .parameter-item .parameter-default-value { + display: table-cell; + padding: 0px 0.25em; +} + +.toplevel.parameters-list > .parameter-item:hover { + background-color: #f8f8f8; +} + +.parameter-descriptions .parameter-name { + margin-right: 1.5rem; + font-weight: bold; + padding: 0.25ex 0.75ex; +} + +.parameter-descriptions dd { + margin-left: 1.5em; +} + +.parameter-descriptions dd p:first-child { + margin-top: 0.5em; +} + +.parameter-descriptions dt:not(:first-child) { + margin-top: 1.5em; +} + +.codeblock { + border: solid 1px #ccc; + padding: 0; + margin: 0; +} + +.codeblock header { + background-color: #e8e8e8; + padding: 0; + display: flex; + justify-content: flex-end; +} + +.codeblock header:before { + display: inline-block; + content: "Example"; + justify-content: flex-start; + flex-grow: 1; + padding: 0.25em 1em; + font-weight: bold; +} + +.codeblock header button { +/* TODO: add :before class with icons here (copy, line numbers) */ + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + margin: 0; + padding: 0 1em; + background-color: transparent; + border: none; + border-left: 1px solid #ccc; + cursor: pointer; +} + +.codeblock header button:hover { + background-color: rgba(255, 255, 255, 0.5); +} + +.codeblock header + pre { + border: none; + border-top: solid 1px #ccc; + margin: 0; + padding: 1em 0; + max-width: unset !important;; +} + +.hide-line-numbers .codeblock .with-line-wrappers, +.codeblock pre.d_code:not(.with-line-wrappers) { + padding: 1em; +} + +.codeblock .with-line-wrappers .br { + margin-right: 1em; +} + +.documentation-comment p { + hyphens: auto; +} + +.declaration-prototype, .aggregate-prototype, .function-prototype { + margin-left: 0; + margin-right: 0; +} + + + +tt.D, .inline-code { + color: black; + font-weight: 500; + background-color: #f2f2f2; + padding: 0px 0.5ex; + border-radius: 2px; +} + + +/* +.toplevel.parameters-list > .parameter-item > .parameter-type-holder { + text-align: right; +} + +.toplevel.parameters-list > .parameter-item > .parameter-type-holder > .parameter-type { + text-align: left; + display: inline-block; +} +*/ + +.function-prototype .return-type, .function-prototype .function-name { + display: inline; +} + +.function-name::before { + content: ' '; +} + +.function-name { + /*color: #008888;*/ +} + +.template-parameters[data-count="0"], +.template-parameters[data-count="0"] ~ .runtime-parameters[data-count="0"], +.template-parameters[data-count="0"] ~ .runtime-parameters[data-count="0"] > .parameters-list { + display: inline; +} + +.parameters-list:empty { + display: inline; +} + +.type-constructor, +.builtin-type { + text-decoration: none; + color: #004400 !important; + /*color: green !important; + font-weight: bold;*/ +} + +.kwrd, +.highlighted-keyword, +.lang-feature, +.storage-class { + text-decoration: none; + color: #026 !important; +} + +[data-ident].active { + outline: solid 1px red; +} + +table.enum-members { + border-collapse: collapse; + border: solid 1px #ccc; + min-width: 60%; +} + +.enum-members th, +.enum-members td { + border: solid 1px #ccc; + margin: 0px; + padding: 0.25em 0.5em; +} + +.enum-members th { + text-align: left; + color: #888; +} + +.enum-members td { + vertical-align: top; +} + +.enum-members td p:first-child { + margin-top: 0px; +} + +.enum-members .enum-member-name { + font-weight: bold; + color: inherit; +} + +.enum-members .enum-member-value { + display: block; + color: #666; +} + +.enum-members .enum-disabled { + font-style: italic; +} + +.enum-members .enum-deprecated { + margin-bottom: 1em; +} + +.enum-members .enum-deprecated > span.deprecated-label { + color: red; +} + +.enum-members .enum-attributes { + margin-top: 1em; +} + +.enum-member .enum-attributes:empty { + display: none; +} + +.enum-members tr.enum-member > td:nth-child(2) > div:only-child:empty:before { + display: inline; + content: "undocumented"; + color: rgba(0, 0, 0, 0.4); + font-style: italic; +} + +*:target { + background: #ffffbb; +} + +.breadcrumbs { + margin: 1em; +} + +.breadcrumbs a::before { + content: ' \00bb\a0'; +} + +.parameter-name { + font-weight: bold; +} + +.symbol-reference, +.return-type, +.parameter-type { + font-family: monospace; +} + +.phobos-booktable { + border-collapse: collapse; + margin-bottom: 1.5em; +} + +.phobos-booktable tt.D { + font-weight: bold; + background-color: transparent; +} + +.phobos-booktable caption { + text-align: left; +} + +.phobos-booktable tr { + border-bottom: solid 1px #ccc; +} + +.phobos-booktable tr:hover { + background-color: #fafafa; +} + +.phobos-booktable { + border-top: solid 2px black; + border-bottom: solid 2px black; +} + +.phobos-booktable tr:first-child:has(th) { + border-bottom: solid 1px black; +} + +.phobos-booktable th { + text-align: left; + padding-top: 0.3em; + padding-bottom: 0.3em; +} + +.phobos-booktable td:first-child { + padding-top: 0.3em; + padding-bottom: 0.3em; + padding-right: 1em; +} + +.phobos-booktable td:not(:last-child), +.phobos-booktable th:not(:last-child) { + padding-right: 1em; +} + +.quickindex .phobos-booktable td:last-child a { + padding-right: 1.2em; +} + +.current.breadcrumb { + color: inherit; + text-decoration: none; +} + +.andand-right { + display: inline; +} + +.oror-right { + display: inline; +} + +.parenthetical-expression > .parenthetical-expression-contents > .andand-left, +.parenthetical-expression > .parenthetical-expression-contents > .oror-left { + display: inline; +} + +/* +.parenthetical-expression > .parenthetical-expression-contents > .oror-left:first-child { + display: block; +} +*/ + + +.template-constraint-expression .parenthetical-expression { + display: block; + margin-left: 1em; +} + +.oror-left > .andand-left, +.oror-left > .andand-right { + display: inline; +} + +.aggregate-members:empty::after { + content: "This aggregate has no documented members available."; +} + +h1 .entity-name { + font-family: monospace; +} + +.other-section h3 { + font-size: 1rem; + margin-bottom: 0.25em; +} + +.other-section h3 + p { + margin-top: 0.25em; +} + +.function-prototype .in-contract, +.function-prototype .out-contract { + display: none; + white-space: pre; +} + +.note { + margin: 1em; + padding: 0.5em; + background-color: #f0f0ff; + border: solid 1px #ccc; + clear: both; +} + +/* +.note::before { + color: #000066; + font-weight: bold; + content: "Note: "; +} +*/ + +.warning { + margin: 1em; + padding: 0.5em; + background-color: #fffff0; + border: solid 1px #ccc; + clear: both; +} + +.pitfall { + margin: 1em; + padding: 0.5em; + background-color: #fff0f0; + border: solid 1px #ccc; + clear: both; +} + +.tip { + margin: 1em; + padding: 0.5em; + background-color: #f0fff0; + border: solid 1px #ccc; + clear: both; +} + +.sidebar { + float: right; + margin: 1em; + margin-top: 2px; + padding: 0.25em; + background: #f3f3f3; + border: solid 1px #ccc; + width: 20%; + min-width: 30ch; + clear: right; +} + +h2 { + clear: both; +} + +.sidebar > *:first-child { + margin-top: 0px; +} + +/* I want to clear floats. This leaves a gap about the size of a blank line + too, but that doesn't bother me (actually, I kinda like a small gap at the + bottom. */ +#page-content::after { + clear: both; + content: '\a0'; + display: block; +} + +tt.D, +.inline-code { + color: black; + font-weight: 500; + background-color: #f2f2f2; + padding: 0px 0.125em; +} + +#page-nav .type-separator { + text-transform: capitalize; + display: block; + border-bottom: solid 1px #ccc; + margin-top: 1em; + margin-bottom: 0.25em; +} + +#page-nav a { + display: block; + box-sizing: border-box; + padding: 1px 0.25em 1px 0.5em; + text-overflow: ellipsis; + overflow: hidden; + font-family: "Roboto Slab", sans-serif; +} + +#page-nav a:hover { + position: relative; + overflow: visible; + z-index: 10; + background-color: rgb(245, 245, 245); + width: max-content; +} + +#page-nav a.parent { + font-weight: bold; + font-size: 1.1rem; + line-height: 0.9; + overflow: visible; +} + +#page-nav a.parent:first-child { + margin-top: 0.75em; +} + +#page-nav a.parent + a.parent::before { + content: "."; +} + +#page-nav a.current { + font-weight: bold; + color: inherit; +} + +pre[data-language=console], +pre.console { + background-color: #222; + color: #eee; + padding: 0.5em; + border: solid 1px #ccc; +} + +#more-link { + display: block; + font-weight: bold; + font-size: 1.1rem; + color: blue; +} + +.member-list dd + dt { + border-top: solid 1px #ccc; + padding-top: 0.5em; + margin-top: 0.5em; +} + +/* +.member-list dd { + max-height: 4em; + overflow: hidden; + text-overflow: ellipsis; +} +*/ + +.member-list dt a { + overflow: hidden; + text-overflow: ellipsis; +} + +.member-list dt .simplified-prototype { + font-family: monospace; + font-size: 90%; + color: #333; + white-space: nowrap; + text-overflow: ellipsis; + text-overflow: '[...]'; /* only Firefox supports this but i like it */ + overflow: hidden; + border: solid 1px white; +} + +.member-list dt .simplified-prototype:hover { + background-color: white; + position: relative; + z-index: 5; + width: 800px; + width: calc(100vw - 16em); + border: solid 1px #eee; + box-shadow: 1px 1px 1px #ccc; +} + +@media screen and (min-width: 640px) { + .member-list dt { + float: left; + clear: left; + width: 20em; + box-sizing: border-box; + padding-right: 1em; + } + + .member-list dd, + .member-list dd + dt { + border-top: solid 1px #ccc; + padding-top: 0.5em; + margin-top: 0em; + } + + .member-list dd p:first-child { + margin-top: 0px; + } + + .member-list dd:first-of-type { + border-top: none; + padding-top: 0px; + } + + .member-list dd { + margin: 0px; + margin-left: 20em; + } + + .member-list dd::after { + content: '\a0'; + height: 0.5em; + clear: both; + display: block; + } +} + +.member-list.articles dt, +.member-list.constructors dt { + float: none; + clear: none; + margin: 0em; + width: auto; + border: none; +} + +.member-list.articles dd, +.member-list.constructors dd { + float: none; + clear: none; + margin: 1em 0em; + width: auto; + border: none; +} + +.member-list.articles dd, +.member-list.constructors dd { + padding-left: 2em; +} + +.member-list dt a { + display: block; +} + +#suggestion-box { + display: inline-block; + color: white; + font-weight: bold; + border: solid 2px black; + border-radius: 8px 8px 0px 0px; + position: fixed; + left: 1em; + bottom: 0em; + padding: 0.25em 0.5em; +} + +.synopsis { + margin: 2em 0px; +} + +/* If it was successfully looked up in an xref, no need to highlight anymore */ +a.xref:link span[data-ident].active { + border: none; +} + +#table-of-contents { + border: solid 1px #ccc; + margin: 1em; + padding: 1em; + padding-left: 0em; /* the list inside can handle this */ +} + +.parent-prototype { + font-size: 0.9rem; + padding-bottom: 1em; +} + +.parent-prototype::after { + content: " {"; +} + +.parent-prototype + div { + padding-left: 1em; +} + +.parent-prototype + div::after { + content: "}"; + display: block; + font-size: 0.9rem; + padding-top: 1em; + margin-left: -1.33em; /* 1/(3/4) */ +} + +.search-result::after { + content: '(Search Score: ' attr(data-score) ')'; + font-size: 0.9rem; +} + +table.std_math { + min-width: 25%; + border: solid 1px black; + border-collapse: collapse; + margin: 2em; +} + +table.std_math td, table.std_math th { + border: solid 1px #ccc; + text-align: left; + padding: 0.25em; +} + +table.std_math.special-values th { + border-bottom: solid 2px #000; +} + +table.std_math.special-values caption { + text-align: left; + font-weight: 700; +} + +.nan { + font-family: monospace; + color: red; +} + +.overload-option, +.overload-signature { + font-family: monospace; +} + +.block-code, +.d_code, +.annotated-prototype { + font-size: 1rem; +} + +.annotated-prototype .overloads { + display: block; + padding: 0px; +} + +.annotated-prototype .overloads li { + display: block; + width: auto; + padding: 0em 0.5em; + text-align: left; + overflow: hidden; + + margin: 0; +} + +.member-list .dt, .overload-option, pre { + max-width: unset; +} + +.annotated-prototype .overloads li.active-overload-option { + border: ridge 2px #ccc; +} + +.annotated-prototype .overloads li.active-overload-option .overload-signature { + white-space: nowrap; + border-bottom: dotted 1px #999; + display: block; +} + +.annotated-prototype .overloads li.overload-option { + border: solid 1px #ccc; + background-color: #eee; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.annotated-prototype .overloads li.ditto-option::before, +.annotated-prototype .overloads li.active-overload-option .overload-signature::before, +.annotated-prototype .overloads li.overload-option::before { + display: inline-block; + width: 6em; + width: 9ch; + font-size: 0.9rem; + vertical-align: baseline; +} + +.annotated-prototype .overloads li.overload-option::before { + content: "Overload: "; +} + +.annotated-prototype .overloads li.active-overload-option .overload-signature::before { + content: "Viewing: "; +} + +.annotated-prototype .overloads li.ditto-option::before { + content: "Related: "; +} + +.annotated-prototype li .declaration-prototype, +.annotated-prototype li .aggregate-prototype, +.annotated-prototype li .function-prototype { + border: none; + padding: 0px; +} + +.annotated-prototype li .declaration-prototype { + padding: 2em 0px; +} + +#page-nav ul { + margin: 0px; + padding: 0px; + list-style: none; +} + +.parameter-name > a[href^="#"], +a.parameter-name[href^="#"] { + color: inherit; +} + + + +/* adrdox special syntax styles */ + +.small-table { + border-collapse: collapse; + min-width: 10em; +} + +.small-table td, +.small-table th { + border: solid 1px #ccc; + padding: 0.25em; +} + +.small-table thead th { + border-bottom: solid 2px #999; +} + +.small-table tbody th, +.small-table.two-axes thead th:first-child { + border-right: solid 2px #999; +} + +.small-table.two-axes td, +.small-table.two-axes th { + text-align: center; + vertical-align: middle; +} + +.adrdox-sample { + display: table; + width: 100%; +} + +.adrdox-sample > div { + display: table-row; +} + +.adrdox-sample > div > * { + display: table-cell; + width: 50%; + vertical-align: top; + border-bottom: dashed 1px #ccc; + padding: 0.25em; + padding-bottom: 0.5em; +} + +.adrdox-sample > div > pre { + border-right: dashed 1px #ccc; +} + +.adrdox-sample > div > pre::before, +.adrdox-sample > div > div::before { + display: block; + font-style: italic; + border-bottom: dashed 1px #ccc; + margin-bottom: 0.5em; + font-family: sans-serif; + font-size: 1rem; + padding: 0px; +} + +.adrdox-sample > div > pre::before { + content: 'Doc source:'; +} +.adrdox-sample > div > div::before { + content: 'Rendered:'; +} + +blockquote { + margin: 1em; + padding: 1em; + border-left: 0.5em solid #ccc; + color: #333; +} + +pre.d_code, +.block-code:not([data-language=""]):not([data-language="pre"]) { + background-color: #fcfcfc; + padding: 0.25em; + border: solid 1px #ccc; + position: relative; +} + +.block-code:not([data-language=""]):not([data-language="pre"])::before { + content: attr(data-language); + display: block; + text-transform: capitalize; + font-size: 0.9rem; + padding: 0px 2px; + border: solid 1px #999; + border-top: none; + border-radius: 0px 0px 0.25em 0.25em; + background-color: #f0f0f0; + float: right; + margin: 0px; + margin-top: -0.25em; + margin-top: calc(-0.25em - 1px); +} +.type, +.highlighted-type { + color: green; + /* font-weight: bold; */ +} +.num, +.highlighted-number { + color: #dc322f; +} +.str, +.highlighted-string { + color: red; +} +.com, +.highlighted-comment { + color: blue; +} +.highlighted-preprocessor-directive { + color: #cd00cd; +} +.highlighted-identifier, +.highlighted-tag { + color: #008888; +} +.highlighted-tag-name { + color: #859900; +} +.highlighted-entity { + color: #cd00cd; + text-decoration: none; + cursor: help; +} +.highlighted-named-constant, +.highlighted-attribute-name { + color: green; +} +.highlighted-attribute-value { + color: red; +} +.highlighted-python-indent { + background: linear-gradient(to right, #eee, transparent 3px) no-repeat; +} +.highlighted-python-indent:hover { + background: linear-gradient(to right, #ccc, transparent 3px) no-repeat; +} + +/* +.with-line-wrappers { + counter-reset: line_numbers; +} + +.with-line-wrappers span.br { + counter-increment: line_numbers; +} + +.with-line-wrappers span.br::before { + content: counter(line_numbers); +*/ +.with-line-wrappers .br { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + width: 3em; + width: 4ch; + display: inline-block; + color: #999; + border-right: solid 2px #ccc; + padding: 0px; + margin: 0px; + margin-right: 3px; + padding-right: 3px; + font-style: normal; + font-weight: normal; + background-color: transparent; + text-align: right; + white-space: pre; +} + +.hide-line-numbers .with-line-wrappers .br { + display: none; +} +.with-line-wrappers .br:target { + background: #ffffbb; +} + +.thousand-lines.with-line-wrappers .br { + width: 4em; + width: 5ch; +} +.ten-thousand-lines.with-line-wrappers .br { + width: 5em; + width: 6ch; +} + +#source-navigation { + position: fixed; + width: 15.5em; +} + +#source-navigation .list-holder { + width: 100%; + overflow: auto; + max-height: 80vh; +} + +#source-navigation .list-holder ul { + padding-left: 1em; +} + +/* hide nested decls as it is too much... */ +#source-navigation .list-holder ul > li > ul { + display: none; +} + +/* ...but show top-level decls under the module cuz no reason not to */ +#source-navigation .list-holder > ul > li > ul { + display: block; +} + +#source-navigation li { + white-space: nowrap; +} + +#source-navigation a { + display: inline; +} + +.postcondition { + color: blue; + font-family: monospace; + font-size: 0.9rem; +} +.postcondition::before { + content: "Post: "; + font-style: italic; + color: black; +} + +.user-table { + border-top: solid 2px black; + border-collapse: collapse; +} + +.user-table tr:nth-of-type(1) th { + border-bottom: solid 1px black; + text-align: left; +} + +.user-table td { + border-bottom: solid 1px #ccc; + vertical-align: top; + padding: 4px; +} +.user-table th { + padding: 4px; +} + +.user-table.two-axes tr + tr th:first-child { + border-bottom: solid 1px #ccc; +} + +.user-table.two-axes th:first-child { + border-right: solid 1px black; + text-align: right; +} + +.allocator-table td:first-child tt { + background-color: transparent; + white-space: nowrap; + font-weight: bold; +} + +.header-anchor { + color: inherit !important; +} + +#members + h3, +.member-list + h3, +h3.member-list-header { + border-bottom: solid 1px #333; + text-transform: capitalize; +} + +#members + h4, +.member-list + h4, +h4.member-list-header { + font-weight: normal; + text-transform: capitalize; + text-decoration: underline; +} + + +tr.leading-row th { + border-bottom: solid 2px black; +} + +.lambda-expression * { + display: inline !important; + padding: 0px !important; + margin: 0px !important; +} + +.footnote-ref a {} +.footnote-ref abbr { + font-variant: none; + text-decoration: none; + cursor: help; +} + +.side-by-side { + table-layout: fixed; + border: none; + width: 100%; +} + +.side-by-side > tbody > tr > td { + vertical-align: top; +} + +/* +tt.D { + font-weight: bold; + background: transparent; + color: inherit; +} +*/ + +tt.D.highlighted *:not(a) { + font-weight: inherit; + color: inherit; +} +tt.D.highlighted a { + color: #500000; +} + +.date-posted { + font-size: 0.9rem; + font-style: italic; +} + +.token-string-literal { + font-style: italic; +} +.token-string-literal:hover { + background-color: rgba(255, 0, 0, 0.05); +} + +.specially-highlighted { + background-color: yellow; + background-color: rgba(255, 255, 0, 0.5); +} + +.console .specially-highlighted { + background-color: rgba(255, 255, 0, 1.0); + color: black; +} + +.quickindex { + background: #f5f5f5; + max-width: 760px; +} + +.quickindex .phobos-booktable { + width: 100%; +} + +.leading-row { + font-style: italic; + background-color: rgb(228, 233, 239); +} + +.leading-row th { + padding-left: 1.5em; +} + +.quickindex td, .quickindex th { + padding-left: 0.3em; +} + +.undocumented-note { + color: #999; +} + +.deprecated-decl { + color: #c00; + font-weight: bold; +} + +.conditional-compilation-attributes { + font-size: 90%; +} + +@media (prefers-color-scheme: dark) { + body { + color: #ddd; + background-color: black; + } + + a:link, a:visited { + color: #00aaff !important; + } + + #page-nav { + background-color: #333 !important; + } + + tt.D, + .inline-code { + background-color: #444; + color: #eee; + } + + .block-code:not([data-language=""]):not([data-language="pre"]), + pre.d_code { + background-color: #444; + color: #eee; + } + + .tip { + background-color: #306630; + } + + .pitfall { + background-color: #663030; + } + + .warning { + background-color: #666630; + } + + .note { + background-color: #3333aa; + } + + .sidebar { + background-color: #555; + } + + .member-list dt .simplified-prototype { + color: #aaa; + border-color: black; + } + + .member-list dt .simplified-prototype:hover { + background-color: black; + border-color: #555; + } + + .highlighted-comment, + .com { + color: #0ff !important; + } + + .kwrd, + .highlighted-keyword, + .lang-feature, + .storage-class { + color: #8ff !important; + } + + .type-constructor, + .builtin-type { + color: #00cc00 !important; + } + + .type, + .highlighted-type { + color: lime; + } +} + diff --git a/docs/ddoc/handlers/handy_http_handlers.filtered_handler.BaseHandlerRequestFilter.doFilter.html b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.BaseHandlerRequestFilter.doFilter.html new file mode 100644 index 0000000..51d4a40 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.BaseHandlerRequestFilter.doFilter.html @@ -0,0 +1,35 @@ + + + + BaseHandlerRequestFilter.doFilter (handy_http_handlers.filtered_handler.BaseHandlerRequestFilter.doFilter) + + + + + + + + + + +
+
+

BaseHandlerRequestFilter.doFilter

Undocumented in source. Be warned that the author may not have intended to support it.
class BaseHandlerRequestFilter
void
doFilter
(
ref ServerHttpRequest request
,
ref ServerHttpResponse response
,)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.filtered_handler.BaseHandlerRequestFilter.html b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.BaseHandlerRequestFilter.html new file mode 100644 index 0000000..9cd0b36 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.BaseHandlerRequestFilter.html @@ -0,0 +1,36 @@ + + + + BaseHandlerRequestFilter (handy_http_handlers.filtered_handler.BaseHandlerRequestFilter) + + + + + + + + + + +
+
+

BaseHandlerRequestFilter

A simple base filter that should always sit at the bottom of the filter +chain, which just calls a request handler.

Constructors

this
this(HttpRequestHandler handler)
Undocumented in source.

Members

Functions

doFilter
void doFilter(ServerHttpRequest request, ServerHttpResponse response, FilterChain filterChain)
Undocumented in source. Be warned that the author may not have intended to support it.

Inherited Members

From HttpRequestFilter

doFilter
void doFilter(ServerHttpRequest request, ServerHttpResponse response, FilterChain filterChain)
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.filtered_handler.BaseHandlerRequestFilter.this.html b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.BaseHandlerRequestFilter.this.html new file mode 100644 index 0000000..3e8646e --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.BaseHandlerRequestFilter.this.html @@ -0,0 +1,35 @@ + + + + BaseHandlerRequestFilter.this (handy_http_handlers.filtered_handler.BaseHandlerRequestFilter.this) + + + + + + + + + + +
+
+

BaseHandlerRequestFilter.this

Undocumented in source.
class BaseHandlerRequestFilter
this
(
HttpRequestHandler handler
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilterChain.build.html b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilterChain.build.html new file mode 100644 index 0000000..4c8e748 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilterChain.build.html @@ -0,0 +1,36 @@ + + + + FilterChain.build (handy_http_handlers.filtered_handler.FilterChain.build) + + + + + + + + + + +
+
+

FilterChain.build

Builds a filter chain from a list of request filters.

class FilterChain

Parameters

filters HttpRequestFilter[]

The filters to use to build the filter chain.

Return Value

The root of the filter chain that when called, executes for +each of the filters provided.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilterChain.doFilter.html b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilterChain.doFilter.html new file mode 100644 index 0000000..8768643 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilterChain.doFilter.html @@ -0,0 +1,38 @@ + + + + FilterChain.doFilter (handy_http_handlers.filtered_handler.FilterChain.doFilter) + + + + + + + + + + +
+
+

FilterChain.doFilter

Applies this filter chain link's filter to the given request and +response, and then if there's another link in the chain, calls it to +apply its filter thereafter, and so on until the chain is complete or +a filter has short-circuited without calling filterChain.doFilter.

class FilterChain
void
doFilter
(
ref ServerHttpRequest request
,
ref ServerHttpResponse response
)

Parameters

request ServerHttpRequest

The request.

response ServerHttpResponse

The response.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilterChain.html b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilterChain.html new file mode 100644 index 0000000..ac9304f --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilterChain.html @@ -0,0 +1,39 @@ + + + + FilterChain (handy_http_handlers.filtered_handler.FilterChain) + + + + + + + + + + +
+
+

FilterChain

A filter chain is a singly-linked list that represents a series of filters +to be applied when processing a request.

Constructors

this
this(HttpRequestFilter filter, FilterChain next)
Undocumented in source.

Members

Functions

doFilter
void doFilter(ServerHttpRequest request, ServerHttpResponse response)

Applies this filter chain link's filter to the given request and +response, and then if there's another link in the chain, calls it to +apply its filter thereafter, and so on until the chain is complete or +a filter has short-circuited without calling filterChain.doFilter.

Static functions

build
FilterChain build(HttpRequestFilter[] filters)

Builds a filter chain from a list of request filters.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilterChain.this.html b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilterChain.this.html new file mode 100644 index 0000000..8cd2ff9 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilterChain.this.html @@ -0,0 +1,35 @@ + + + + FilterChain.this (handy_http_handlers.filtered_handler.FilterChain.this) + + + + + + + + + + +
+
+

FilterChain.this

Undocumented in source.
class FilterChain
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilteredHandler.handle.html b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilteredHandler.handle.html new file mode 100644 index 0000000..3527bb7 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilteredHandler.handle.html @@ -0,0 +1,35 @@ + + + + FilteredHandler.handle (handy_http_handlers.filtered_handler.FilteredHandler.handle) + + + + + + + + + + +
+
+

FilteredHandler.handle

Handles an incoming request by simply calling the filter chain on it.

class FilteredHandler
void
handle
(
ref ServerHttpRequest request
,
ref ServerHttpResponse response
)

Parameters

request ServerHttpRequest

The request.

response ServerHttpResponse

The response.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilteredHandler.html b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilteredHandler.html new file mode 100644 index 0000000..4781381 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilteredHandler.html @@ -0,0 +1,40 @@ + + + + FilteredHandler (handy_http_handlers.filtered_handler.FilteredHandler) + + + + + + + + + + +
+
+

FilteredHandler

The FilteredHandler is a request handler you can add to your server to apply +a filter chain to an underlying request handler.

Constructors

this
this(FilterChain filterChain)

Constructs a filtered handler that applies the given filter chain. Note +that you should probabconstly use the other constructor for most cases, but +if you really want to provide a custom filter chain, you'll most likely +want to add the BaseHandlerRequestFilter as the last one in the chain.

this
this(HttpRequestFilter[] filters, HttpRequestHandler baseHandler)

Constructs a filtered handler that applies the given set of filters, in +order, before potentially calling the given base handler.

Members

Functions

handle
void handle(ServerHttpRequest request, ServerHttpResponse response)

Handles an incoming request by simply calling the filter chain on it.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilteredHandler.this.1.html b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilteredHandler.this.1.html new file mode 100644 index 0000000..5f7e6c0 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilteredHandler.this.1.html @@ -0,0 +1,38 @@ + + + + FilteredHandler.this (handy_http_handlers.filtered_handler.FilteredHandler.this) + + + + + + + + + + +
+
+

FilteredHandler.this

Constructs a filtered handler that applies the given filter chain. Note +that you should probabconstly use the other constructor for most cases, but +if you really want to provide a custom filter chain, you'll most likely +want to add the BaseHandlerRequestFilter as the last one in the chain.

Parameters

filterChain FilterChain

The filter chain to use.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilteredHandler.this.2.html b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilteredHandler.this.2.html new file mode 100644 index 0000000..6aae370 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilteredHandler.this.2.html @@ -0,0 +1,37 @@ + + + + FilteredHandler.this (handy_http_handlers.filtered_handler.FilteredHandler.this) + + + + + + + + + + +
+
+

FilteredHandler.this

Constructs a filtered handler that applies the given set of filters, in +order, before potentially calling the given base handler.

  1. this(FilterChain filterChain)
  2. this(HttpRequestFilter[] filters, HttpRequestHandler baseHandler)
    class FilteredHandler
    this
    (,
    HttpRequestHandler baseHandler
    )

Parameters

filters HttpRequestFilter[]

The set of filters to apply to all requests.

baseHandler HttpRequestHandler

The base handler that'll be called if an incoming + request is passed successfully through all filters.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilteredHandler.this.html b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilteredHandler.this.html new file mode 100644 index 0000000..a933570 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.FilteredHandler.this.html @@ -0,0 +1 @@ + Continue to overload \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.filtered_handler.HttpRequestFilter.doFilter.html b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.HttpRequestFilter.doFilter.html new file mode 100644 index 0000000..376a422 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.HttpRequestFilter.doFilter.html @@ -0,0 +1,35 @@ + + + + HttpRequestFilter.doFilter (handy_http_handlers.filtered_handler.HttpRequestFilter.doFilter) + + + + + + + + + + +
+
+

HttpRequestFilter.doFilter

Undocumented in source.
interface HttpRequestFilter
void
doFilter
(
ref ServerHttpRequest request
,
ref ServerHttpResponse response
,)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.filtered_handler.HttpRequestFilter.html b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.HttpRequestFilter.html new file mode 100644 index 0000000..d3e0202 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.HttpRequestFilter.html @@ -0,0 +1,39 @@ + + + + HttpRequestFilter (handy_http_handlers.filtered_handler.HttpRequestFilter) + + + + + + + + + + +
+
+

HttpRequestFilter

A filter that can be applied to an HTTP request. If the filter determines +that it's okay to continue processing the request, it should call +filterChain.doFilter(request, response) to continue the chain. If the +chain is not continued, request processing ends at this filter, and the +current response is sent back to the client.

Members

Functions

doFilter
void doFilter(ServerHttpRequest request, ServerHttpResponse response, FilterChain filterChain)
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.filtered_handler.html b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.html new file mode 100644 index 0000000..e5361ba --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.filtered_handler.html @@ -0,0 +1,44 @@ + + + + handy_http_handlers.filtered_handler (handy_http_handlers.filtered_handler) + + + + + + + + + + +
+
+

handy_http_handlers.filtered_handler

Defines a "filtered" request handler, that applies an ordered set of filters +(otherwise known as a "filter chain") before and after handling a request, +as a means of adding a simple middleware layer to HTTP request processing.

Members

Classes

BaseHandlerRequestFilter
class BaseHandlerRequestFilter

A simple base filter that should always sit at the bottom of the filter +chain, which just calls a request handler.

FilterChain
class FilterChain

A filter chain is a singly-linked list that represents a series of filters +to be applied when processing a request.

FilteredHandler
class FilteredHandler

The FilteredHandler is a request handler you can add to your server to apply +a filter chain to an underlying request handler.

Interfaces

HttpRequestFilter
interface HttpRequestFilter

A filter that can be applied to an HTTP request. If the filter determines +that it's okay to continue processing the request, it should call +filterChain.doFilter(request, response) to continue the chain. If the +chain is not continued, request processing ends at this filter, and the +current response is sent back to the client.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.html b/docs/ddoc/handlers/handy_http_handlers.html new file mode 100644 index 0000000..e5956f7 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.html @@ -0,0 +1,40 @@ + + + + handy_http_handlers (handy_http_handlers) + + + + + + + + + + +
+
+

handy_http_handlers

Undocumented in source.

Modules

filtered_handler
module handy_http_handlers.filtered_handler

Defines a "filtered" request handler, that applies an ordered set of filters +(otherwise known as a "filter chain") before and after handling a request, +as a means of adding a simple middleware layer to HTTP request processing.

path_handler
module handy_http_handlers.path_handler

Defines a path-matching request handler, that will match incoming requests +against a set of mappings based on the URL and HTTP method, and call a +handler depending on what's matched.

path_handler_sample_module
module handy_http_handlers.path_handler_sample_module

This module defines some path mapping functions to help test the path +handler's function for registering annotated functions.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.DeleteMapping.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.DeleteMapping.html new file mode 100644 index 0000000..d255da0 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.DeleteMapping.html @@ -0,0 +1,35 @@ + + + + DeleteMapping (handy_http_handlers.path_handler.DeleteMapping) + + + + + + + + + + +
+
+

DeleteMapping

A simplified version of PathMapping for HTTP DELETE mappings only.

struct DeleteMapping {}

Members

Variables

pattern
string pattern;

See PathMapping.pattern.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.DeleteMapping.pattern.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.DeleteMapping.pattern.html new file mode 100644 index 0000000..7bf0cb2 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.DeleteMapping.pattern.html @@ -0,0 +1,35 @@ + + + + DeleteMapping.pattern (handy_http_handlers.path_handler.DeleteMapping.pattern) + + + + + + + + + + +
+
+

DeleteMapping.pattern

See PathMapping.pattern.

struct DeleteMapping
string pattern;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.GetMapping.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.GetMapping.html new file mode 100644 index 0000000..bcaa205 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.GetMapping.html @@ -0,0 +1,35 @@ + + + + GetMapping (handy_http_handlers.path_handler.GetMapping) + + + + + + + + + + +
+
+

GetMapping

A simplified version of PathMapping for HTTP GET mappings only.

struct GetMapping {}

Members

Variables

pattern
string pattern;

See PathMapping.pattern.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.GetMapping.pattern.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.GetMapping.pattern.html new file mode 100644 index 0000000..6480630 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.GetMapping.pattern.html @@ -0,0 +1,35 @@ + + + + GetMapping.pattern (handy_http_handlers.path_handler.GetMapping.pattern) + + + + + + + + + + +
+
+

GetMapping.pattern

See PathMapping.pattern.

struct GetMapping
string pattern;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PatchMapping.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PatchMapping.html new file mode 100644 index 0000000..d0c5d4d --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PatchMapping.html @@ -0,0 +1,35 @@ + + + + PatchMapping (handy_http_handlers.path_handler.PatchMapping) + + + + + + + + + + +
+
+

PatchMapping

A simplified version of PathMapping for HTTP PATCH mappings only.

struct PatchMapping {}

Members

Variables

pattern
string pattern;

See PathMapping.pattern.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PatchMapping.pattern.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PatchMapping.pattern.html new file mode 100644 index 0000000..39df055 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PatchMapping.pattern.html @@ -0,0 +1,35 @@ + + + + PatchMapping.pattern (handy_http_handlers.path_handler.PatchMapping.pattern) + + + + + + + + + + +
+
+

PatchMapping.pattern

See PathMapping.pattern.

struct PatchMapping
string pattern;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.1.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.1.html new file mode 100644 index 0000000..363a32e --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.1.html @@ -0,0 +1,39 @@ + + + + PathHandler.addMapping (handy_http_handlers.path_handler.PathHandler.addMapping) + + + + + + + + + + +
+
+

PathHandler.addMapping

Adds a mapping to this handler, such that requests which match the given +method and pattern will be handed off to the given handler.

Overloaded variations of this method are defined for your convenience, +which allow you to add a mapping for multiple HTTP methods and/or path +patterns.

Parameters

method HttpMethod

The HTTP method to match against.

pattern string

The path pattern to match against. See https://github.com/andrewlalis/path-matcher + for more details on the pattern's format.

handler HttpRequestHandler

The handler that will handle matching requests.

Return Value

This path handler, for method chaining.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.2.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.2.html new file mode 100644 index 0000000..75fe2ff --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.2.html @@ -0,0 +1,35 @@ + + + + PathHandler.addMapping (handy_http_handlers.path_handler.PathHandler.addMapping) + + + + + + + + + + +
+ + +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.3.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.3.html new file mode 100644 index 0000000..76b559d --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.3.html @@ -0,0 +1,35 @@ + + + + PathHandler.addMapping (handy_http_handlers.path_handler.PathHandler.addMapping) + + + + + + + + + + +
+ + +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.4.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.4.html new file mode 100644 index 0000000..265e2da --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.4.html @@ -0,0 +1,35 @@ + + + + PathHandler.addMapping (handy_http_handlers.path_handler.PathHandler.addMapping) + + + + + + + + + + +
+ + +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.5.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.5.html new file mode 100644 index 0000000..750f96b --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.5.html @@ -0,0 +1,35 @@ + + + + PathHandler.addMapping (handy_http_handlers.path_handler.PathHandler.addMapping) + + + + + + + + + + +
+ + +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.html new file mode 100644 index 0000000..f436b8c --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.addMapping.html @@ -0,0 +1 @@ + Continue to overload \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.handle.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.handle.html new file mode 100644 index 0000000..ea6b91e --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.handle.html @@ -0,0 +1,37 @@ + + + + PathHandler.handle (handy_http_handlers.path_handler.PathHandler.handle) + + + + + + + + + + +
+
+

PathHandler.handle

Handles a request by looking for a mapped handler whose method and pattern +match the request's, and letting that handler handle the request. If no +match is found, the notFoundHandler will take care of it.

class PathHandler
void
handle
(
ref ServerHttpRequest request
,
ref ServerHttpResponse response
)

Parameters

request ServerHttpRequest

The request.

response ServerHttpResponse

The response.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.html new file mode 100644 index 0000000..1be1f57 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.html @@ -0,0 +1,48 @@ + + + + PathHandler (handy_http_handlers.path_handler.PathHandler) + + + + + + + + + + +
+
+

PathHandler

A request handler that maps incoming requests to a particular handler based +on the request's URL path and/or HTTP method (GET, POST, etc.).

Use the various overloaded versions of the addMapping(...) method to add +handlers to this path handler. When handling requests, this path handler +will look for matches deterministically in the order you add them. Therefore, +adding mappings with conflicting or duplicate paths will cause the first one +to always be called.

Path patterns should be defined according to the rules from the path-matcher +library, found here: https://github.com/andrewlalis/path-matcher

Constructors

this
this()

Constructs a new path handler with initially no mappings, and a default +notFoundHandler that simply sets a 404 status.

Members

Functions

addMapping
PathHandler addMapping(HttpMethod method, string pattern, HttpRequestHandler handler)

Adds a mapping to this handler, such that requests which match the given +method and pattern will be handed off to the given handler.

addMapping
PathHandler addMapping(HttpMethod[] methods, string pattern, HttpRequestHandler handler)
addMapping
PathHandler addMapping(HttpMethod method, string[] patterns, HttpRequestHandler handler)
addMapping
PathHandler addMapping(HttpMethod[] methods, string[] patterns, HttpRequestHandler handler)
addMapping
PathHandler addMapping(string pattern, HttpRequestHandler handler)
handle
void handle(ServerHttpRequest request, ServerHttpResponse response)

Handles a request by looking for a mapped handler whose method and pattern +match the request's, and letting that handler handle the request. If no +match is found, the notFoundHandler will take care of it.

registerHandlers
void registerHandlers()

Adds mappings to this path handler which correspond to functions defined +in the given symbol which have been annotated with the @PathMapping +attribute (or any simplified aliases like @GetMapping).

setNotFoundHandler
PathHandler setNotFoundHandler(HttpRequestHandler handler)

Sets the handler that will be called for requests that don't match any +pre-configured mappings.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.registerHandlers.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.registerHandlers.html new file mode 100644 index 0000000..4eb77ab --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.registerHandlers.html @@ -0,0 +1,37 @@ + + + + PathHandler.registerHandlers (handy_http_handlers.path_handler.PathHandler.registerHandlers) + + + + + + + + + + +
+
+

PathHandler.registerHandlers

Adds mappings to this path handler which correspond to functions defined +in the given symbol which have been annotated with the @PathMapping +attribute (or any simplified aliases like @GetMapping).

class PathHandler
void
registerHandlers
(
alias symbol
)
()
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.setNotFoundHandler.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.setNotFoundHandler.html new file mode 100644 index 0000000..d05e4ff --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.setNotFoundHandler.html @@ -0,0 +1,36 @@ + + + + PathHandler.setNotFoundHandler (handy_http_handlers.path_handler.PathHandler.setNotFoundHandler) + + + + + + + + + + +
+
+

PathHandler.setNotFoundHandler

Sets the handler that will be called for requests that don't match any +pre-configured mappings.

class PathHandler
setNotFoundHandler
(
HttpRequestHandler handler
)

Parameters

handler HttpRequestHandler

The handler to use.

Return Value

This path handler, for method chaining.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.this.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.this.html new file mode 100644 index 0000000..ea7f66d --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandler.this.html @@ -0,0 +1,36 @@ + + + + PathHandler.this (handy_http_handlers.path_handler.PathHandler.this) + + + + + + + + + + +
+
+

PathHandler.this

Constructs a new path handler with initially no mappings, and a default +notFoundHandler that simply sets a 404 status.

class PathHandler
this
()
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandlerContextData.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandlerContextData.html new file mode 100644 index 0000000..d51e2d7 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandlerContextData.html @@ -0,0 +1,36 @@ + + + + PathHandlerContextData (handy_http_handlers.path_handler.PathHandlerContextData) + + + + + + + + + + +
+
+

PathHandlerContextData

Context data that may be attached to a request to provide additional data +from path matching results, like any path variables that were found.

Constructors

this
this(immutable(PathParam[]) params)
Undocumented in source.

Members

Variables

params
PathParam[] params;
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandlerContextData.params.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandlerContextData.params.html new file mode 100644 index 0000000..d623d95 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandlerContextData.params.html @@ -0,0 +1,35 @@ + + + + PathHandlerContextData.params (handy_http_handlers.path_handler.PathHandlerContextData.params) + + + + + + + + + + +
+
+

PathHandlerContextData.params

Undocumented in source.
class PathHandlerContextData
immutable
PathParam[] params;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandlerContextData.this.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandlerContextData.this.html new file mode 100644 index 0000000..35c866f --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathHandlerContextData.this.html @@ -0,0 +1,35 @@ + + + + PathHandlerContextData.this (handy_http_handlers.path_handler.PathHandlerContextData.this) + + + + + + + + + + +
+
+

PathHandlerContextData.this

Undocumented in source.
class PathHandlerContextData
this
(
immutable(PathParam[]) params
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PathMapping.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathMapping.html new file mode 100644 index 0000000..3d555dd --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathMapping.html @@ -0,0 +1,37 @@ + + + + PathMapping (handy_http_handlers.path_handler.PathMapping) + + + + + + + + + + +
+
+

PathMapping

A user-defined attribute that, when added to a function, allows that +function to be registered automatically by a path handler when you call +its registerHandlers method on the module containing the function.

Members

Variables

method
HttpMethod method;

The HTTP method that the mapping accepts.

pattern
string pattern;

The path pattern for the mapping.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PathMapping.method.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathMapping.method.html new file mode 100644 index 0000000..8a37624 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathMapping.method.html @@ -0,0 +1,35 @@ + + + + PathMapping.method (handy_http_handlers.path_handler.PathMapping.method) + + + + + + + + + + +
+
+

PathMapping.method

The HTTP method that the mapping accepts.

struct PathMapping
HttpMethod method;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PathMapping.pattern.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathMapping.pattern.html new file mode 100644 index 0000000..19a97e9 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PathMapping.pattern.html @@ -0,0 +1,35 @@ + + + + PathMapping.pattern (handy_http_handlers.path_handler.PathMapping.pattern) + + + + + + + + + + +
+
+

PathMapping.pattern

The path pattern for the mapping.

struct PathMapping
string pattern;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PostMapping.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PostMapping.html new file mode 100644 index 0000000..5efd23c --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PostMapping.html @@ -0,0 +1,35 @@ + + + + PostMapping (handy_http_handlers.path_handler.PostMapping) + + + + + + + + + + +
+
+

PostMapping

A simplified version of PathMapping for HTTP POST mappings only.

struct PostMapping {}

Members

Variables

pattern
string pattern;

See PathMapping.pattern.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PostMapping.pattern.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PostMapping.pattern.html new file mode 100644 index 0000000..8ce2e0d --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PostMapping.pattern.html @@ -0,0 +1,35 @@ + + + + PostMapping.pattern (handy_http_handlers.path_handler.PostMapping.pattern) + + + + + + + + + + +
+
+

PostMapping.pattern

See PathMapping.pattern.

struct PostMapping
string pattern;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PutMapping.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PutMapping.html new file mode 100644 index 0000000..a57664b --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PutMapping.html @@ -0,0 +1,35 @@ + + + + PutMapping (handy_http_handlers.path_handler.PutMapping) + + + + + + + + + + +
+
+

PutMapping

A simplified version of PathMapping for HTTP PUT mappings only.

struct PutMapping {}

Members

Variables

pattern
string pattern;

See PathMapping.pattern.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.PutMapping.pattern.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.PutMapping.pattern.html new file mode 100644 index 0000000..3858c80 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.PutMapping.pattern.html @@ -0,0 +1,35 @@ + + + + PutMapping.pattern (handy_http_handlers.path_handler.PutMapping.pattern) + + + + + + + + + + +
+
+

PutMapping.pattern

See PathMapping.pattern.

struct PutMapping
string pattern;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.getMethodBit.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.getMethodBit.html new file mode 100644 index 0000000..7198085 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.getMethodBit.html @@ -0,0 +1,35 @@ + + + + getMethodBit (handy_http_handlers.path_handler.getMethodBit) + + + + + + + + + + +
+
+

getMethodBit

Maps each HTTP method to a bit value, so we can use bit-masking for handler mappings.

ushort
getMethodBit
(
in string method
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.getPathParamAs.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.getPathParamAs.html new file mode 100644 index 0000000..d3b0c47 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.getPathParamAs.html @@ -0,0 +1,35 @@ + + + + getPathParamAs (handy_http_handlers.path_handler.getPathParamAs) + + + + + + + + + + +
+
+

getPathParamAs

Gets a specific path variable's value.

T
getPathParamAs
(
T
)
(
in ServerHttpRequest request
,
string name
,
T defaultValue = T.init
)

Parameters

request ServerHttpRequest

The request to get the path variable value from.

name string

The name of the path variable.

defaultValue T

The default value to use if no path variables are present.

Return Value

Type: T

The path variable's value.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.getPathParams.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.getPathParams.html new file mode 100644 index 0000000..88e1e87 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.getPathParams.html @@ -0,0 +1,36 @@ + + + + getPathParams (handy_http_handlers.path_handler.getPathParams) + + + + + + + + + + +
+
+

getPathParams

Gets the set of path variables that were matched when the given request was +handled by the path handler.

immutable(PathParam[])
getPathParams
(
in ServerHttpRequest request
)

Parameters

request ServerHttpRequest

The request to get path variables for.

Return Value

Type: immutable(PathParam[])

The list of path variables.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.html new file mode 100644 index 0000000..c5a97ac --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.html @@ -0,0 +1,42 @@ + + + + handy_http_handlers.path_handler (handy_http_handlers.path_handler) + + + + + + + + + + +
+
+

handy_http_handlers.path_handler

Defines a path-matching request handler, that will match incoming requests +against a set of mappings based on the URL and HTTP method, and call a +handler depending on what's matched.

Members

Classes

PathHandler
class PathHandler

A request handler that maps incoming requests to a particular handler based +on the request's URL path and/or HTTP method (GET, POST, etc.).

PathHandlerContextData
class PathHandlerContextData

Context data that may be attached to a request to provide additional data +from path matching results, like any path variables that were found.

Functions

getMethodBit
ushort getMethodBit(string method)

Maps each HTTP method to a bit value, so we can use bit-masking for handler mappings.

getPathParamAs
T getPathParamAs(ServerHttpRequest request, string name, T defaultValue)

Gets a specific path variable's value.

getPathParams
immutable(PathParam[]) getPathParams(ServerHttpRequest request)

Gets the set of path variables that were matched when the given request was +handled by the path handler.

methodMaskFromAll
ushort methodMaskFromAll()

Gets a bitmask that matches all HTTP methods.

methodMaskFromMethods
ushort methodMaskFromMethods(HttpMethod[] methods)

Computes a bitmask from a list of HTTP methods.

Structs

DeleteMapping
struct DeleteMapping

A simplified version of PathMapping for HTTP DELETE mappings only.

GetMapping
struct GetMapping

A simplified version of PathMapping for HTTP GET mappings only.

PatchMapping
struct PatchMapping

A simplified version of PathMapping for HTTP PATCH mappings only.

PathMapping
struct PathMapping

A user-defined attribute that, when added to a function, allows that +function to be registered automatically by a path handler when you call +its registerHandlers method on the module containing the function.

PostMapping
struct PostMapping

A simplified version of PathMapping for HTTP POST mappings only.

PutMapping
struct PutMapping

A simplified version of PathMapping for HTTP PUT mappings only.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.methodMaskFromAll.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.methodMaskFromAll.html new file mode 100644 index 0000000..fae434e --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.methodMaskFromAll.html @@ -0,0 +1,35 @@ + + + + methodMaskFromAll (handy_http_handlers.path_handler.methodMaskFromAll) + + + + + + + + + + +
+
+

methodMaskFromAll

Gets a bitmask that matches all HTTP methods.

ushort
methodMaskFromAll
()

Return Value

Type: ushort

The bitmask.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler.methodMaskFromMethods.html b/docs/ddoc/handlers/handy_http_handlers.path_handler.methodMaskFromMethods.html new file mode 100644 index 0000000..284fff6 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler.methodMaskFromMethods.html @@ -0,0 +1,35 @@ + + + + methodMaskFromMethods (handy_http_handlers.path_handler.methodMaskFromMethods) + + + + + + + + + + +
+
+

methodMaskFromMethods

Computes a bitmask from a list of HTTP methods.

ushort
methodMaskFromMethods
(
HttpMethod[] methods
)

Parameters

methods HttpMethod[]

The methods to make a bitmask from.

Return Value

Type: ushort

A bitmask that matches all the given methods.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler_sample_module.h1.html b/docs/ddoc/handlers/handy_http_handlers.path_handler_sample_module.h1.html new file mode 100644 index 0000000..c5b0bb5 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler_sample_module.h1.html @@ -0,0 +1,35 @@ + + + + h1 (handy_http_handlers.path_handler_sample_module.h1) + + + + + + + + + + +
+
+

h1

Undocumented in source. Be warned that the author may not have intended to support it.
version(unittest)
@PathMapping(HttpMethod.GET, "/h1")
void
h1
(
ref ServerHttpRequest request
,
ref ServerHttpResponse response
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler_sample_module.h2.html b/docs/ddoc/handlers/handy_http_handlers.path_handler_sample_module.h2.html new file mode 100644 index 0000000..60027c5 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler_sample_module.h2.html @@ -0,0 +1,35 @@ + + + + h2 (handy_http_handlers.path_handler_sample_module.h2) + + + + + + + + + + +
+
+

h2

Undocumented in source. Be warned that the author may not have intended to support it.
version(unittest)
@PathMapping(HttpMethod.POST, "/h2")
void
h2
(
ref ServerHttpRequest request
,
ref ServerHttpResponse response
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler_sample_module.h3.html b/docs/ddoc/handlers/handy_http_handlers.path_handler_sample_module.h3.html new file mode 100644 index 0000000..497be7c --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler_sample_module.h3.html @@ -0,0 +1,35 @@ + + + + h3 (handy_http_handlers.path_handler_sample_module.h3) + + + + + + + + + + +
+
+

h3

Undocumented in source. Be warned that the author may not have intended to support it.
version(unittest)
@GetMapping("/h3")
void
h3
(
ref ServerHttpRequest request
,
ref ServerHttpResponse response
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/handy_http_handlers.path_handler_sample_module.html b/docs/ddoc/handlers/handy_http_handlers.path_handler_sample_module.html new file mode 100644 index 0000000..3a560c4 --- /dev/null +++ b/docs/ddoc/handlers/handy_http_handlers.path_handler_sample_module.html @@ -0,0 +1,36 @@ + + + + handy_http_handlers.path_handler_sample_module (handy_http_handlers.path_handler_sample_module) + + + + + + + + + + +
+
+

handy_http_handlers.path_handler_sample_module

This module defines some path mapping functions to help test the path +handler's function for registering annotated functions.

Members

Functions

h1
void h1(ServerHttpRequest request, ServerHttpResponse response)
Undocumented in source. Be warned that the author may not have intended to support it.
h2
void h2(ServerHttpRequest request, ServerHttpResponse response)
Undocumented in source. Be warned that the author may not have intended to support it.
h3
void h3(ServerHttpRequest request, ServerHttpResponse response)
Undocumented in source. Be warned that the author may not have intended to support it.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/index.html b/docs/ddoc/handlers/index.html new file mode 100644 index 0000000..5dbe306 --- /dev/null +++ b/docs/ddoc/handlers/index.html @@ -0,0 +1,35 @@ + + + + index (index) + + + + + + + + + + +
+
+

index

Modules

handy_http_handlers
module handy_http_handlers
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/handlers/script.js b/docs/ddoc/handlers/script.js new file mode 100644 index 0000000..b47257e --- /dev/null +++ b/docs/ddoc/handlers/script.js @@ -0,0 +1,180 @@ +window.addEventListener("load", function() { + + var lineWrappers = document.querySelectorAll(".with-line-wrappers"); + for(var i = 0; i < lineWrappers.length; i++) { + var l = lineWrappers[i]; + + var codeblock = document.createElement("div"); + codeblock.className = "codeblock"; + l.parentNode.insertBefore(codeblock, l); + + var header = document.createElement("header"); + codeblock.appendChild(header); + codeblock.appendChild(l); + + var btn = document.createElement("button"); + btn.setAttribute("type", "button"); + var canCopyToClipboard = document.queryCommandSupported("copy"); + btn.addEventListener("click", (function(l) { return function() { + document.body.classList.add("hide-line-numbers"); + window.getSelection().selectAllChildren(l); + if(canCopyToClipboard) + if(!document.execCommand("copy")) { + alert("copy failed, try ctrl+c manually"); + } + };})(l)); + btn.textContent = canCopyToClipboard ? "Copy to Clipboard" : "Select All"; + header.appendChild(btn); + + var btn = document.createElement("button"); + btn.setAttribute("type", "button"); + btn.addEventListener("click", function() { + document.body.classList.toggle("hide-line-numbers"); + }); + btn.textContent = "Toggle Line Numbers"; + header.appendChild(btn); + } + + /* // still sucks in firefox! + document.addEventListener("copy", function(event) { + document.body.classList.add("hide-line-numbers"); + }); + */ + + document.body.addEventListener("mouseover", function(event) { + if(event.target.hasAttribute("data-ident")) { + var all = document.querySelectorAll("[data-ident=\""+event.target.getAttribute("data-ident")+"\"]"); + for(var i = 0; i < all.length; i++) + all[i].className += " active"; + } + }); + document.body.addEventListener("mouseout", function(event) { + if(event.target.hasAttribute("data-ident")) { + var all = document.querySelectorAll("[data-ident=\""+event.target.getAttribute("data-ident")+"\"]"); + for(var i = 0; i < all.length; i++) + all[i].className = all[i].className.replace(" active", ""); + } + }); + /* + document.body.addEventListener("dblclick", function(event) { + if(event.target.hasAttribute("data-ident")) { + location.href = "/" + event.target.getAttribute("data-ident"); + } + }); + */ + + var sn = document.getElementById("source-navigation"); + if(sn) { + sn.addEventListener("click", function(event) { + if(event.target.tagName != "A" || event.target.className == "docs") + return true; + if(event.target.nextSibling) { + var s = event.target.nextSibling; + if(s.style.display == "" || s.style.display == "none" || s.className.indexOf("search-hit") != -1) { + s.style.display = "block"; + var items = s.getElementsByTagName("ul"); + var i; + for(i = 0; i < items.length; i++) + items[i].style.display = ""; + items = s.getElementsByTagName("li"); + for(i = 0; i < items.length; i++) + items[i].style.display = ""; + } else + s.style.display = ""; + } + + //var id = event.target.href.substring(event.target.href.indexOf("#") + 1); + //sn.style.marginTop = (document.getElementById(id).offsetTop - event.target.offsetTop + 16) + "px"; + }); + + var search = document.createElement("input"); + search.setAttribute("type", "search"); + function searchHelper() { + var regex = new RegExp(search.value, "i"); + var items = document.querySelectorAll("#source-navigation a[href^=\"#\"]"); + var stxt = search.value; + for(var i = 0; i < items.length; i++) { + var a = items[i]; + if(stxt.length && regex.test(a.textContent)) { + var p = a.parentNode; + while(p.tagName != "DIV") { + if(p.tagName == "LI") + p.style.display = "list-item"; + else + p.style.display = "block"; + p.className += " search-hit"; + p = p.parentNode; + } + } else { + var p = a.parentNode; + if(stxt.length == 0) { + p.style.display = ""; + while(p.tagName != "DIV") { + p.style.display = ""; + p = p.parentNode; + } + } else + p.style.display = "none"; + p.className = p.className.replace(" search-hit", ""); + } + } + } + search.addEventListener("keyup", searchHelper); + sn.insertBefore(search, sn.firstChild); + } + + /* + function updateDynamicStyle() { + var thing = document.getElementById("page-content"); + var newStyle = document.getElementById("dynamic-style"); + if(!newStyle) { + newStyle = document.createElement("style"); + newStyle.setAttribute("id", "dynamic-style"); + newStyle.type = "text/css"; + document.head.appendChild(newStyle); + } + + var maxContentWidth = window.innerWidth; + // 800 is the threshold for putting nav vertically + if(maxContentWidth < 800) + maxContentWidth = 800; + else + maxContentWidth = + document.body.offsetWidth - + document.getElementById("page-nav").offsetWidth - + document.getElementById("page-nav").offsetLeft - + 64; + + // sanity check lol + if(maxContentWidth < 800) + maxContentWidth = 800; + + newStyle.innerHTML = ".member-list:not(.constructors) dt .simplified-prototype:hover { width: " + (thing.offsetWidth - 32) + "px; } #page-content pre.d_code, #page-content .overload-option, #page-content .member-list dt { max-width: " + (maxContentWidth) + "px; }"; + } + + updateDynamicStyle(); + + window.onresize = updateDynamicStyle; + */ + + // Disable line numbers in IE because the copy/paste with them sucks - it includes all line numbers + // in the middle making it too hard to use. Copy/paste is more important than line displays. + if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) { + var items = document.querySelectorAll(".with-line-wrappers"); + for(var a = 0; a < items.length; a++) + items[a].className = items[a].className.replace("with-line-wrappers", ""); + } + + // Keybind to focus search bar on '?' keydown. + document.addEventListener("keydown", (event) => { + if (event.key == "?") { + var searchBox = document.getElementsByName("searchTerm")[0]; + // Hack so the '?' doesn't auto-populate in the search bar. + this.setTimeout(() => { + searchBox.focus(); + }, 100); + } + }); + + +}); diff --git a/docs/ddoc/handlers/search-docs.html b/docs/ddoc/handlers/search-docs.html new file mode 100644 index 0000000..522aab4 --- /dev/null +++ b/docs/ddoc/handlers/search-docs.html @@ -0,0 +1,26 @@ + + + + + + + + diff --git a/docs/ddoc/handlers/search-docs.js b/docs/ddoc/handlers/search-docs.js new file mode 100644 index 0000000..768a988 --- /dev/null +++ b/docs/ddoc/handlers/search-docs.js @@ -0,0 +1,421 @@ +/* + This is the source for offline web search; it will be embedded + in a generated search page along with the search index xml. + + You will almost certainly want to gzip this when delivering it! + Also be sure it has the proper cache headers to give a remotely + acceptable performance result. Configure the web server to do + both these. When storing it for offline usage, you might just + leave it unzipped though for convenience of use without a web server. + + Tip to the end user: you might want to open this page and keep it + open in a reused tab. + + The file generated should be the skeleton.html with the search + index in a + + + + + + +
+
+
+ +
+ + + + + diff --git a/docs/ddoc/handlers/style.css b/docs/ddoc/handlers/style.css new file mode 100644 index 0000000..e6754c4 --- /dev/null +++ b/docs/ddoc/handlers/style.css @@ -0,0 +1,1661 @@ +/* a few things you can change to pick a basic color scheme */ + +/* + FIXME: have some automatic magic for choosing light vs dark and picking an accent color. + + Ideally, we'll get to the point where you can just say: + project name + project logo + project links + + light/dark scheme + project color + + and it will adapt the rest to a good-enough state automatically. +*/ + +#page-header, +#suggestion-box { + background-color: rgb(49, 57, 176); + background-color: rgb(49, 110, 47); + background-color: rgb(176, 57, 49); +} + +#page-header, +#suggestion-box, +#page-footer, +#page-nav { + border-color: rgb(41, 48, 148); + border-color: rgb(41, 110, 48); + border-color: rgb(148, 48, 41); + border-color: rgb(204, 204, 204); +} + +#page-nav { + background-color: rgb(245, 245, 255); + background-color: rgb(245, 250, 245); + background-color: rgb(245, 245, 245); + +} + +a:link { + color: #0000ff; + color: #bb0000; +} + +a:visited { + color: #004488; + color: #bb0044; +} + + +body { + font-family: "Roboto Slab", sans-serif; + tab-size: 4; +} + +h1, #page-nav a, .quickindex a.xref, .breadcrumb, dt > a { + font-family: Consolas, "Bitstream Vera Sans Mono", "Andale Mono", Monaco, "DejaVu Sans Mono", "Lucida Console", monospace; +} + + +/* done with basic colors */ + +html { + font-size: 100%; +} + +h1 { + font-size: 2.2rem; +} + +h2 { + font-size: 1.6rem; + margin-top: 1.5em; + font-family: "Roboto Slab", sans-serif; + font-weight: normal; +} + +h3 { + font-size: 1.26rem; +} + +body { + /*font-family: sans-serif;*/ + color: #111; + background-color: white; +} + +.big-o { + white-space: nowrap; +} + +.member-list .dt, +.overload-option, +pre { + box-sizing: border-box; + overflow: auto; + max-width: 800px; /* The script sets the real one */ + max-width: calc(80vw - 16em - 4em); +} + + +#page-header { + height: 32px; + line-height: 32px; + margin-bottom: 6px; + border-bottom-width: 1px; + border-bottom-style: solid; + color: white; + margin: -0.5em; + padding: 0em 0.5em; + margin-bottom: 0.0em; + overflow: hidden; +} + +#page-header span { + vertical-align: top; +} + +#page-header #logotype { + float: left; +} + +#page-header #search { + float: right; +} + +#page-header nav { + display: inline-block; + margin-left: 2em; + vertical-align: top; +} + +#page-header nav a { + display: inline-block; + color: white; + font-weight: bold; + margin-right: 2em; +} + +#page-body { + clear: both; + margin: 0px auto; + max-width: 1200px; + min-height: 800px; + min-height: calc(100vh - 3em - 32px); + display: flex; + box-sizing: border-box; +} + +#page-body #page-nav { + flex: 0 0 16em; + width: 16em; + min-width: 16em; + max-width: 16em; + order: 1; + padding-top: 0.25em; + padding-left: 1em; + padding-right: 0px; + min-height: 800px; + min-height: calc(100vh - 3em - 32px); + + border-right-style: solid; + border-right-width: 1px; + border-left-style: solid; + border-left-width: 1px; + box-sizing: border-box; +} + +#page-body #page-content { + flex: 1 1 auto; + order: 2; + padding: 0.25em; + padding-left: 1.75em; + box-sizing: border-box; + max-width: 960px; +} + +@media all and (max-width: 800px) { + #page-body { + display: block; + min-height: 0px; + } + + #page-body #page-nav { + display: block; + width: auto; + max-width: 800px; + border-top-style: solid; + border-top-width: 1px; + border-right: none; + min-height: 0px; + } + + #page-body #page-content { + padding-left: 0.25em; + } + + .member-list .dt, + .overload-option, + pre { + box-sizing: border-box; + overflow: auto; + max-width: 800px; /* The script sets the real one */ + max-width: calc(100vw - 2em); + } + + #page-header { + line-height: 20px; + height: auto; + min-height: 32px; + overflow: visible; + } + #page-header::after { + content: ' '; + display: block; + clear: both; + } +} + +#page-footer { + margin-top: 0em; + padding-top: 2em; + color: #999; + font-size: 0.9rem; + text-align: center; + border-top-style: solid; + border-top-width: 1px; +} + +a:link { + text-decoration: none; +} + +a:link:hover { + text-decoration: underline !important; /* important so it overrides even id level things on non-hover */ +} + +/* +pre.d_code { background-color: #fdf6e3; color: #002b36; padding: 0.25em; border: solid 1px #ccc; } +.d_code .kwrd { color: #b58900; font-weight: bold; } +.d_code .com { color: #666; font-style: italic; } +.d_code .num { color: #dc322f; font-weight: normal; } +.d_code .str { color: #2aa198; font-style: italic; } +.d_code .op { color: #586e75; font-weight: bold; } +.d_code .type { color: #268bd2; font-weight: bold; } +.d_code .cons { color: #859900; font-weight: bold; } + +.highlighted .kwrd { color: #b58900; font-weight: bold; } +.highlighted .com { color: #666; font-style: italic; } /* #93a1a1; * / +.highlighted .num { color: #dc322f; font-weight: normal; } +.highlighted .str { color: #2aa198; font-style: italic; } +.highlighted .op { color: #586e75; font-weight: bold; } +.highlighted .type { color: #268bd2; font-weight: bold; } +.highlighted .cons { color: #859900; font-weight: bold; } +*/ + +/* .member-list p, */ +#table-of-contents, +.enum-members, +.documentation-comment .tip, +.documentation-comment .note, +.documentation-comment .warning, +.documentation-comment .pitfall, +.documentation-comment li, +.documentation-comment p { + /* white-space: pre-line; */ + /* max-width: 74ch; */ + /*font-size: 1.1rem;*/ + font-size: 1.0rem; + line-height: 1.5; +} + +/* +.parameter-item::after { + content: ','; +} + +.parameter-item:last-child::after { + content: ''; +} +*/ + +.aggregate-declaration { + margin: 1em; +} + +.aggregate-member { + padding-left: 2em; +} + +/* +.aggregate-member::after { + content: ";"; +} +*/ + +.aggregate-member > a { + color: inherit; +} + +.template-constraint-expression, +.parameter-item { + padding-left: 2em; +} + + +/* +ol.overloads { + margin-bottom: -1px; + white-space: nowrap; +} + +ol.overloads::before { + content: "Overloads: "; +} + +ol.overloads li { + display: inline-block; + border: solid 1px #ccc; + list-style-position: inside; + text-align: center; + width: 5em; +} + +ol.overloads li.overload-option { + background-color: #eee; +} + +ol.overloads li a { + display: block; +} + +ol.overloads li.active-overload-option { + border-bottom: solid 1px white; +} + +ol.overloads + .aggregate-prototype, +ol.overloads + .function-prototype { + margin-top: 0px; +} +*/ + +.aggregate-prototype #help-link, +.function-prototype #help-link { + border-radius: 100%; + position: absolute; + top: -0.5em; + right: -0.5em; + display: block; + border: solid 1px #ccc; + background-color: white; + width: 1em; + height: 1em; + text-align: center; + font-size: 1.1rem; + padding-bottom: 3px; +} + +.aggregate-prototype #help-link:hover, +.function-prototype #help-link:hover { + text-decoration: none; + background-color: #ccc; +} + +.function-prototype .attributes { + color: #666; +} + +.declaration-prototype, +.aggregate-prototype, +.function-prototype { + border: solid 1px #ccc; + padding: 2em; + margin: 1em; + font-family: monospace; + position: relative; +} + +.declaration-prototype { + padding: 3em 2em; +} + +.parameters-list:empty { + display: none; +} + +/* +.parameters-list .parameters-list { + display: inline; +} +*/ + +.toplevel.parameters-list { + display: table; +} + +.toplevel.parameters-list > .parameter-item { + display: table-row; +} + +.toplevel.parameters-list > .parameter-item > *:first-child { + padding-left: 2em !important; +} + +.toplevel.parameters-list > .parameter-item + .comma { + display: none; +} + +.toplevel.parameters-list > .parameter-item > *:last-child::after { + content: ","; +} +.toplevel.parameters-list > .parameter-item:last-of-type > *:last-child::after { + content: ""; +} + +.parameter-attribute { + padding-left: 1em; +} + +.toplevel.parameters-list > .parameter-item .parameter-type-holder, +.toplevel.parameters-list > .parameter-item .parameter-name, +.toplevel.parameters-list > .parameter-item .parameter-default-value { + display: table-cell; + padding: 0px 0.25em; +} + +.toplevel.parameters-list > .parameter-item:hover { + background-color: #f8f8f8; +} + +.parameter-descriptions .parameter-name { + margin-right: 1.5rem; + font-weight: bold; + padding: 0.25ex 0.75ex; +} + +.parameter-descriptions dd { + margin-left: 1.5em; +} + +.parameter-descriptions dd p:first-child { + margin-top: 0.5em; +} + +.parameter-descriptions dt:not(:first-child) { + margin-top: 1.5em; +} + +.codeblock { + border: solid 1px #ccc; + padding: 0; + margin: 0; +} + +.codeblock header { + background-color: #e8e8e8; + padding: 0; + display: flex; + justify-content: flex-end; +} + +.codeblock header:before { + display: inline-block; + content: "Example"; + justify-content: flex-start; + flex-grow: 1; + padding: 0.25em 1em; + font-weight: bold; +} + +.codeblock header button { +/* TODO: add :before class with icons here (copy, line numbers) */ + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + margin: 0; + padding: 0 1em; + background-color: transparent; + border: none; + border-left: 1px solid #ccc; + cursor: pointer; +} + +.codeblock header button:hover { + background-color: rgba(255, 255, 255, 0.5); +} + +.codeblock header + pre { + border: none; + border-top: solid 1px #ccc; + margin: 0; + padding: 1em 0; + max-width: unset !important;; +} + +.hide-line-numbers .codeblock .with-line-wrappers, +.codeblock pre.d_code:not(.with-line-wrappers) { + padding: 1em; +} + +.codeblock .with-line-wrappers .br { + margin-right: 1em; +} + +.documentation-comment p { + hyphens: auto; +} + +.declaration-prototype, .aggregate-prototype, .function-prototype { + margin-left: 0; + margin-right: 0; +} + + + +tt.D, .inline-code { + color: black; + font-weight: 500; + background-color: #f2f2f2; + padding: 0px 0.5ex; + border-radius: 2px; +} + + +/* +.toplevel.parameters-list > .parameter-item > .parameter-type-holder { + text-align: right; +} + +.toplevel.parameters-list > .parameter-item > .parameter-type-holder > .parameter-type { + text-align: left; + display: inline-block; +} +*/ + +.function-prototype .return-type, .function-prototype .function-name { + display: inline; +} + +.function-name::before { + content: ' '; +} + +.function-name { + /*color: #008888;*/ +} + +.template-parameters[data-count="0"], +.template-parameters[data-count="0"] ~ .runtime-parameters[data-count="0"], +.template-parameters[data-count="0"] ~ .runtime-parameters[data-count="0"] > .parameters-list { + display: inline; +} + +.parameters-list:empty { + display: inline; +} + +.type-constructor, +.builtin-type { + text-decoration: none; + color: #004400 !important; + /*color: green !important; + font-weight: bold;*/ +} + +.kwrd, +.highlighted-keyword, +.lang-feature, +.storage-class { + text-decoration: none; + color: #026 !important; +} + +[data-ident].active { + outline: solid 1px red; +} + +table.enum-members { + border-collapse: collapse; + border: solid 1px #ccc; + min-width: 60%; +} + +.enum-members th, +.enum-members td { + border: solid 1px #ccc; + margin: 0px; + padding: 0.25em 0.5em; +} + +.enum-members th { + text-align: left; + color: #888; +} + +.enum-members td { + vertical-align: top; +} + +.enum-members td p:first-child { + margin-top: 0px; +} + +.enum-members .enum-member-name { + font-weight: bold; + color: inherit; +} + +.enum-members .enum-member-value { + display: block; + color: #666; +} + +.enum-members .enum-disabled { + font-style: italic; +} + +.enum-members .enum-deprecated { + margin-bottom: 1em; +} + +.enum-members .enum-deprecated > span.deprecated-label { + color: red; +} + +.enum-members .enum-attributes { + margin-top: 1em; +} + +.enum-member .enum-attributes:empty { + display: none; +} + +.enum-members tr.enum-member > td:nth-child(2) > div:only-child:empty:before { + display: inline; + content: "undocumented"; + color: rgba(0, 0, 0, 0.4); + font-style: italic; +} + +*:target { + background: #ffffbb; +} + +.breadcrumbs { + margin: 1em; +} + +.breadcrumbs a::before { + content: ' \00bb\a0'; +} + +.parameter-name { + font-weight: bold; +} + +.symbol-reference, +.return-type, +.parameter-type { + font-family: monospace; +} + +.phobos-booktable { + border-collapse: collapse; + margin-bottom: 1.5em; +} + +.phobos-booktable tt.D { + font-weight: bold; + background-color: transparent; +} + +.phobos-booktable caption { + text-align: left; +} + +.phobos-booktable tr { + border-bottom: solid 1px #ccc; +} + +.phobos-booktable tr:hover { + background-color: #fafafa; +} + +.phobos-booktable { + border-top: solid 2px black; + border-bottom: solid 2px black; +} + +.phobos-booktable tr:first-child:has(th) { + border-bottom: solid 1px black; +} + +.phobos-booktable th { + text-align: left; + padding-top: 0.3em; + padding-bottom: 0.3em; +} + +.phobos-booktable td:first-child { + padding-top: 0.3em; + padding-bottom: 0.3em; + padding-right: 1em; +} + +.phobos-booktable td:not(:last-child), +.phobos-booktable th:not(:last-child) { + padding-right: 1em; +} + +.quickindex .phobos-booktable td:last-child a { + padding-right: 1.2em; +} + +.current.breadcrumb { + color: inherit; + text-decoration: none; +} + +.andand-right { + display: inline; +} + +.oror-right { + display: inline; +} + +.parenthetical-expression > .parenthetical-expression-contents > .andand-left, +.parenthetical-expression > .parenthetical-expression-contents > .oror-left { + display: inline; +} + +/* +.parenthetical-expression > .parenthetical-expression-contents > .oror-left:first-child { + display: block; +} +*/ + + +.template-constraint-expression .parenthetical-expression { + display: block; + margin-left: 1em; +} + +.oror-left > .andand-left, +.oror-left > .andand-right { + display: inline; +} + +.aggregate-members:empty::after { + content: "This aggregate has no documented members available."; +} + +h1 .entity-name { + font-family: monospace; +} + +.other-section h3 { + font-size: 1rem; + margin-bottom: 0.25em; +} + +.other-section h3 + p { + margin-top: 0.25em; +} + +.function-prototype .in-contract, +.function-prototype .out-contract { + display: none; + white-space: pre; +} + +.note { + margin: 1em; + padding: 0.5em; + background-color: #f0f0ff; + border: solid 1px #ccc; + clear: both; +} + +/* +.note::before { + color: #000066; + font-weight: bold; + content: "Note: "; +} +*/ + +.warning { + margin: 1em; + padding: 0.5em; + background-color: #fffff0; + border: solid 1px #ccc; + clear: both; +} + +.pitfall { + margin: 1em; + padding: 0.5em; + background-color: #fff0f0; + border: solid 1px #ccc; + clear: both; +} + +.tip { + margin: 1em; + padding: 0.5em; + background-color: #f0fff0; + border: solid 1px #ccc; + clear: both; +} + +.sidebar { + float: right; + margin: 1em; + margin-top: 2px; + padding: 0.25em; + background: #f3f3f3; + border: solid 1px #ccc; + width: 20%; + min-width: 30ch; + clear: right; +} + +h2 { + clear: both; +} + +.sidebar > *:first-child { + margin-top: 0px; +} + +/* I want to clear floats. This leaves a gap about the size of a blank line + too, but that doesn't bother me (actually, I kinda like a small gap at the + bottom. */ +#page-content::after { + clear: both; + content: '\a0'; + display: block; +} + +tt.D, +.inline-code { + color: black; + font-weight: 500; + background-color: #f2f2f2; + padding: 0px 0.125em; +} + +#page-nav .type-separator { + text-transform: capitalize; + display: block; + border-bottom: solid 1px #ccc; + margin-top: 1em; + margin-bottom: 0.25em; +} + +#page-nav a { + display: block; + box-sizing: border-box; + padding: 1px 0.25em 1px 0.5em; + text-overflow: ellipsis; + overflow: hidden; + font-family: "Roboto Slab", sans-serif; +} + +#page-nav a:hover { + position: relative; + overflow: visible; + z-index: 10; + background-color: rgb(245, 245, 245); + width: max-content; +} + +#page-nav a.parent { + font-weight: bold; + font-size: 1.1rem; + line-height: 0.9; + overflow: visible; +} + +#page-nav a.parent:first-child { + margin-top: 0.75em; +} + +#page-nav a.parent + a.parent::before { + content: "."; +} + +#page-nav a.current { + font-weight: bold; + color: inherit; +} + +pre[data-language=console], +pre.console { + background-color: #222; + color: #eee; + padding: 0.5em; + border: solid 1px #ccc; +} + +#more-link { + display: block; + font-weight: bold; + font-size: 1.1rem; + color: blue; +} + +.member-list dd + dt { + border-top: solid 1px #ccc; + padding-top: 0.5em; + margin-top: 0.5em; +} + +/* +.member-list dd { + max-height: 4em; + overflow: hidden; + text-overflow: ellipsis; +} +*/ + +.member-list dt a { + overflow: hidden; + text-overflow: ellipsis; +} + +.member-list dt .simplified-prototype { + font-family: monospace; + font-size: 90%; + color: #333; + white-space: nowrap; + text-overflow: ellipsis; + text-overflow: '[...]'; /* only Firefox supports this but i like it */ + overflow: hidden; + border: solid 1px white; +} + +.member-list dt .simplified-prototype:hover { + background-color: white; + position: relative; + z-index: 5; + width: 800px; + width: calc(100vw - 16em); + border: solid 1px #eee; + box-shadow: 1px 1px 1px #ccc; +} + +@media screen and (min-width: 640px) { + .member-list dt { + float: left; + clear: left; + width: 20em; + box-sizing: border-box; + padding-right: 1em; + } + + .member-list dd, + .member-list dd + dt { + border-top: solid 1px #ccc; + padding-top: 0.5em; + margin-top: 0em; + } + + .member-list dd p:first-child { + margin-top: 0px; + } + + .member-list dd:first-of-type { + border-top: none; + padding-top: 0px; + } + + .member-list dd { + margin: 0px; + margin-left: 20em; + } + + .member-list dd::after { + content: '\a0'; + height: 0.5em; + clear: both; + display: block; + } +} + +.member-list.articles dt, +.member-list.constructors dt { + float: none; + clear: none; + margin: 0em; + width: auto; + border: none; +} + +.member-list.articles dd, +.member-list.constructors dd { + float: none; + clear: none; + margin: 1em 0em; + width: auto; + border: none; +} + +.member-list.articles dd, +.member-list.constructors dd { + padding-left: 2em; +} + +.member-list dt a { + display: block; +} + +#suggestion-box { + display: inline-block; + color: white; + font-weight: bold; + border: solid 2px black; + border-radius: 8px 8px 0px 0px; + position: fixed; + left: 1em; + bottom: 0em; + padding: 0.25em 0.5em; +} + +.synopsis { + margin: 2em 0px; +} + +/* If it was successfully looked up in an xref, no need to highlight anymore */ +a.xref:link span[data-ident].active { + border: none; +} + +#table-of-contents { + border: solid 1px #ccc; + margin: 1em; + padding: 1em; + padding-left: 0em; /* the list inside can handle this */ +} + +.parent-prototype { + font-size: 0.9rem; + padding-bottom: 1em; +} + +.parent-prototype::after { + content: " {"; +} + +.parent-prototype + div { + padding-left: 1em; +} + +.parent-prototype + div::after { + content: "}"; + display: block; + font-size: 0.9rem; + padding-top: 1em; + margin-left: -1.33em; /* 1/(3/4) */ +} + +.search-result::after { + content: '(Search Score: ' attr(data-score) ')'; + font-size: 0.9rem; +} + +table.std_math { + min-width: 25%; + border: solid 1px black; + border-collapse: collapse; + margin: 2em; +} + +table.std_math td, table.std_math th { + border: solid 1px #ccc; + text-align: left; + padding: 0.25em; +} + +table.std_math.special-values th { + border-bottom: solid 2px #000; +} + +table.std_math.special-values caption { + text-align: left; + font-weight: 700; +} + +.nan { + font-family: monospace; + color: red; +} + +.overload-option, +.overload-signature { + font-family: monospace; +} + +.block-code, +.d_code, +.annotated-prototype { + font-size: 1rem; +} + +.annotated-prototype .overloads { + display: block; + padding: 0px; +} + +.annotated-prototype .overloads li { + display: block; + width: auto; + padding: 0em 0.5em; + text-align: left; + overflow: hidden; + + margin: 0; +} + +.member-list .dt, .overload-option, pre { + max-width: unset; +} + +.annotated-prototype .overloads li.active-overload-option { + border: ridge 2px #ccc; +} + +.annotated-prototype .overloads li.active-overload-option .overload-signature { + white-space: nowrap; + border-bottom: dotted 1px #999; + display: block; +} + +.annotated-prototype .overloads li.overload-option { + border: solid 1px #ccc; + background-color: #eee; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.annotated-prototype .overloads li.ditto-option::before, +.annotated-prototype .overloads li.active-overload-option .overload-signature::before, +.annotated-prototype .overloads li.overload-option::before { + display: inline-block; + width: 6em; + width: 9ch; + font-size: 0.9rem; + vertical-align: baseline; +} + +.annotated-prototype .overloads li.overload-option::before { + content: "Overload: "; +} + +.annotated-prototype .overloads li.active-overload-option .overload-signature::before { + content: "Viewing: "; +} + +.annotated-prototype .overloads li.ditto-option::before { + content: "Related: "; +} + +.annotated-prototype li .declaration-prototype, +.annotated-prototype li .aggregate-prototype, +.annotated-prototype li .function-prototype { + border: none; + padding: 0px; +} + +.annotated-prototype li .declaration-prototype { + padding: 2em 0px; +} + +#page-nav ul { + margin: 0px; + padding: 0px; + list-style: none; +} + +.parameter-name > a[href^="#"], +a.parameter-name[href^="#"] { + color: inherit; +} + + + +/* adrdox special syntax styles */ + +.small-table { + border-collapse: collapse; + min-width: 10em; +} + +.small-table td, +.small-table th { + border: solid 1px #ccc; + padding: 0.25em; +} + +.small-table thead th { + border-bottom: solid 2px #999; +} + +.small-table tbody th, +.small-table.two-axes thead th:first-child { + border-right: solid 2px #999; +} + +.small-table.two-axes td, +.small-table.two-axes th { + text-align: center; + vertical-align: middle; +} + +.adrdox-sample { + display: table; + width: 100%; +} + +.adrdox-sample > div { + display: table-row; +} + +.adrdox-sample > div > * { + display: table-cell; + width: 50%; + vertical-align: top; + border-bottom: dashed 1px #ccc; + padding: 0.25em; + padding-bottom: 0.5em; +} + +.adrdox-sample > div > pre { + border-right: dashed 1px #ccc; +} + +.adrdox-sample > div > pre::before, +.adrdox-sample > div > div::before { + display: block; + font-style: italic; + border-bottom: dashed 1px #ccc; + margin-bottom: 0.5em; + font-family: sans-serif; + font-size: 1rem; + padding: 0px; +} + +.adrdox-sample > div > pre::before { + content: 'Doc source:'; +} +.adrdox-sample > div > div::before { + content: 'Rendered:'; +} + +blockquote { + margin: 1em; + padding: 1em; + border-left: 0.5em solid #ccc; + color: #333; +} + +pre.d_code, +.block-code:not([data-language=""]):not([data-language="pre"]) { + background-color: #fcfcfc; + padding: 0.25em; + border: solid 1px #ccc; + position: relative; +} + +.block-code:not([data-language=""]):not([data-language="pre"])::before { + content: attr(data-language); + display: block; + text-transform: capitalize; + font-size: 0.9rem; + padding: 0px 2px; + border: solid 1px #999; + border-top: none; + border-radius: 0px 0px 0.25em 0.25em; + background-color: #f0f0f0; + float: right; + margin: 0px; + margin-top: -0.25em; + margin-top: calc(-0.25em - 1px); +} +.type, +.highlighted-type { + color: green; + /* font-weight: bold; */ +} +.num, +.highlighted-number { + color: #dc322f; +} +.str, +.highlighted-string { + color: red; +} +.com, +.highlighted-comment { + color: blue; +} +.highlighted-preprocessor-directive { + color: #cd00cd; +} +.highlighted-identifier, +.highlighted-tag { + color: #008888; +} +.highlighted-tag-name { + color: #859900; +} +.highlighted-entity { + color: #cd00cd; + text-decoration: none; + cursor: help; +} +.highlighted-named-constant, +.highlighted-attribute-name { + color: green; +} +.highlighted-attribute-value { + color: red; +} +.highlighted-python-indent { + background: linear-gradient(to right, #eee, transparent 3px) no-repeat; +} +.highlighted-python-indent:hover { + background: linear-gradient(to right, #ccc, transparent 3px) no-repeat; +} + +/* +.with-line-wrappers { + counter-reset: line_numbers; +} + +.with-line-wrappers span.br { + counter-increment: line_numbers; +} + +.with-line-wrappers span.br::before { + content: counter(line_numbers); +*/ +.with-line-wrappers .br { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + width: 3em; + width: 4ch; + display: inline-block; + color: #999; + border-right: solid 2px #ccc; + padding: 0px; + margin: 0px; + margin-right: 3px; + padding-right: 3px; + font-style: normal; + font-weight: normal; + background-color: transparent; + text-align: right; + white-space: pre; +} + +.hide-line-numbers .with-line-wrappers .br { + display: none; +} +.with-line-wrappers .br:target { + background: #ffffbb; +} + +.thousand-lines.with-line-wrappers .br { + width: 4em; + width: 5ch; +} +.ten-thousand-lines.with-line-wrappers .br { + width: 5em; + width: 6ch; +} + +#source-navigation { + position: fixed; + width: 15.5em; +} + +#source-navigation .list-holder { + width: 100%; + overflow: auto; + max-height: 80vh; +} + +#source-navigation .list-holder ul { + padding-left: 1em; +} + +/* hide nested decls as it is too much... */ +#source-navigation .list-holder ul > li > ul { + display: none; +} + +/* ...but show top-level decls under the module cuz no reason not to */ +#source-navigation .list-holder > ul > li > ul { + display: block; +} + +#source-navigation li { + white-space: nowrap; +} + +#source-navigation a { + display: inline; +} + +.postcondition { + color: blue; + font-family: monospace; + font-size: 0.9rem; +} +.postcondition::before { + content: "Post: "; + font-style: italic; + color: black; +} + +.user-table { + border-top: solid 2px black; + border-collapse: collapse; +} + +.user-table tr:nth-of-type(1) th { + border-bottom: solid 1px black; + text-align: left; +} + +.user-table td { + border-bottom: solid 1px #ccc; + vertical-align: top; + padding: 4px; +} +.user-table th { + padding: 4px; +} + +.user-table.two-axes tr + tr th:first-child { + border-bottom: solid 1px #ccc; +} + +.user-table.two-axes th:first-child { + border-right: solid 1px black; + text-align: right; +} + +.allocator-table td:first-child tt { + background-color: transparent; + white-space: nowrap; + font-weight: bold; +} + +.header-anchor { + color: inherit !important; +} + +#members + h3, +.member-list + h3, +h3.member-list-header { + border-bottom: solid 1px #333; + text-transform: capitalize; +} + +#members + h4, +.member-list + h4, +h4.member-list-header { + font-weight: normal; + text-transform: capitalize; + text-decoration: underline; +} + + +tr.leading-row th { + border-bottom: solid 2px black; +} + +.lambda-expression * { + display: inline !important; + padding: 0px !important; + margin: 0px !important; +} + +.footnote-ref a {} +.footnote-ref abbr { + font-variant: none; + text-decoration: none; + cursor: help; +} + +.side-by-side { + table-layout: fixed; + border: none; + width: 100%; +} + +.side-by-side > tbody > tr > td { + vertical-align: top; +} + +/* +tt.D { + font-weight: bold; + background: transparent; + color: inherit; +} +*/ + +tt.D.highlighted *:not(a) { + font-weight: inherit; + color: inherit; +} +tt.D.highlighted a { + color: #500000; +} + +.date-posted { + font-size: 0.9rem; + font-style: italic; +} + +.token-string-literal { + font-style: italic; +} +.token-string-literal:hover { + background-color: rgba(255, 0, 0, 0.05); +} + +.specially-highlighted { + background-color: yellow; + background-color: rgba(255, 255, 0, 0.5); +} + +.console .specially-highlighted { + background-color: rgba(255, 255, 0, 1.0); + color: black; +} + +.quickindex { + background: #f5f5f5; + max-width: 760px; +} + +.quickindex .phobos-booktable { + width: 100%; +} + +.leading-row { + font-style: italic; + background-color: rgb(228, 233, 239); +} + +.leading-row th { + padding-left: 1.5em; +} + +.quickindex td, .quickindex th { + padding-left: 0.3em; +} + +.undocumented-note { + color: #999; +} + +.deprecated-decl { + color: #c00; + font-weight: bold; +} + +.conditional-compilation-attributes { + font-size: 90%; +} + +@media (prefers-color-scheme: dark) { + body { + color: #ddd; + background-color: black; + } + + a:link, a:visited { + color: #00aaff !important; + } + + #page-nav { + background-color: #333 !important; + } + + tt.D, + .inline-code { + background-color: #444; + color: #eee; + } + + .block-code:not([data-language=""]):not([data-language="pre"]), + pre.d_code { + background-color: #444; + color: #eee; + } + + .tip { + background-color: #306630; + } + + .pitfall { + background-color: #663030; + } + + .warning { + background-color: #666630; + } + + .note { + background-color: #3333aa; + } + + .sidebar { + background-color: #555; + } + + .member-list dt .simplified-prototype { + color: #aaa; + border-color: black; + } + + .member-list dt .simplified-prototype:hover { + background-color: black; + border-color: #555; + } + + .highlighted-comment, + .com { + color: #0ff !important; + } + + .kwrd, + .highlighted-keyword, + .lang-feature, + .storage-class { + color: #8ff !important; + } + + .type-constructor, + .builtin-type { + color: #00cc00 !important; + } + + .type, + .highlighted-type { + color: lime; + } +} + diff --git a/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.html b/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.html new file mode 100644 index 0000000..936b5d3 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.html @@ -0,0 +1,36 @@ + + + + ClientAddress (handy_http_primitives.address.ClientAddress) + + + + + + + + + + +
+
+

ClientAddress

A compound type representing the address of any entity sending an HTTP +request. Use type to determine which information is available.

Members

Functions

toString
string toString()

Serializes this address in a human-readable string representation.

Static functions

ofIPv4
ClientAddress ofIPv4(IPv4InternetAddress addr)
Undocumented in source. Be warned that the author may not have intended to support it.
ofIPv6
ClientAddress ofIPv6(IPv6InternetAddress addr)
Undocumented in source. Be warned that the author may not have intended to support it.
ofUnixSocket
ClientAddress ofUnixSocket(UnixSocketAddress addr)
Undocumented in source. Be warned that the author may not have intended to support it.
unknown
ClientAddress unknown()
Undocumented in source. Be warned that the author may not have intended to support it.

Variables

ipv4InternetAddress
IPv4InternetAddress ipv4InternetAddress;
Undocumented in source.
ipv6InternetAddress
IPv6InternetAddress ipv6InternetAddress;
Undocumented in source.
type
ClientAddressType type;
Undocumented in source.
unixSocketAddress
UnixSocketAddress unixSocketAddress;
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.ipv4InternetAddress.html b/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.ipv4InternetAddress.html new file mode 100644 index 0000000..8d3203c --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.ipv4InternetAddress.html @@ -0,0 +1,35 @@ + + + + ClientAddress.ipv4InternetAddress (handy_http_primitives.address.ClientAddress.ipv4InternetAddress) + + + + + + + + + + +
+
+

ClientAddress.ipv4InternetAddress

Undocumented in source.
struct ClientAddress
IPv4InternetAddress ipv4InternetAddress;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.ipv6InternetAddress.html b/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.ipv6InternetAddress.html new file mode 100644 index 0000000..4ad3427 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.ipv6InternetAddress.html @@ -0,0 +1,35 @@ + + + + ClientAddress.ipv6InternetAddress (handy_http_primitives.address.ClientAddress.ipv6InternetAddress) + + + + + + + + + + +
+
+

ClientAddress.ipv6InternetAddress

Undocumented in source.
struct ClientAddress
IPv6InternetAddress ipv6InternetAddress;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.ofIPv4.html b/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.ofIPv4.html new file mode 100644 index 0000000..0fcf9c5 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.ofIPv4.html @@ -0,0 +1,35 @@ + + + + ClientAddress.ofIPv4 (handy_http_primitives.address.ClientAddress.ofIPv4) + + + + + + + + + + +
+
+

ClientAddress.ofIPv4

Undocumented in source. Be warned that the author may not have intended to support it.
struct ClientAddress
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.ofIPv6.html b/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.ofIPv6.html new file mode 100644 index 0000000..8ad463d --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.ofIPv6.html @@ -0,0 +1,35 @@ + + + + ClientAddress.ofIPv6 (handy_http_primitives.address.ClientAddress.ofIPv6) + + + + + + + + + + +
+
+

ClientAddress.ofIPv6

Undocumented in source. Be warned that the author may not have intended to support it.
struct ClientAddress
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.ofUnixSocket.html b/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.ofUnixSocket.html new file mode 100644 index 0000000..62757b0 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.ofUnixSocket.html @@ -0,0 +1,35 @@ + + + + ClientAddress.ofUnixSocket (handy_http_primitives.address.ClientAddress.ofUnixSocket) + + + + + + + + + + +
+
+

ClientAddress.ofUnixSocket

Undocumented in source. Be warned that the author may not have intended to support it.
struct ClientAddress
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.toString.html b/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.toString.html new file mode 100644 index 0000000..88dac85 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.toString.html @@ -0,0 +1,35 @@ + + + + ClientAddress.toString (handy_http_primitives.address.ClientAddress.toString) + + + + + + + + + + +
+
+

ClientAddress.toString

Serializes this address in a human-readable string representation.

struct ClientAddress
const
string
toString
()

Return Value

Type: string

The string representation of this address.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.type.html b/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.type.html new file mode 100644 index 0000000..e8d02a4 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.type.html @@ -0,0 +1,35 @@ + + + + ClientAddress.type (handy_http_primitives.address.ClientAddress.type) + + + + + + + + + + +
+
+

ClientAddress.type

Undocumented in source.
struct ClientAddress
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.unixSocketAddress.html b/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.unixSocketAddress.html new file mode 100644 index 0000000..c935f1d --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.unixSocketAddress.html @@ -0,0 +1,35 @@ + + + + ClientAddress.unixSocketAddress (handy_http_primitives.address.ClientAddress.unixSocketAddress) + + + + + + + + + + +
+
+

ClientAddress.unixSocketAddress

Undocumented in source.
struct ClientAddress
UnixSocketAddress unixSocketAddress;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.unknown.html b/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.unknown.html new file mode 100644 index 0000000..8b567e4 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.address.ClientAddress.unknown.html @@ -0,0 +1,35 @@ + + + + ClientAddress.unknown (handy_http_primitives.address.ClientAddress.unknown) + + + + + + + + + + +
+
+

ClientAddress.unknown

Undocumented in source. Be warned that the author may not have intended to support it.
struct ClientAddress
static
unknown
()
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.address.ClientAddressType.html b/docs/ddoc/primitives/handy_http_primitives.address.ClientAddressType.html new file mode 100644 index 0000000..150394e --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.address.ClientAddressType.html @@ -0,0 +1,35 @@ + + + + ClientAddressType (handy_http_primitives.address.ClientAddressType) + + + + + + + + + + +
+
+

ClientAddressType

Defines the different possible address types, used by ClientAddress.

Values

ValueMeaning
IPv4
IPv6
UNIX
UNKNOWN
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.address.IPv4InternetAddress.bytes.html b/docs/ddoc/primitives/handy_http_primitives.address.IPv4InternetAddress.bytes.html new file mode 100644 index 0000000..0a5b8b4 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.address.IPv4InternetAddress.bytes.html @@ -0,0 +1,35 @@ + + + + IPv4InternetAddress.bytes (handy_http_primitives.address.IPv4InternetAddress.bytes) + + + + + + + + + + +
+
+

IPv4InternetAddress.bytes

Undocumented in source.
struct IPv4InternetAddress
ubyte[4] bytes;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.address.IPv4InternetAddress.html b/docs/ddoc/primitives/handy_http_primitives.address.IPv4InternetAddress.html new file mode 100644 index 0000000..f271260 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.address.IPv4InternetAddress.html @@ -0,0 +1,36 @@ + + + + IPv4InternetAddress (handy_http_primitives.address.IPv4InternetAddress) + + + + + + + + + + +
+
+

IPv4InternetAddress

Represents a 4-byte IPv4 network address and the port number on this machine +that the connection was assigned to.

struct IPv4InternetAddress {}

Members

Variables

bytes
ubyte[4] bytes;
Undocumented in source.
port
ushort port;
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.address.IPv4InternetAddress.port.html b/docs/ddoc/primitives/handy_http_primitives.address.IPv4InternetAddress.port.html new file mode 100644 index 0000000..a27fd21 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.address.IPv4InternetAddress.port.html @@ -0,0 +1,35 @@ + + + + IPv4InternetAddress.port (handy_http_primitives.address.IPv4InternetAddress.port) + + + + + + + + + + +
+
+

IPv4InternetAddress.port

Undocumented in source.
struct IPv4InternetAddress
ushort port;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.address.IPv6InternetAddress.bytes.html b/docs/ddoc/primitives/handy_http_primitives.address.IPv6InternetAddress.bytes.html new file mode 100644 index 0000000..2559b89 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.address.IPv6InternetAddress.bytes.html @@ -0,0 +1,35 @@ + + + + IPv6InternetAddress.bytes (handy_http_primitives.address.IPv6InternetAddress.bytes) + + + + + + + + + + +
+
+

IPv6InternetAddress.bytes

Undocumented in source.
struct IPv6InternetAddress
ubyte[16] bytes;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.address.IPv6InternetAddress.html b/docs/ddoc/primitives/handy_http_primitives.address.IPv6InternetAddress.html new file mode 100644 index 0000000..96de036 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.address.IPv6InternetAddress.html @@ -0,0 +1,36 @@ + + + + IPv6InternetAddress (handy_http_primitives.address.IPv6InternetAddress) + + + + + + + + + + +
+
+

IPv6InternetAddress

Represents a 16-byte IPv6 network address and the port number on this +machine that the connection was assigned to.

struct IPv6InternetAddress {}

Members

Variables

bytes
ubyte[16] bytes;
Undocumented in source.
port
ushort port;
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.address.IPv6InternetAddress.port.html b/docs/ddoc/primitives/handy_http_primitives.address.IPv6InternetAddress.port.html new file mode 100644 index 0000000..4536a2b --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.address.IPv6InternetAddress.port.html @@ -0,0 +1,35 @@ + + + + IPv6InternetAddress.port (handy_http_primitives.address.IPv6InternetAddress.port) + + + + + + + + + + +
+
+

IPv6InternetAddress.port

Undocumented in source.
struct IPv6InternetAddress
ushort port;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.address.UnixSocketAddress.html b/docs/ddoc/primitives/handy_http_primitives.address.UnixSocketAddress.html new file mode 100644 index 0000000..6434636 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.address.UnixSocketAddress.html @@ -0,0 +1,36 @@ + + + + UnixSocketAddress (handy_http_primitives.address.UnixSocketAddress) + + + + + + + + + + +
+
+

UnixSocketAddress

Represents a unix socket address, which is just a path to a file at which +IO operations take place.

struct UnixSocketAddress {}

Members

Variables

path
string path;
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.address.UnixSocketAddress.path.html b/docs/ddoc/primitives/handy_http_primitives.address.UnixSocketAddress.path.html new file mode 100644 index 0000000..62ac1d1 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.address.UnixSocketAddress.path.html @@ -0,0 +1,35 @@ + + + + UnixSocketAddress.path (handy_http_primitives.address.UnixSocketAddress.path) + + + + + + + + + + +
+
+

UnixSocketAddress.path

Undocumented in source.
struct UnixSocketAddress
string path;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.address.html b/docs/ddoc/primitives/handy_http_primitives.address.html new file mode 100644 index 0000000..837feef --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.address.html @@ -0,0 +1,39 @@ + + + + handy_http_primitives.address (handy_http_primitives.address) + + + + + + + + + + +
+
+

handy_http_primitives.address

Defines various address types for use with HTTP communication.

Members

Enums

ClientAddressType
enum ClientAddressType

Defines the different possible address types, used by ClientAddress.

Structs

ClientAddress
struct ClientAddress

A compound type representing the address of any entity sending an HTTP +request. Use type to determine which information is available.

IPv4InternetAddress
struct IPv4InternetAddress

Represents a 4-byte IPv4 network address and the port number on this machine +that the connection was assigned to.

IPv6InternetAddress
struct IPv6InternetAddress

Represents a 16-byte IPv6 network address and the port number on this +machine that the connection was assigned to.

UnixSocketAddress
struct UnixSocketAddress

Represents a unix socket address, which is just a path to a file at which +IO operations take place.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.build.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.build.html new file mode 100644 index 0000000..eb504a1 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.build.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequestBuilder.build (handy_http_primitives.builder.ServerHttpRequestBuilder.build) + + + + + + + + + + +
+
+

ServerHttpRequestBuilder.build

Undocumented in source. Be warned that the author may not have intended to support it.
struct ServerHttpRequestBuilder
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.clientAddress.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.clientAddress.html new file mode 100644 index 0000000..7a407ce --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.clientAddress.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequestBuilder.clientAddress (handy_http_primitives.builder.ServerHttpRequestBuilder.clientAddress) + + + + + + + + + + +
+
+

ServerHttpRequestBuilder.clientAddress

Undocumented in source.
struct ServerHttpRequestBuilder
ClientAddress clientAddress;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.contextData.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.contextData.html new file mode 100644 index 0000000..3f5e94a --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.contextData.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequestBuilder.contextData (handy_http_primitives.builder.ServerHttpRequestBuilder.contextData) + + + + + + + + + + +
+
+

ServerHttpRequestBuilder.contextData

Undocumented in source.
struct ServerHttpRequestBuilder
Object[string] contextData;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.headers.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.headers.html new file mode 100644 index 0000000..f05033c --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.headers.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequestBuilder.headers (handy_http_primitives.builder.ServerHttpRequestBuilder.headers) + + + + + + + + + + +
+
+

ServerHttpRequestBuilder.headers

Undocumented in source.
struct ServerHttpRequestBuilder
string[][string] headers;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.html new file mode 100644 index 0000000..f16cf44 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequestBuilder (handy_http_primitives.builder.ServerHttpRequestBuilder) + + + + + + + + + + +
+
+

ServerHttpRequestBuilder

Fluent interface for building ServerHttpRequest objects.

Members

Functions

build
ServerHttpRequest build()
Undocumented in source. Be warned that the author may not have intended to support it.
withBody
ref withBody(string bodyStr)
Undocumented in source. Be warned that the author may not have intended to support it.
withBody
ref withBody(ubyte[] bodyBytes)
Undocumented in source. Be warned that the author may not have intended to support it.
withClientAddress
ref withClientAddress(ClientAddress addr)
Undocumented in source. Be warned that the author may not have intended to support it.
withContextData
ref withContextData(string key, Object obj)
Undocumented in source. Be warned that the author may not have intended to support it.
withHeader
ref withHeader(string headerName, string value)
Undocumented in source. Be warned that the author may not have intended to support it.
withInputStream
ref withInputStream(S stream)
Undocumented in source. Be warned that the author may not have intended to support it.
withMethod
ref withMethod(string method)
Undocumented in source. Be warned that the author may not have intended to support it.
withQueryParam
ref withQueryParam(string paramName, string value)
Undocumented in source. Be warned that the author may not have intended to support it.
withUrl
ref withUrl(string url)
Undocumented in source. Be warned that the author may not have intended to support it.
withVersion
ref withVersion(HttpVersion httpVersion)
Undocumented in source. Be warned that the author may not have intended to support it.

Variables

clientAddress
ClientAddress clientAddress;
Undocumented in source.
contextData
Object[string] contextData;
Undocumented in source.
headers
string[][string] headers;
Undocumented in source.
httpVersion
HttpVersion httpVersion;
Undocumented in source.
inputStream
InputStream!ubyte inputStream;
Undocumented in source.
method
string method;
Undocumented in source.
queryParams
QueryParameter[] queryParams;
Undocumented in source.
url
string url;
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.httpVersion.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.httpVersion.html new file mode 100644 index 0000000..773b707 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.httpVersion.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequestBuilder.httpVersion (handy_http_primitives.builder.ServerHttpRequestBuilder.httpVersion) + + + + + + + + + + +
+
+

ServerHttpRequestBuilder.httpVersion

Undocumented in source.
struct ServerHttpRequestBuilder
HttpVersion httpVersion;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.inputStream.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.inputStream.html new file mode 100644 index 0000000..b819d4a --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.inputStream.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequestBuilder.inputStream (handy_http_primitives.builder.ServerHttpRequestBuilder.inputStream) + + + + + + + + + + +
+
+

ServerHttpRequestBuilder.inputStream

Undocumented in source.
struct ServerHttpRequestBuilder
InputStream!ubyte inputStream;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.method.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.method.html new file mode 100644 index 0000000..2bb1e48 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.method.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequestBuilder.method (handy_http_primitives.builder.ServerHttpRequestBuilder.method) + + + + + + + + + + +
+
+

ServerHttpRequestBuilder.method

Undocumented in source.
struct ServerHttpRequestBuilder
string method;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.queryParams.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.queryParams.html new file mode 100644 index 0000000..5e5ee29 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.queryParams.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequestBuilder.queryParams (handy_http_primitives.builder.ServerHttpRequestBuilder.queryParams) + + + + + + + + + + +
+
+

ServerHttpRequestBuilder.queryParams

Undocumented in source.
struct ServerHttpRequestBuilder
QueryParameter[] queryParams;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.url.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.url.html new file mode 100644 index 0000000..1c75542 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.url.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequestBuilder.url (handy_http_primitives.builder.ServerHttpRequestBuilder.url) + + + + + + + + + + +
+
+

ServerHttpRequestBuilder.url

Undocumented in source.
struct ServerHttpRequestBuilder
string url;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withBody.1.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withBody.1.html new file mode 100644 index 0000000..4eb1cbd --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withBody.1.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequestBuilder.withBody (handy_http_primitives.builder.ServerHttpRequestBuilder.withBody) + + + + + + + + + + +
+
+

ServerHttpRequestBuilder.withBody

Undocumented in source. Be warned that the author may not have intended to support it.
  1. ref withBody(ubyte[] bodyBytes)
    struct ServerHttpRequestBuilder
    ref
    withBody
    (
    ubyte[] bodyBytes
    )
  2. ref withBody(string bodyStr)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withBody.2.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withBody.2.html new file mode 100644 index 0000000..3b6899b --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withBody.2.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequestBuilder.withBody (handy_http_primitives.builder.ServerHttpRequestBuilder.withBody) + + + + + + + + + + +
+
+

ServerHttpRequestBuilder.withBody

Undocumented in source. Be warned that the author may not have intended to support it.
  1. ref withBody(ubyte[] bodyBytes)
  2. ref withBody(string bodyStr)
    struct ServerHttpRequestBuilder
    ref
    withBody
    (
    string bodyStr
    )
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withBody.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withBody.html new file mode 100644 index 0000000..c48a8fd --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withBody.html @@ -0,0 +1 @@ + Continue to overload \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withClientAddress.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withClientAddress.html new file mode 100644 index 0000000..f3a1eb8 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withClientAddress.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequestBuilder.withClientAddress (handy_http_primitives.builder.ServerHttpRequestBuilder.withClientAddress) + + + + + + + + + + +
+
+

ServerHttpRequestBuilder.withClientAddress

Undocumented in source. Be warned that the author may not have intended to support it.
struct ServerHttpRequestBuilder
ref
withClientAddress
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withContextData.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withContextData.html new file mode 100644 index 0000000..2b04dfa --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withContextData.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequestBuilder.withContextData (handy_http_primitives.builder.ServerHttpRequestBuilder.withContextData) + + + + + + + + + + +
+
+

ServerHttpRequestBuilder.withContextData

Undocumented in source. Be warned that the author may not have intended to support it.
struct ServerHttpRequestBuilder
ref
withContextData
(
string key
,
Object obj
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withHeader.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withHeader.html new file mode 100644 index 0000000..b3ba91a --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withHeader.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequestBuilder.withHeader (handy_http_primitives.builder.ServerHttpRequestBuilder.withHeader) + + + + + + + + + + +
+
+

ServerHttpRequestBuilder.withHeader

Undocumented in source. Be warned that the author may not have intended to support it.
struct ServerHttpRequestBuilder
ref
withHeader
(
string headerName
,
string value
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withInputStream.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withInputStream.html new file mode 100644 index 0000000..6a9e219 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withInputStream.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequestBuilder.withInputStream (handy_http_primitives.builder.ServerHttpRequestBuilder.withInputStream) + + + + + + + + + + +
+
+

ServerHttpRequestBuilder.withInputStream

Undocumented in source. Be warned that the author may not have intended to support it.
struct ServerHttpRequestBuilder
ref
withInputStream
(
S
)
()
if (
isByteInputStream!S
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withMethod.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withMethod.html new file mode 100644 index 0000000..970fd10 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withMethod.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequestBuilder.withMethod (handy_http_primitives.builder.ServerHttpRequestBuilder.withMethod) + + + + + + + + + + +
+
+

ServerHttpRequestBuilder.withMethod

Undocumented in source. Be warned that the author may not have intended to support it.
struct ServerHttpRequestBuilder
ref
withMethod
(
string method
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withQueryParam.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withQueryParam.html new file mode 100644 index 0000000..77b4d52 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withQueryParam.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequestBuilder.withQueryParam (handy_http_primitives.builder.ServerHttpRequestBuilder.withQueryParam) + + + + + + + + + + +
+
+

ServerHttpRequestBuilder.withQueryParam

Undocumented in source. Be warned that the author may not have intended to support it.
struct ServerHttpRequestBuilder
ref
withQueryParam
(
string paramName
,
string value
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withUrl.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withUrl.html new file mode 100644 index 0000000..122e540 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withUrl.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequestBuilder.withUrl (handy_http_primitives.builder.ServerHttpRequestBuilder.withUrl) + + + + + + + + + + +
+
+

ServerHttpRequestBuilder.withUrl

Undocumented in source. Be warned that the author may not have intended to support it.
struct ServerHttpRequestBuilder
ref
withUrl
(
string url
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withVersion.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withVersion.html new file mode 100644 index 0000000..4c81e4a --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpRequestBuilder.withVersion.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequestBuilder.withVersion (handy_http_primitives.builder.ServerHttpRequestBuilder.withVersion) + + + + + + + + + + +
+
+

ServerHttpRequestBuilder.withVersion

Undocumented in source. Be warned that the author may not have intended to support it.
struct ServerHttpRequestBuilder
ref
withVersion
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.build.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.build.html new file mode 100644 index 0000000..16c327e --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.build.html @@ -0,0 +1,35 @@ + + + + ServerHttpResponseBuilder.build (handy_http_primitives.builder.ServerHttpResponseBuilder.build) + + + + + + + + + + +
+
+

ServerHttpResponseBuilder.build

Undocumented in source. Be warned that the author may not have intended to support it.
struct ServerHttpResponseBuilder
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.html new file mode 100644 index 0000000..e39d7fd --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.html @@ -0,0 +1,35 @@ + + + + ServerHttpResponseBuilder (handy_http_primitives.builder.ServerHttpResponseBuilder) + + + + + + + + + + +
+
+

ServerHttpResponseBuilder

Fluent interface for building ServerHttpResponse objects.

Members

Functions

build
ServerHttpResponse build()
Undocumented in source. Be warned that the author may not have intended to support it.
withHeader
ref withHeader(string headerName, string value)
Undocumented in source. Be warned that the author may not have intended to support it.
withOutputStream
ref withOutputStream(S stream)
Undocumented in source. Be warned that the author may not have intended to support it.
withStatus
ref withStatus(StatusInfo status)
Undocumented in source. Be warned that the author may not have intended to support it.

Variables

initialHeaders
StringMultiValueMap initialHeaders;
Undocumented in source.
initialStatus
StatusInfo initialStatus;
Undocumented in source.
outputStream
OutputStream!ubyte outputStream;
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.initialHeaders.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.initialHeaders.html new file mode 100644 index 0000000..fce3d5e --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.initialHeaders.html @@ -0,0 +1,35 @@ + + + + ServerHttpResponseBuilder.initialHeaders (handy_http_primitives.builder.ServerHttpResponseBuilder.initialHeaders) + + + + + + + + + + +
+
+

ServerHttpResponseBuilder.initialHeaders

Undocumented in source.
struct ServerHttpResponseBuilder
StringMultiValueMap initialHeaders;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.initialStatus.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.initialStatus.html new file mode 100644 index 0000000..729d2ef --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.initialStatus.html @@ -0,0 +1,35 @@ + + + + ServerHttpResponseBuilder.initialStatus (handy_http_primitives.builder.ServerHttpResponseBuilder.initialStatus) + + + + + + + + + + +
+
+

ServerHttpResponseBuilder.initialStatus

Undocumented in source.
struct ServerHttpResponseBuilder
StatusInfo initialStatus;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.outputStream.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.outputStream.html new file mode 100644 index 0000000..588abe3 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.outputStream.html @@ -0,0 +1,35 @@ + + + + ServerHttpResponseBuilder.outputStream (handy_http_primitives.builder.ServerHttpResponseBuilder.outputStream) + + + + + + + + + + +
+
+

ServerHttpResponseBuilder.outputStream

Undocumented in source.
struct ServerHttpResponseBuilder
OutputStream!ubyte outputStream;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.withHeader.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.withHeader.html new file mode 100644 index 0000000..5710626 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.withHeader.html @@ -0,0 +1,35 @@ + + + + ServerHttpResponseBuilder.withHeader (handy_http_primitives.builder.ServerHttpResponseBuilder.withHeader) + + + + + + + + + + +
+
+

ServerHttpResponseBuilder.withHeader

Undocumented in source. Be warned that the author may not have intended to support it.
struct ServerHttpResponseBuilder
ref
withHeader
(
string headerName
,
string value
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.withOutputStream.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.withOutputStream.html new file mode 100644 index 0000000..f321105 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.withOutputStream.html @@ -0,0 +1,35 @@ + + + + ServerHttpResponseBuilder.withOutputStream (handy_http_primitives.builder.ServerHttpResponseBuilder.withOutputStream) + + + + + + + + + + +
+
+

ServerHttpResponseBuilder.withOutputStream

Undocumented in source. Be warned that the author may not have intended to support it.
struct ServerHttpResponseBuilder
ref
withOutputStream
(
S
)
()
if (
isByteOutputStream!S
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.withStatus.html b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.withStatus.html new file mode 100644 index 0000000..6082fd0 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.ServerHttpResponseBuilder.withStatus.html @@ -0,0 +1,35 @@ + + + + ServerHttpResponseBuilder.withStatus (handy_http_primitives.builder.ServerHttpResponseBuilder.withStatus) + + + + + + + + + + +
+
+

ServerHttpResponseBuilder.withStatus

Undocumented in source. Be warned that the author may not have intended to support it.
struct ServerHttpResponseBuilder
ref
withStatus
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.builder.html b/docs/ddoc/primitives/handy_http_primitives.builder.html new file mode 100644 index 0000000..e69040f --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.builder.html @@ -0,0 +1,36 @@ + + + + handy_http_primitives.builder (handy_http_primitives.builder) + + + + + + + + + + +
+
+

handy_http_primitives.builder

Defines builder types to more easily construct various HTTP objects, often +useful for testing scenarios.

Members

Structs

ServerHttpRequestBuilder
struct ServerHttpRequestBuilder

Fluent interface for building ServerHttpRequest objects.

ServerHttpResponseBuilder
struct ServerHttpResponseBuilder

Fluent interface for building ServerHttpResponse objects.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.handler.HttpRequestHandler.handle.html b/docs/ddoc/primitives/handy_http_primitives.handler.HttpRequestHandler.handle.html new file mode 100644 index 0000000..4f622a7 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.handler.HttpRequestHandler.handle.html @@ -0,0 +1,36 @@ + + + + HttpRequestHandler.handle (handy_http_primitives.handler.HttpRequestHandler.handle) + + + + + + + + + + +
+
+

HttpRequestHandler.handle

Invoked to handle an incoming HTTP request. Implementations should read +information from the request, and write to the response.

interface HttpRequestHandler

Parameters

request ServerHttpRequest

The request that was sent by a client.

response ServerHttpResponse

The response that will be sent back to the client.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.handler.HttpRequestHandler.html b/docs/ddoc/primitives/handy_http_primitives.handler.HttpRequestHandler.html new file mode 100644 index 0000000..ad8f2a4 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.handler.HttpRequestHandler.html @@ -0,0 +1,37 @@ + + + + HttpRequestHandler (handy_http_primitives.handler.HttpRequestHandler) + + + + + + + + + + +
+
+

HttpRequestHandler

Defines the request handler interface, which is called upon to handle an +incoming HTTP request.

Members

Functions

handle
void handle(ServerHttpRequest request, ServerHttpResponse response)

Invoked to handle an incoming HTTP request. Implementations should read +information from the request, and write to the response.

Static functions

of
HttpRequestHandler of(void function(ref ServerHttpRequest, ref ServerHttpResponse) fn)

Gets a request handler that invokes the given function.

of
HttpRequestHandler of(void delegate(ref ServerHttpRequest, ref ServerHttpResponse) dg)

Gets a request handler that invokes the given delegate.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.handler.HttpRequestHandler.of.1.html b/docs/ddoc/primitives/handy_http_primitives.handler.HttpRequestHandler.of.1.html new file mode 100644 index 0000000..82c09d1 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.handler.HttpRequestHandler.of.1.html @@ -0,0 +1,35 @@ + + + + HttpRequestHandler.of (handy_http_primitives.handler.HttpRequestHandler.of) + + + + + + + + + + +
+
+

HttpRequestHandler.of

Gets a request handler that invokes the given function.

  1. HttpRequestHandler of(void function(ref ServerHttpRequest, ref ServerHttpResponse) fn)
    interface HttpRequestHandler
  2. HttpRequestHandler of(void delegate(ref ServerHttpRequest, ref ServerHttpResponse) dg)

Parameters

fn void function

The function to invoke when handling requests.

Return Value

The request handler.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.handler.HttpRequestHandler.of.2.html b/docs/ddoc/primitives/handy_http_primitives.handler.HttpRequestHandler.of.2.html new file mode 100644 index 0000000..2825547 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.handler.HttpRequestHandler.of.2.html @@ -0,0 +1,35 @@ + + + + HttpRequestHandler.of (handy_http_primitives.handler.HttpRequestHandler.of) + + + + + + + + + + +
+
+

HttpRequestHandler.of

Gets a request handler that invokes the given delegate.

  1. HttpRequestHandler of(void function(ref ServerHttpRequest, ref ServerHttpResponse) fn)
  2. HttpRequestHandler of(void delegate(ref ServerHttpRequest, ref ServerHttpResponse) dg)
    interface HttpRequestHandler

Parameters

dg void delegate

The delegate to invoke when handling requests.

Return Value

The request handler.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.handler.HttpRequestHandler.of.html b/docs/ddoc/primitives/handy_http_primitives.handler.HttpRequestHandler.of.html new file mode 100644 index 0000000..c2f7230 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.handler.HttpRequestHandler.of.html @@ -0,0 +1 @@ + Continue to overload \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.handler.html b/docs/ddoc/primitives/handy_http_primitives.handler.html new file mode 100644 index 0000000..bd06690 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.handler.html @@ -0,0 +1,37 @@ + + + + handy_http_primitives.handler (handy_http_primitives.handler) + + + + + + + + + + +
+
+

handy_http_primitives.handler

Defines the core request handler interface that's the starting point for +all HTTP request processing.

Members

Interfaces

HttpRequestHandler
interface HttpRequestHandler

Defines the request handler interface, which is called upon to handle an +incoming HTTP request.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.html b/docs/ddoc/primitives/handy_http_primitives.html new file mode 100644 index 0000000..625f041 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.html @@ -0,0 +1,51 @@ + + + + handy_http_primitives (handy_http_primitives) + + + + + + + + + + +
+
+

handy_http_primitives

The handy_http_primitives module defines a set of primitive types and +interfaces that are shared among all Handy-Http libraries, and form the +basis of how requests are handled.

Modules

address
module handy_http_primitives.address

Defines various address types for use with HTTP communication.

builder
module handy_http_primitives.builder

Defines builder types to more easily construct various HTTP objects, often +useful for testing scenarios.

handler
module handy_http_primitives.handler

Defines the core request handler interface that's the starting point for +all HTTP request processing.

multivalue_map
module handy_http_primitives.multivalue_map

An implementation of a multi-valued mapping, where one key may map to one +or more values.

optional
module handy_http_primitives.optional

Module that defines an Optional type, which is a simplified version of +Phobos' Nullable, that also supports mapping the underlying data.

request
module handy_http_primitives.request

Defines the request structure and associated types that are generally used +when dealing with a client's HTTP request.

response
module handy_http_primitives.response

Defines the HTTP response structure and associated types that are generally +used when formulating a response to a client's request.

testing
module handy_http_primitives.testing

The testing module defines helper methods for testing your HTTP handling +code.

Public Imports

handy_http_primitives.request
public +import handy_http_primitives.request;
Undocumented in source.
handy_http_primitives.response
public +import handy_http_primitives.response;
Undocumented in source.
handy_http_primitives.handler
public +import handy_http_primitives.handler;
Undocumented in source.
handy_http_primitives.optional
public +import handy_http_primitives.optional;
Undocumented in source.
handy_http_primitives.multivalue_map
public +import handy_http_primitives.multivalue_map;
Undocumented in source.
handy_http_primitives.builder
public +import handy_http_primitives.builder;
Undocumented in source.
handy_http_primitives.testing
public +import handy_http_primitives.testing;
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.CaseInsensitiveStringMultiValueMap.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.CaseInsensitiveStringMultiValueMap.html new file mode 100644 index 0000000..b34c6e3 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.CaseInsensitiveStringMultiValueMap.html @@ -0,0 +1,35 @@ + + + + CaseInsensitiveStringMultiValueMap (handy_http_primitives.multivalue_map.CaseInsensitiveStringMultiValueMap) + + + + + + + + + + +
+
+

CaseInsensitiveStringMultiValueMap

A multivalued map of strings, where keys are NOT case sensitive.

alias CaseInsensitiveStringMultiValueMap = MultiValueMap!(string, string,
(
a
,
b
)
=> a < b
,
(
a
,
b
)
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Builder.add.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Builder.add.html new file mode 100644 index 0000000..d032b88 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Builder.add.html @@ -0,0 +1,35 @@ + + + + Builder.add (handy_http_primitives.multivalue_map.MultiValueMap.Builder.add) + + + + + + + + + + +
+
+

Builder.add

Adds a key -> value pair to the builder's map.

struct Builder
ref
add
(
KeyType k
,
ValueType v
)

Parameters

k KeyType

The key.

v ValueType

The value associated with the key.

Return Value

Type: Builder

A reference to the builder, for method chaining.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Builder.build.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Builder.build.html new file mode 100644 index 0000000..3ef2ba7 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Builder.build.html @@ -0,0 +1,35 @@ + + + + Builder.build (handy_http_primitives.multivalue_map.MultiValueMap.Builder.build) + + + + + + + + + + +
+
+

Builder.build

Builds the multivalued map.

struct Builder

Return Value

The map that was created.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Builder.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Builder.html new file mode 100644 index 0000000..f81080e --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Builder.html @@ -0,0 +1,38 @@ + + + + MultiValueMap.Builder (handy_http_primitives.multivalue_map.MultiValueMap.Builder) + + + + + + + + + + +
+
+

MultiValueMap.Builder

An efficient builder that can be used to construct a multivalued map +with successive add calls, which is more efficient than doing so +directly due to the builder's deferred sorting.

struct MultiValueMap(KeyType, ValueType, alias KeySort = (a, b) => a < b, alias KeyEquals = (a, b) => a == b)

Members

Functions

add
Builder add(KeyType k, ValueType v)

Adds a key -> value pair to the builder's map.

build
MultiValueMap build()

Builds the multivalued map.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Entry.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Entry.html new file mode 100644 index 0000000..8296ee6 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Entry.html @@ -0,0 +1,36 @@ + + + + MultiValueMap.Entry (handy_http_primitives.multivalue_map.MultiValueMap.Entry) + + + + + + + + + + +
+
+

MultiValueMap.Entry

The internal structure used to store each key and set of values.

struct MultiValueMap(KeyType, ValueType, alias KeySort = (a, b) => a < b, alias KeyEquals = (a, b) => a == b)

Members

Functions

toString
string toString()

Gets a human-readable string representation of this entry.

Variables

key
KeyType key;

The key for this entry.

values
ValueType[] values;

The list of values associated with this entry's key. This always +contains at least one value.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Entry.key.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Entry.key.html new file mode 100644 index 0000000..5be0215 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Entry.key.html @@ -0,0 +1,35 @@ + + + + Entry.key (handy_http_primitives.multivalue_map.MultiValueMap.Entry.key) + + + + + + + + + + +
+
+

Entry.key

The key for this entry.

struct Entry
KeyType key;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Entry.toString.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Entry.toString.html new file mode 100644 index 0000000..f52a950 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Entry.toString.html @@ -0,0 +1,35 @@ + + + + Entry.toString (handy_http_primitives.multivalue_map.MultiValueMap.Entry.toString) + + + + + + + + + + +
+
+

Entry.toString

Gets a human-readable string representation of this entry.

struct Entry
const
string
toString
()

Return Value

Type: string

A string representation of this entry.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Entry.values.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Entry.values.html new file mode 100644 index 0000000..485bf01 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.Entry.values.html @@ -0,0 +1,36 @@ + + + + Entry.values (handy_http_primitives.multivalue_map.MultiValueMap.Entry.values) + + + + + + + + + + +
+
+

Entry.values

The list of values associated with this entry's key. This always +contains at least one value.

struct Entry
ValueType[] values;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.add.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.add.html new file mode 100644 index 0000000..010d41c --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.add.html @@ -0,0 +1,36 @@ + + + + MultiValueMap.add (handy_http_primitives.multivalue_map.MultiValueMap.add) + + + + + + + + + + +
+
+

MultiValueMap.add

Adds a single key -> value pair to the map, with time complexity of +O(n*log(n)) due to sorting the new entry by its key.

struct MultiValueMap(KeyType, ValueType, alias KeySort = (a, b) => a < b, alias KeyEquals = (a, b) => a == b)
void
add
(
KeyType k
,
ValueType v
)

Parameters

k KeyType

The key.

v ValueType

The value associated with the key.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.asAssociativeArray.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.asAssociativeArray.html new file mode 100644 index 0000000..6d76d13 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.asAssociativeArray.html @@ -0,0 +1,36 @@ + + + + MultiValueMap.asAssociativeArray (handy_http_primitives.multivalue_map.MultiValueMap.asAssociativeArray) + + + + + + + + + + +
+
+

MultiValueMap.asAssociativeArray

Gets this multivalue map as an associative array, where each key is +mapped to a list of values.

struct MultiValueMap(KeyType, ValueType, alias KeySort = (a, b) => a < b, alias KeyEquals = (a, b) => a == b)
const
ValueType[][KeyType]
asAssociativeArray
()

Return Value

Type: ValueType[][KeyType]

The associative array.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.clear.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.clear.html new file mode 100644 index 0000000..6919e02 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.clear.html @@ -0,0 +1,35 @@ + + + + MultiValueMap.clear (handy_http_primitives.multivalue_map.MultiValueMap.clear) + + + + + + + + + + +
+
+

MultiValueMap.clear

Clears this map of all values.

struct MultiValueMap(KeyType, ValueType, alias KeySort = (a, b) => a < b, alias KeyEquals = (a, b) => a == b)
void
clear
()
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.contains.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.contains.html new file mode 100644 index 0000000..e591b15 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.contains.html @@ -0,0 +1,35 @@ + + + + MultiValueMap.contains (handy_http_primitives.multivalue_map.MultiValueMap.contains) + + + + + + + + + + +
+
+

MultiValueMap.contains

Determines if this map contains a value for the given key.

struct MultiValueMap(KeyType, ValueType, alias KeySort = (a, b) => a < b, alias KeyEquals = (a, b) => a == b)
const
bool
contains
(
KeyType k
)

Parameters

k KeyType

The key to search for.

Return Value

Type: bool

True if at least one value exists for the given key.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.fromAssociativeArray.1.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.fromAssociativeArray.1.html new file mode 100644 index 0000000..cd4cd49 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.fromAssociativeArray.1.html @@ -0,0 +1,35 @@ + + + + MultiValueMap.fromAssociativeArray (handy_http_primitives.multivalue_map.MultiValueMap.fromAssociativeArray) + + + + + + + + + + +
+
+

MultiValueMap.fromAssociativeArray

Constructs a multivalued map from an associative array.

  1. MultiValueMap!(KeyType, ValueType, KeySort) fromAssociativeArray(ValueType[][KeyType] aa)
    struct MultiValueMap(KeyType, ValueType, alias KeySort = (a, b) => a < b, alias KeyEquals = (a, b) => a == b)
    static
    MultiValueMap!(KeyType, ValueType, KeySort)
    fromAssociativeArray
    (
    ValueType[][KeyType] aa
    )
  2. MultiValueMap!(KeyType, ValueType, KeySort) fromAssociativeArray(ValueType[KeyType] aa)

Parameters

aa ValueType[][KeyType]

The associative array to use.

Return Value

Type: MultiValueMap!(KeyType, ValueType, KeySort)

The multivalued map.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.fromAssociativeArray.2.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.fromAssociativeArray.2.html new file mode 100644 index 0000000..cfc284e --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.fromAssociativeArray.2.html @@ -0,0 +1,35 @@ + + + + MultiValueMap.fromAssociativeArray (handy_http_primitives.multivalue_map.MultiValueMap.fromAssociativeArray) + + + + + + + + + + +
+
+

MultiValueMap.fromAssociativeArray

Constructs a multivalued map from an associative array of single values.

  1. MultiValueMap!(KeyType, ValueType, KeySort) fromAssociativeArray(ValueType[][KeyType] aa)
  2. MultiValueMap!(KeyType, ValueType, KeySort) fromAssociativeArray(ValueType[KeyType] aa)
    struct MultiValueMap(KeyType, ValueType, alias KeySort = (a, b) => a < b, alias KeyEquals = (a, b) => a == b)
    static
    MultiValueMap!(KeyType, ValueType, KeySort)
    fromAssociativeArray
    (
    ValueType[KeyType] aa
    )

Parameters

aa ValueType[KeyType]

The associative array to use.

Return Value

Type: MultiValueMap!(KeyType, ValueType, KeySort)

The multivalued map.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.fromAssociativeArray.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.fromAssociativeArray.html new file mode 100644 index 0000000..f950d2a --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.fromAssociativeArray.html @@ -0,0 +1 @@ + Continue to overload \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.getAll.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.getAll.html new file mode 100644 index 0000000..81dfe8f --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.getAll.html @@ -0,0 +1,36 @@ + + + + MultiValueMap.getAll (handy_http_primitives.multivalue_map.MultiValueMap.getAll) + + + + + + + + + + +
+
+

MultiValueMap.getAll

Gets all values associated with a given key, allocated in a new array.

struct MultiValueMap(KeyType, ValueType, alias KeySort = (a, b) => a < b, alias KeyEquals = (a, b) => a == b)
const
ValueType[]
getAll
(
KeyType k
)

Parameters

k KeyType

The key to get the values of.

Return Value

Type: ValueType[]

The values associated with the given key, or an empty array if +no values exist for the key.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.getFirst.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.getFirst.html new file mode 100644 index 0000000..8d30b78 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.getFirst.html @@ -0,0 +1,37 @@ + + + + MultiValueMap.getFirst (handy_http_primitives.multivalue_map.MultiValueMap.getFirst) + + + + + + + + + + +
+
+

MultiValueMap.getFirst

Gets the first value associated with a given key, as per the order in +which the values were inserted.

struct MultiValueMap(KeyType, ValueType, alias KeySort = (a, b) => a < b, alias KeyEquals = (a, b) => a == b)
const
Optional!ValueType
getFirst
(
KeyType k
)

Parameters

k KeyType

The key to get the first value of.

Return Value

Type: Optional!ValueType

An optional contains the value, if there is at least one value +for the given key.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.html new file mode 100644 index 0000000..4786be7 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.html @@ -0,0 +1,55 @@ + + + + MultiValueMap (handy_http_primitives.multivalue_map.MultiValueMap) + + + + + + + + + + +
+
+

MultiValueMap

A multi-valued mapping, where a key is mapped to one or more values. The map +is sorted by keys for O(log(n)) lookup and retrieval, and O(n*log(n)) +insertion.

KeyType is the type used for the map's keys. +ValueType is the type used for the map's values. +KeySort is a function that takes two operands and returns true if the +first one is less than the second. +KeyEquals is a function that takes two operands and returns true if they +are equal.

Members

Functions

add
void add(KeyType k, ValueType v)

Adds a single key -> value pair to the map, with time complexity of +O(n*log(n)) due to sorting the new entry by its key.

asAssociativeArray
ValueType[][KeyType] asAssociativeArray()

Gets this multivalue map as an associative array, where each key is +mapped to a list of values.

clear
void clear()

Clears this map of all values.

contains
bool contains(KeyType k)

Determines if this map contains a value for the given key.

getAll
ValueType[] getAll(KeyType k)

Gets all values associated with a given key, allocated in a new array.

getFirst
Optional!ValueType getFirst(KeyType k)

Gets the first value associated with a given key, as per the order in +which the values were inserted.

keys
KeyType[] keys()

Gets a list of all keys in this map, allocated in a new array.

length
size_t length()

Gets the number of unique keys in this map.

opApply
int opApply(int delegate(const ref KeyType, const ref ValueType) dg)

opApply implementation to allow iterating over this map by all pairs +of keys and values.

opBinaryRight
ValueType[] opBinaryRight(string lhs)

Implements opBinaryRight for the "in" operator, such that k in m will +resolve to the list of values for key k in the multivalue map m if +that key exists, or null if not.

opIndex
inout(Entry)[] opIndex()

Implements the empty index operator, which just returns the entire list +of entries in this map.

opIndex
ValueType opIndex(KeyType key)

Convenience overload to get the first value for a given key. Note: this +will throw an exception if no values exist for the given key. To avoid +this, use getFirst and deal with the missing value yourself.

remove
void remove(KeyType k)

Removes a key from the map, thus removing all values associated with +that key.

toString
string toString()

Converts this map into a human-readable string which lists each key and +all of the values for that key.

Static functions

fromAssociativeArray
MultiValueMap!(KeyType, ValueType, KeySort) fromAssociativeArray(ValueType[][KeyType] aa)

Constructs a multivalued map from an associative array.

fromAssociativeArray
MultiValueMap!(KeyType, ValueType, KeySort) fromAssociativeArray(ValueType[KeyType] aa)

Constructs a multivalued map from an associative array of single values.

Structs

Builder
struct Builder

An efficient builder that can be used to construct a multivalued map +with successive add calls, which is more efficient than doing so +directly due to the builder's deferred sorting.

Entry
struct Entry

The internal structure used to store each key and set of values.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.keys.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.keys.html new file mode 100644 index 0000000..6c48a12 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.keys.html @@ -0,0 +1,35 @@ + + + + MultiValueMap.keys (handy_http_primitives.multivalue_map.MultiValueMap.keys) + + + + + + + + + + +
+
+

MultiValueMap.keys

Gets a list of all keys in this map, allocated in a new array.

struct MultiValueMap(KeyType, ValueType, alias KeySort = (a, b) => a < b, alias KeyEquals = (a, b) => a == b)
const
KeyType[]
keys
()

Return Value

Type: KeyType[]

The list of keys in this map.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.length.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.length.html new file mode 100644 index 0000000..66b0e27 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.length.html @@ -0,0 +1,35 @@ + + + + MultiValueMap.length (handy_http_primitives.multivalue_map.MultiValueMap.length) + + + + + + + + + + +
+
+

MultiValueMap.length

Gets the number of unique keys in this map.

struct MultiValueMap(KeyType, ValueType, alias KeySort = (a, b) => a < b, alias KeyEquals = (a, b) => a == b)
const
size_t
length
()

Return Value

Type: size_t

The number of unique keys in this map.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.opApply.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.opApply.html new file mode 100644 index 0000000..260da66 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.opApply.html @@ -0,0 +1,36 @@ + + + + MultiValueMap.opApply (handy_http_primitives.multivalue_map.MultiValueMap.opApply) + + + + + + + + + + +
+
+

MultiValueMap.opApply

opApply implementation to allow iterating over this map by all pairs +of keys and values.

struct MultiValueMap(KeyType, ValueType, alias KeySort = (a, b) => a < b, alias KeyEquals = (a, b) => a == b)
const
int
opApply
(
int delegate
(
const ref KeyType
,
const ref ValueType
)
dg
)

Parameters

dg int delegate
(
const ref KeyType
,
const ref ValueType
)

The foreach body that uses each key -> value pair.

Return Value

Type: int

The result of the delegate call.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.opBinaryRight.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.opBinaryRight.html new file mode 100644 index 0000000..1e1b981 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.opBinaryRight.html @@ -0,0 +1,42 @@ + + + + MultiValueMap.opBinaryRight (handy_http_primitives.multivalue_map.MultiValueMap.opBinaryRight) + + + + + + + + + + +
+
+

MultiValueMap.opBinaryRight

Implements opBinaryRight for the "in" operator, such that k in m will +resolve to the list of values for key k in the multivalue map m if +that key exists, or null if not.

struct MultiValueMap(KeyType, ValueType, alias KeySort = (a, b) => a < b, alias KeyEquals = (a, b) => a == b)
ValueType[]
opBinaryRight
(
string op : "in"
)
(
string lhs
)

Parameters

lhs string

The key to use.

Return Value

Type: ValueType[]

A list of values for the given key, or null if no such key exists.

StringMultiValueMap m;
+m.add("a", "hello");
+assert("a" in m);
+assert(("a" in m) == ["hello"]);
+assert("b" !in m);
+assert(("b" in m) is null);
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.opIndex.1.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.opIndex.1.html new file mode 100644 index 0000000..b27233c --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.opIndex.1.html @@ -0,0 +1,36 @@ + + + + MultiValueMap.opIndex (handy_http_primitives.multivalue_map.MultiValueMap.opIndex) + + + + + + + + + + +
+
+

MultiValueMap.opIndex

Implements the empty index operator, which just returns the entire list +of entries in this map.

  1. inout(Entry)[] opIndex()
    struct MultiValueMap(KeyType, ValueType, alias KeySort = (a, b) => a < b, alias KeyEquals = (a, b) => a == b)
    inout
    inout(Entry)[]
    opIndex
    ()
  2. ValueType opIndex(KeyType key)

Return Value

Type: inout(Entry)[]

The list of entries in this map.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.opIndex.2.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.opIndex.2.html new file mode 100644 index 0000000..4a104af --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.opIndex.2.html @@ -0,0 +1,37 @@ + + + + MultiValueMap.opIndex (handy_http_primitives.multivalue_map.MultiValueMap.opIndex) + + + + + + + + + + +
+
+

MultiValueMap.opIndex

Convenience overload to get the first value for a given key. Note: this +will throw an exception if no values exist for the given key. To avoid +this, use getFirst and deal with the missing value yourself.

  1. inout(Entry)[] opIndex()
  2. ValueType opIndex(KeyType key)
    struct MultiValueMap(KeyType, ValueType, alias KeySort = (a, b) => a < b, alias KeyEquals = (a, b) => a == b)
    const
    ValueType
    opIndex
    (
    KeyType key
    )

Parameters

key KeyType

The key to get the value of.

Return Value

Type: ValueType

The first value for the given key.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.opIndex.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.opIndex.html new file mode 100644 index 0000000..7f5aa1d --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.opIndex.html @@ -0,0 +1 @@ + Continue to overload \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.remove.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.remove.html new file mode 100644 index 0000000..d092b9e --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.remove.html @@ -0,0 +1,36 @@ + + + + MultiValueMap.remove (handy_http_primitives.multivalue_map.MultiValueMap.remove) + + + + + + + + + + +
+
+

MultiValueMap.remove

Removes a key from the map, thus removing all values associated with +that key.

struct MultiValueMap(KeyType, ValueType, alias KeySort = (a, b) => a < b, alias KeyEquals = (a, b) => a == b)
void
remove
(
KeyType k
)

Parameters

k KeyType

The key to remove.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.toString.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.toString.html new file mode 100644 index 0000000..a386f29 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.MultiValueMap.toString.html @@ -0,0 +1,36 @@ + + + + MultiValueMap.toString (handy_http_primitives.multivalue_map.MultiValueMap.toString) + + + + + + + + + + +
+
+

MultiValueMap.toString

Converts this map into a human-readable string which lists each key and +all of the values for that key.

struct MultiValueMap(KeyType, ValueType, alias KeySort = (a, b) => a < b, alias KeyEquals = (a, b) => a == b)
const
string
toString
()

Return Value

Type: string

A string representation of this map.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.StringMultiValueMap.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.StringMultiValueMap.html new file mode 100644 index 0000000..e0de88a --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.StringMultiValueMap.html @@ -0,0 +1,36 @@ + + + + StringMultiValueMap (handy_http_primitives.multivalue_map.StringMultiValueMap) + + + + + + + + + + +
+
+

StringMultiValueMap

A multivalued map of strings, where each string key refers to zero or more +string values. All keys are case-sensitive.

alias StringMultiValueMap = MultiValueMap!(string, string)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.multivalue_map.html b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.html new file mode 100644 index 0000000..e7c2082 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.multivalue_map.html @@ -0,0 +1,39 @@ + + + + handy_http_primitives.multivalue_map (handy_http_primitives.multivalue_map) + + + + + + + + + + +
+
+

handy_http_primitives.multivalue_map

An implementation of a multi-valued mapping, where one key may map to one +or more values.

Members

Aliases

CaseInsensitiveStringMultiValueMap
alias CaseInsensitiveStringMultiValueMap = MultiValueMap!(string, string, (a, b) => a < b, (a, b))

A multivalued map of strings, where keys are NOT case sensitive.

StringMultiValueMap
alias StringMultiValueMap = MultiValueMap!(string, string)

A multivalued map of strings, where each string key refers to zero or more +string values. All keys are case-sensitive.

Structs

MultiValueMap
struct MultiValueMap(KeyType, ValueType, alias KeySort = (a, b) => a < b, alias KeyEquals = (a, b) => a == b)

A multi-valued mapping, where a key is mapped to one or more values. The map +is sorted by keys for O(log(n)) lookup and retrieval, and O(n*log(n)) +insertion.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.optional.Optional.empty.html b/docs/ddoc/primitives/handy_http_primitives.optional.Optional.empty.html new file mode 100644 index 0000000..4d90723 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.optional.Optional.empty.html @@ -0,0 +1,35 @@ + + + + Optional.empty (handy_http_primitives.optional.Optional.empty) + + + + + + + + + + +
+
+

Optional.empty

Constructs an optional that's empty.

struct Optional(T)
static
empty
()

Return Value

Type: Optional!T

An optional that is empty.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.optional.Optional.html b/docs/ddoc/primitives/handy_http_primitives.optional.Optional.html new file mode 100644 index 0000000..631dedf --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.optional.Optional.html @@ -0,0 +1,37 @@ + + + + Optional (handy_http_primitives.optional.Optional) + + + + + + + + + + +
+
+

Optional

A simple wrapper around a value to make it optionally present.

Members

Functions

opCast
bool opCast()

Provides a mechanism to allow usage in boolean expressions.

orElse
T orElse(T defaultValue)

Gets the value of this optional if it exists, otherwise uses a given +default value.

orElseThrow
T orElseThrow(string msg)

Gets the value of this optional if it exists, or throws an exception.

orElseThrow
T orElseThrow(Exception delegate() exceptionSupplier)

Gets the value of this optional if it exists, or throws an exception as +produced by the given delegate.

Static functions

empty
Optional!T empty()

Constructs an optional that's empty.

of
Optional!T of(T value)

Constructs an optional value using a given value.

Variables

isNull
bool isNull;

Whether this optional is empty.

value
T value;

The internal value of this optional.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.optional.Optional.isNull.html b/docs/ddoc/primitives/handy_http_primitives.optional.Optional.isNull.html new file mode 100644 index 0000000..bf13226 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.optional.Optional.isNull.html @@ -0,0 +1,35 @@ + + + + Optional.isNull (handy_http_primitives.optional.Optional.isNull) + + + + + + + + + + +
+
+

Optional.isNull

Whether this optional is empty.

struct Optional(T)
bool isNull;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.optional.Optional.of.html b/docs/ddoc/primitives/handy_http_primitives.optional.Optional.of.html new file mode 100644 index 0000000..7fdaacd --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.optional.Optional.of.html @@ -0,0 +1,35 @@ + + + + Optional.of (handy_http_primitives.optional.Optional.of) + + + + + + + + + + +
+
+

Optional.of

Constructs an optional value using a given value.

struct Optional(T)
static
of
()

Parameters

value T

The value to use.

Return Value

Type: Optional!T

An optional that contains the given value.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.optional.Optional.opCast.html b/docs/ddoc/primitives/handy_http_primitives.optional.Optional.opCast.html new file mode 100644 index 0000000..69bf459 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.optional.Optional.opCast.html @@ -0,0 +1,38 @@ + + + + Optional.opCast (handy_http_primitives.optional.Optional.opCast) + + + + + + + + + + +
+
+

Optional.opCast

Provides a mechanism to allow usage in boolean expressions.

struct Optional(T)
const
bool
opCast
(
B : bool
)
()

Return Value

Type: bool

true if non-null, false if null

auto optInt = Optional!int.empty();
+assert(!optInt);
+auto optStr = Optional!string.of("Hello");
+assert(optStr);
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.optional.Optional.orElse.html b/docs/ddoc/primitives/handy_http_primitives.optional.Optional.orElse.html new file mode 100644 index 0000000..eb4beba --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.optional.Optional.orElse.html @@ -0,0 +1,37 @@ + + + + Optional.orElse (handy_http_primitives.optional.Optional.orElse) + + + + + + + + + + +
+
+

Optional.orElse

Gets the value of this optional if it exists, otherwise uses a given +default value.

struct Optional(T)
T
orElse

Parameters

defaultValue T

The value to return if no default value exists.

Return Value

Type: T

The value of the optional, or the default value if this +optional is empty.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.optional.Optional.orElseThrow.1.html b/docs/ddoc/primitives/handy_http_primitives.optional.Optional.orElseThrow.1.html new file mode 100644 index 0000000..ac43a8f --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.optional.Optional.orElseThrow.1.html @@ -0,0 +1,35 @@ + + + + Optional.orElseThrow (handy_http_primitives.optional.Optional.orElseThrow) + + + + + + + + + + +
+
+

Optional.orElseThrow

Gets the value of this optional if it exists, or throws an exception.

  1. T orElseThrow(string msg)
    struct Optional(T)
    T
    orElseThrow
    (
    string msg = "Optional value is null."
    )
  2. T orElseThrow(Exception delegate() exceptionSupplier)

Parameters

msg string

A message to put in the exception.

Return Value

Type: T

The value of this optional.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.optional.Optional.orElseThrow.2.html b/docs/ddoc/primitives/handy_http_primitives.optional.Optional.orElseThrow.2.html new file mode 100644 index 0000000..9a00386 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.optional.Optional.orElseThrow.2.html @@ -0,0 +1,37 @@ + + + + Optional.orElseThrow (handy_http_primitives.optional.Optional.orElseThrow) + + + + + + + + + + +
+
+

Optional.orElseThrow

Gets the value of this optional if it exists, or throws an exception as +produced by the given delegate.

  1. T orElseThrow(string msg)
  2. T orElseThrow(Exception delegate() exceptionSupplier)
    struct Optional(T)
    T
    orElseThrow
    (
    Exception delegate
    ()
    exceptionSupplier
    )

Parameters

exceptionSupplier Exception delegate
()

A delegate that returns an exception to throw if + this optional is null.

Return Value

Type: T

The value of this optional.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.optional.Optional.orElseThrow.html b/docs/ddoc/primitives/handy_http_primitives.optional.Optional.orElseThrow.html new file mode 100644 index 0000000..27c699d --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.optional.Optional.orElseThrow.html @@ -0,0 +1 @@ + Continue to overload \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.optional.Optional.value.html b/docs/ddoc/primitives/handy_http_primitives.optional.Optional.value.html new file mode 100644 index 0000000..31c90f0 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.optional.Optional.value.html @@ -0,0 +1,35 @@ + + + + Optional.value (handy_http_primitives.optional.Optional.value) + + + + + + + + + + +
+
+

Optional.value

The internal value of this optional.

struct Optional(T)
T value;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.optional.html b/docs/ddoc/primitives/handy_http_primitives.optional.html new file mode 100644 index 0000000..60a2835 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.optional.html @@ -0,0 +1,36 @@ + + + + handy_http_primitives.optional (handy_http_primitives.optional) + + + + + + + + + + +
+
+

handy_http_primitives.optional

Module that defines an Optional type, which is a simplified version of +Phobos' Nullable, that also supports mapping the underlying data.

Members

Functions

mapIfPresent
auto mapIfPresent(Optional!T opt)

Maps the value of a given optional to another type using a given function.

Structs

Optional
struct Optional(T)

A simple wrapper around a value to make it optionally present.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.optional.mapIfPresent.html b/docs/ddoc/primitives/handy_http_primitives.optional.mapIfPresent.html new file mode 100644 index 0000000..c7e8457 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.optional.mapIfPresent.html @@ -0,0 +1,36 @@ + + + + mapIfPresent (handy_http_primitives.optional.mapIfPresent) + + + + + + + + + + +
+
+

mapIfPresent

Maps the value of a given optional to another type using a given function.

mapIfPresent
(
alias fn
T
)

Parameters

opt Optional!T

The optional to map.

Return Value

Type: auto

An optional whose type is the return-type of the given fn +template argument function.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.request.HttpMethod.html b/docs/ddoc/primitives/handy_http_primitives.request.HttpMethod.html new file mode 100644 index 0000000..053b0f0 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.request.HttpMethod.html @@ -0,0 +1,35 @@ + + + + HttpMethod (handy_http_primitives.request.HttpMethod) + + + + + + + + + + +
+
+

HttpMethod

Enumeration of all possible HTTP methods, excluding extensions like WebDAV.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods

Values

ValueMeaning
GET"GET"
POST"POST"
PUT"PUT"
DELETE"DELETE"
CONNECT"CONNECT"
OPTIONS"OPTIONS"
TRACE"TRACE"
PATCH"PATCH"
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.request.HttpVersion.html b/docs/ddoc/primitives/handy_http_primitives.request.HttpVersion.html new file mode 100644 index 0000000..6b4d925 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.request.HttpVersion.html @@ -0,0 +1,35 @@ + + + + HttpVersion (handy_http_primitives.request.HttpVersion) + + + + + + + + + + +
+
+

HttpVersion

Enumeration of all possible HTTP request versions.

Values

ValueMeaning
V11 << 1

HTTP Version 1, including versions 0.9, 1.0, and 1.1.

V21 << 2

HTTP Version 2.

V31 << 3

HTTP Version 3.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.request.QueryParameter.html b/docs/ddoc/primitives/handy_http_primitives.request.QueryParameter.html new file mode 100644 index 0000000..7eef0c1 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.request.QueryParameter.html @@ -0,0 +1,35 @@ + + + + QueryParameter (handy_http_primitives.request.QueryParameter) + + + + + + + + + + +
+
+

QueryParameter

Stores a single query parameter's key and values.

struct QueryParameter {}

Members

Variables

key
string key;
Undocumented in source.
values
string[] values;
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.request.QueryParameter.key.html b/docs/ddoc/primitives/handy_http_primitives.request.QueryParameter.key.html new file mode 100644 index 0000000..b8d7aee --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.request.QueryParameter.key.html @@ -0,0 +1,35 @@ + + + + QueryParameter.key (handy_http_primitives.request.QueryParameter.key) + + + + + + + + + + +
+
+

QueryParameter.key

Undocumented in source.
struct QueryParameter
string key;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.request.QueryParameter.values.html b/docs/ddoc/primitives/handy_http_primitives.request.QueryParameter.values.html new file mode 100644 index 0000000..3282b77 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.request.QueryParameter.values.html @@ -0,0 +1,35 @@ + + + + QueryParameter.values (handy_http_primitives.request.QueryParameter.values) + + + + + + + + + + +
+
+

QueryParameter.values

Undocumented in source.
struct QueryParameter
string[] values;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.clientAddress.html b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.clientAddress.html new file mode 100644 index 0000000..3a86546 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.clientAddress.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequest.clientAddress (handy_http_primitives.request.ServerHttpRequest.clientAddress) + + + + + + + + + + +
+
+

ServerHttpRequest.clientAddress

The remote address of the client that sent this request.

struct ServerHttpRequest
const
ClientAddress clientAddress;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.contextData.html b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.contextData.html new file mode 100644 index 0000000..e5a4bac --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.contextData.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequest.contextData (handy_http_primitives.request.ServerHttpRequest.contextData) + + + + + + + + + + +
+
+

ServerHttpRequest.contextData

Any additional data about this request that may be populated during handling.

struct ServerHttpRequest
Object[string] contextData;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.getHeaderAs.html b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.getHeaderAs.html new file mode 100644 index 0000000..89e7cf6 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.getHeaderAs.html @@ -0,0 +1,37 @@ + + + + ServerHttpRequest.getHeaderAs (handy_http_primitives.request.ServerHttpRequest.getHeaderAs) + + + + + + + + + + +
+
+

ServerHttpRequest.getHeaderAs

Gets a header as the specified type, or returns the default value if the +header doesn't exist or cannot be converted to the desired type.

struct ServerHttpRequest
const
T
getHeaderAs
(
T
)
(
string headerName
,
T defaultValue = T.init
)

Parameters

headerName string

The name of the header to get, case-sensitive.

defaultValue T

The default value to return if the header doesn't exist + or is invalid.

Return Value

Type: T

The header value.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.getParamAs.html b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.getParamAs.html new file mode 100644 index 0000000..7ad9ad5 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.getParamAs.html @@ -0,0 +1,37 @@ + + + + ServerHttpRequest.getParamAs (handy_http_primitives.request.ServerHttpRequest.getParamAs) + + + + + + + + + + +
+
+

ServerHttpRequest.getParamAs

Gets a query parameter with a given name, as the specified type, or +returns the default value if the parameter doesn't exist.

struct ServerHttpRequest
const
T
getParamAs
(
T
)
(
string paramName
,
T defaultValue = T.init
)

Parameters

paramName string

The name of the parameter to get.

defaultValue T

The default value to return if the parameter doesn't + exist or is invalid.

Return Value

Type: T

The parameter value.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.headers.html b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.headers.html new file mode 100644 index 0000000..448bd4b --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.headers.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequest.headers (handy_http_primitives.request.ServerHttpRequest.headers) + + + + + + + + + + +
+
+

ServerHttpRequest.headers

A case-insensitive map of all request headers.

struct ServerHttpRequest
const(string[][string]) headers;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.html b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.html new file mode 100644 index 0000000..9f059e8 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.html @@ -0,0 +1,42 @@ + + + + ServerHttpRequest (handy_http_primitives.request.ServerHttpRequest) + + + + + + + + + + +
+
+

ServerHttpRequest

The HTTP request struct which represents the content of an HTTP request as +received by a server.

Members

Functions

getHeaderAs
T getHeaderAs(string headerName, T defaultValue)

Gets a header as the specified type, or returns the default value if the +header doesn't exist or cannot be converted to the desired type.

getParamAs
T getParamAs(string paramName, T defaultValue)

Gets a query parameter with a given name, as the specified type, or +returns the default value if the parameter doesn't exist.

readBody
StreamResult readBody(S outputStream, bool allowInfiniteRead)

Reads the body of this request and transfers it to the given output +stream, limited by the request's "Content-Length" unless you choose to +allow infinite reading. If the request includes a header for +"Transfer-Encoding: chunked", then it will wrap the input stream in one +which decodes HTTP chunked-encoding first.

readBodyAsBytes
ubyte[] readBodyAsBytes(bool allowInfiniteRead)

Reads the request's body into a new byte array.

readBodyAsString
string readBodyAsString(bool allowInfiniteRead)

Reads the request's body into a new string.

Variables

clientAddress
ClientAddress clientAddress;

The remote address of the client that sent this request.

contextData
Object[string] contextData;

Any additional data about this request that may be populated during handling.

headers
const(string[][string]) headers;

A case-insensitive map of all request headers.

httpVersion
HttpVersion httpVersion;

The HTTP version of the request.

inputStream
InputStream!ubyte inputStream;

The underlying stream used to read the body from the request.

method
string method;

The HTTP verb used in the request.

queryParams
QueryParameter[] queryParams;

A list of all URL query parameters.

url
string url;

The URL that was requested, excluding any query parameters.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.httpVersion.html b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.httpVersion.html new file mode 100644 index 0000000..0509622 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.httpVersion.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequest.httpVersion (handy_http_primitives.request.ServerHttpRequest.httpVersion) + + + + + + + + + + +
+
+

ServerHttpRequest.httpVersion

The HTTP version of the request.

struct ServerHttpRequest
const
HttpVersion httpVersion;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.inputStream.html b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.inputStream.html new file mode 100644 index 0000000..b7967cb --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.inputStream.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequest.inputStream (handy_http_primitives.request.ServerHttpRequest.inputStream) + + + + + + + + + + +
+
+

ServerHttpRequest.inputStream

The underlying stream used to read the body from the request.

struct ServerHttpRequest
InputStream!ubyte inputStream;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.method.html b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.method.html new file mode 100644 index 0000000..ff44201 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.method.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequest.method (handy_http_primitives.request.ServerHttpRequest.method) + + + + + + + + + + +
+
+

ServerHttpRequest.method

The HTTP verb used in the request.

struct ServerHttpRequest
const
string method;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.queryParams.html b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.queryParams.html new file mode 100644 index 0000000..70af334 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.queryParams.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequest.queryParams (handy_http_primitives.request.ServerHttpRequest.queryParams) + + + + + + + + + + +
+
+

ServerHttpRequest.queryParams

A list of all URL query parameters.

struct ServerHttpRequest
const
QueryParameter[] queryParams;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.readBody.html b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.readBody.html new file mode 100644 index 0000000..fda72c2 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.readBody.html @@ -0,0 +1,41 @@ + + + + ServerHttpRequest.readBody (handy_http_primitives.request.ServerHttpRequest.readBody) + + + + + + + + + + +
+
+

ServerHttpRequest.readBody

Reads the body of this request and transfers it to the given output +stream, limited by the request's "Content-Length" unless you choose to +allow infinite reading. If the request includes a header for +"Transfer-Encoding: chunked", then it will wrap the input stream in one +which decodes HTTP chunked-encoding first.

struct ServerHttpRequest
StreamResult
readBody
(
S
)
(,
bool allowInfiniteRead = false
)
if (
isByteOutputStream!S
)

Parameters

outputStream S

The output stream to transfer data to.

allowInfiniteRead bool

Whether to allow reading the request even if the + Content-Length header is missing or invalid. Use + with caution!

Return Value

Type: StreamResult

Either the number of bytes read, or a stream error.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.readBodyAsBytes.html b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.readBodyAsBytes.html new file mode 100644 index 0000000..8f54a98 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.readBodyAsBytes.html @@ -0,0 +1,36 @@ + + + + ServerHttpRequest.readBodyAsBytes (handy_http_primitives.request.ServerHttpRequest.readBodyAsBytes) + + + + + + + + + + +
+
+

ServerHttpRequest.readBodyAsBytes

Reads the request's body into a new byte array.

struct ServerHttpRequest
ubyte[]
readBodyAsBytes
(
bool allowInfiniteRead = false
)

Parameters

allowInfiniteRead bool

Whether to allow reading even without a valid + Content-Length header.

Return Value

Type: ubyte[]

The byte array.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.readBodyAsString.html b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.readBodyAsString.html new file mode 100644 index 0000000..24213ad --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.readBodyAsString.html @@ -0,0 +1,36 @@ + + + + ServerHttpRequest.readBodyAsString (handy_http_primitives.request.ServerHttpRequest.readBodyAsString) + + + + + + + + + + +
+
+

ServerHttpRequest.readBodyAsString

Reads the request's body into a new string.

struct ServerHttpRequest
string
readBodyAsString
(
bool allowInfiniteRead = false
)

Parameters

allowInfiniteRead bool

Whether to allow reading even without a valid + Content-Length header.

Return Value

Type: string

The string content.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.url.html b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.url.html new file mode 100644 index 0000000..45c0895 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.request.ServerHttpRequest.url.html @@ -0,0 +1,35 @@ + + + + ServerHttpRequest.url (handy_http_primitives.request.ServerHttpRequest.url) + + + + + + + + + + +
+
+

ServerHttpRequest.url

The URL that was requested, excluding any query parameters.

struct ServerHttpRequest
const
string url;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.request.html b/docs/ddoc/primitives/handy_http_primitives.request.html new file mode 100644 index 0000000..fd96770 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.request.html @@ -0,0 +1,37 @@ + + + + handy_http_primitives.request (handy_http_primitives.request) + + + + + + + + + + +
+
+

handy_http_primitives.request

Defines the request structure and associated types that are generally used +when dealing with a client's HTTP request.

Members

Enums

HttpMethod
enum HttpMethod

Enumeration of all possible HTTP methods, excluding extensions like WebDAV.

HttpVersion
enum HttpVersion

Enumeration of all possible HTTP request versions.

Functions

parseQueryParameters
QueryParameter[] parseQueryParameters(string url)

Parses a list of query parameters from a URL.

Structs

QueryParameter
struct QueryParameter

Stores a single query parameter's key and values.

ServerHttpRequest
struct ServerHttpRequest

The HTTP request struct which represents the content of an HTTP request as +received by a server.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.request.parseQueryParameters.html b/docs/ddoc/primitives/handy_http_primitives.request.parseQueryParameters.html new file mode 100644 index 0000000..8dd6c98 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.request.parseQueryParameters.html @@ -0,0 +1,35 @@ + + + + parseQueryParameters (handy_http_primitives.request.parseQueryParameters) + + + + + + + + + + +
+
+

parseQueryParameters

Parses a list of query parameters from a URL.

parseQueryParameters
(
string url
)

Parameters

url string

The URL to parse query parameters from.

Return Value

The list of query parameters.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.response.ContentTypes.html b/docs/ddoc/primitives/handy_http_primitives.response.ContentTypes.html new file mode 100644 index 0000000..c33ee12 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.response.ContentTypes.html @@ -0,0 +1,35 @@ + + + + ContentTypes (handy_http_primitives.response.ContentTypes) + + + + + + + + + + +
+
+

ContentTypes

Common "Content-Type" header values.

Values

ValueMeaning
APPLICATION_JSON"application/json"
APPLICATION_XML"application/xml"
APPLICATION_OCTET_STREAM"application/octet-stream"
APPLICATION_PDF"application/pdf"
TEXT_PLAIN"text/plain"
TEXT_HTML"text/html"
TEXT_CSS"text/css"
TEXT_CSV"text/csv"
TEXT_JAVASCRIPT"text/javascript"
TEXT_MARKDOWN"text/markdown"
IMAGE_JPEG"image/jpeg"
IMAGE_PNG"image/png"
IMAGE_SVG"image/svg+xml"
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.response.HttpStatus.html b/docs/ddoc/primitives/handy_http_primitives.response.HttpStatus.html new file mode 100644 index 0000000..940ceba --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.response.HttpStatus.html @@ -0,0 +1,36 @@ + + + + HttpStatus (handy_http_primitives.response.HttpStatus) + + + + + + + + + + +
+
+

HttpStatus

An enum defining all valid HTTP response statuses: +See here: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status

Values

ValueMeaning
CONTINUEStatusInfo(100, "Continue")
SWITCHING_PROTOCOLSStatusInfo(101, "Switching Protocols")
PROCESSINGStatusInfo(102, "Processing")
EARLY_HINTSStatusInfo(103, "Early Hints")
OKStatusInfo(200, "OK")
CREATEDStatusInfo(201, "Created")
ACCEPTEDStatusInfo(202, "Accepted")
NON_AUTHORITATIVE_INFORMATIONStatusInfo(203, "Non-Authoritative Information")
NO_CONTENTStatusInfo(204, "No Content")
RESET_CONTENTStatusInfo(205, "Reset Content")
PARTIAL_CONTENTStatusInfo(206, "Partial Content")
MULTI_STATUSStatusInfo(207, "Multi-Status")
ALREADY_REPORTEDStatusInfo(208, "Already Reported")
IM_USEDStatusInfo(226, "IM Used")
MULTIPLE_CHOICESStatusInfo(300, "Multiple Choices")
MOVED_PERMANENTLYStatusInfo(301, "Moved Permanently")
FOUNDStatusInfo(302, "Found")
SEE_OTHERStatusInfo(303, "See Other")
NOT_MODIFIEDStatusInfo(304, "Not Modified")
TEMPORARY_REDIRECTStatusInfo(307, "Temporary Redirect")
PERMANENT_REDIRECTStatusInfo(308, "Permanent Redirect")
BAD_REQUESTStatusInfo(400, "Bad Request")
UNAUTHORIZEDStatusInfo(401, "Unauthorized")
PAYMENT_REQUIREDStatusInfo(402, "Payment Required")
FORBIDDENStatusInfo(403, "Forbidden")
NOT_FOUNDStatusInfo(404, "Not Found")
METHOD_NOT_ALLOWEDStatusInfo(405, "Method Not Allowed")
NOT_ACCEPTABLEStatusInfo(406, "Not Acceptable")
PROXY_AUTHENTICATION_REQUIREDStatusInfo(407, "Proxy Authentication Required")
REQUEST_TIMEOUTStatusInfo(408, "Request Timeout")
CONFLICTStatusInfo(409, "Conflict")
GONEStatusInfo(410, "Gone")
LENGTH_REQUIREDStatusInfo(411, "Length Required")
PRECONDITION_FAILEDStatusInfo(412, "Precondition Failed")
PAYLOAD_TOO_LARGEStatusInfo(413, "Payload Too Large")
URI_TOO_LONGStatusInfo(414, "URI Too Long")
UNSUPPORTED_MEDIA_TYPEStatusInfo(415, "Unsupported Media Type")
RANGE_NOT_SATISFIABLEStatusInfo(416, "Range Not Satisfiable")
EXPECTATION_FAILEDStatusInfo(417, "Expectation Failed")
IM_A_TEAPOTStatusInfo(418, "I'm a teapot")
MISDIRECTED_REQUESTStatusInfo(421, "Misdirected Request")
UNPROCESSABLE_CONTENTStatusInfo(422, "Unprocessable Content")
LOCKEDStatusInfo(423, "Locked")
FAILED_DEPENDENCYStatusInfo(424, "Failed Dependency")
TOO_EARLYStatusInfo(425, "Too Early")
UPGRADE_REQUIREDStatusInfo(426, "Upgrade Required")
PRECONDITION_REQUIREDStatusInfo(428, "Precondition Required")
TOO_MANY_REQUESTSStatusInfo(429, "Too Many Requests")
REQUEST_HEADER_FIELDS_TOO_LARGEStatusInfo(431, "Request Header Fields Too Large")
INTERNAL_SERVER_ERRORStatusInfo(500, "Internal Server Error")
NOT_IMPLEMENTEDStatusInfo(501, "Not Implemented")
BAD_GATEWAYStatusInfo(502, "Bad Gateway")
SERVICE_UNAVAILABLEStatusInfo(503, "Service Unavailable")
GATEWAY_TIMEOUTStatusInfo(504, "Gateway Timeout")
HTTP_VERSION_NOT_SUPPORTEDStatusInfo(505, "HTTP Version Not Supported")
VARIANT_ALSO_NEGOTIATESStatusInfo(506, "Variant Also Negotiates")
INSUFFICIENT_STORAGEStatusInfo(507, "Insufficient Storage")
LOOP_DETECTEDStatusInfo(508, "Loop Detected")
NOT_EXTENDEDStatusInfo(510, "Not Extended")
NETWORK_AUTHENTICATION_REQUIREDStatusInfo(511, "Network Authentication Required")
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.html b/docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.html new file mode 100644 index 0000000..1273762 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.html @@ -0,0 +1,37 @@ + + + + HttpStatusException (handy_http_primitives.response.HttpStatusException) + + + + + + + + + + +
+
+

HttpStatusException

An exception that can be thrown while handling an HTTP request, to indicate +that the server should return a specified response code, usually when you +want to short-circuit due to an error.

Constructors

this
this(StatusInfo status, string message, Throwable next)
Undocumented in source.
this
this(StatusInfo status, string message)
Undocumented in source.
this
this(StatusInfo status)
Undocumented in source.

Members

Variables

status
StatusInfo status;
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.status.html b/docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.status.html new file mode 100644 index 0000000..521f639 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.status.html @@ -0,0 +1,35 @@ + + + + HttpStatusException.status (handy_http_primitives.response.HttpStatusException.status) + + + + + + + + + + +
+
+

HttpStatusException.status

Undocumented in source.
class HttpStatusException
const
StatusInfo status;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.this.1.html b/docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.this.1.html new file mode 100644 index 0000000..bd9b561 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.this.1.html @@ -0,0 +1,35 @@ + + + + HttpStatusException.this (handy_http_primitives.response.HttpStatusException.this) + + + + + + + + + + +
+
+

HttpStatusException.this

Undocumented in source.
  1. this(StatusInfo status, string message, Throwable next)
    class HttpStatusException
    this
    (,
    string message
    ,
    Throwable next
    )
  2. this(StatusInfo status, string message)
  3. this(StatusInfo status)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.this.2.html b/docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.this.2.html new file mode 100644 index 0000000..c7c16f2 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.this.2.html @@ -0,0 +1,35 @@ + + + + HttpStatusException.this (handy_http_primitives.response.HttpStatusException.this) + + + + + + + + + + +
+
+

HttpStatusException.this

Undocumented in source.
  1. this(StatusInfo status, string message, Throwable next)
  2. this(StatusInfo status, string message)
    class HttpStatusException
  3. this(StatusInfo status)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.this.3.html b/docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.this.3.html new file mode 100644 index 0000000..12eb742 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.this.3.html @@ -0,0 +1,35 @@ + + + + HttpStatusException.this (handy_http_primitives.response.HttpStatusException.this) + + + + + + + + + + +
+
+

HttpStatusException.this

Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.this.html b/docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.this.html new file mode 100644 index 0000000..df6bffa --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.response.HttpStatusException.this.html @@ -0,0 +1 @@ + Continue to overload \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.headers.html b/docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.headers.html new file mode 100644 index 0000000..65256d4 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.headers.html @@ -0,0 +1,35 @@ + + + + ServerHttpResponse.headers (handy_http_primitives.response.ServerHttpResponse.headers) + + + + + + + + + + +
+
+

ServerHttpResponse.headers

A multi-valued map containing all headers.

struct ServerHttpResponse
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.html b/docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.html new file mode 100644 index 0000000..482bcf0 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.html @@ -0,0 +1,36 @@ + + + + ServerHttpResponse (handy_http_primitives.response.ServerHttpResponse) + + + + + + + + + + +
+
+

ServerHttpResponse

The response that's sent by a server back to a client after processing the +client's HTTP request.

Members

Functions

writeBodyBytes
void writeBodyBytes(ubyte[] bytes, string contentType)

Writes an array of bytes to the response's output stream.

writeBodyString
void writeBodyString(string content, string contentType)

Writes a string of content to the response's output stream.

Variables

headers
StringMultiValueMap headers;

A multi-valued map containing all headers.

outputStream
OutputStream!ubyte outputStream;

The stream to which the response body is written.

status
StatusInfo status;

The response status.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.outputStream.html b/docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.outputStream.html new file mode 100644 index 0000000..e1c7d8f --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.outputStream.html @@ -0,0 +1,35 @@ + + + + ServerHttpResponse.outputStream (handy_http_primitives.response.ServerHttpResponse.outputStream) + + + + + + + + + + +
+
+

ServerHttpResponse.outputStream

The stream to which the response body is written.

struct ServerHttpResponse
OutputStream!ubyte outputStream;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.status.html b/docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.status.html new file mode 100644 index 0000000..ebaf456 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.status.html @@ -0,0 +1,35 @@ + + + + ServerHttpResponse.status (handy_http_primitives.response.ServerHttpResponse.status) + + + + + + + + + + +
+
+

ServerHttpResponse.status

The response status.

struct ServerHttpResponse
StatusInfo status;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.writeBodyBytes.html b/docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.writeBodyBytes.html new file mode 100644 index 0000000..b8f2edb --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.writeBodyBytes.html @@ -0,0 +1,36 @@ + + + + ServerHttpResponse.writeBodyBytes (handy_http_primitives.response.ServerHttpResponse.writeBodyBytes) + + + + + + + + + + +
+
+

ServerHttpResponse.writeBodyBytes

Writes an array of bytes to the response's output stream.

struct ServerHttpResponse
void
writeBodyBytes

Parameters

bytes ubyte[]

The bytes to write.

contentType string

The declared content type of the data, which is written + as the "Content-Type" header.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.writeBodyString.html b/docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.writeBodyString.html new file mode 100644 index 0000000..325eac0 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.response.ServerHttpResponse.writeBodyString.html @@ -0,0 +1,36 @@ + + + + ServerHttpResponse.writeBodyString (handy_http_primitives.response.ServerHttpResponse.writeBodyString) + + + + + + + + + + +
+
+

ServerHttpResponse.writeBodyString

Writes a string of content to the response's output stream.

struct ServerHttpResponse
void
writeBodyString

Parameters

content string

The content to write.

contentType string

The declared content type of the data, which is written + as the "Content-Type" header.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.response.StatusInfo.code.html b/docs/ddoc/primitives/handy_http_primitives.response.StatusInfo.code.html new file mode 100644 index 0000000..fc05e10 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.response.StatusInfo.code.html @@ -0,0 +1,35 @@ + + + + StatusInfo.code (handy_http_primitives.response.StatusInfo.code) + + + + + + + + + + +
+
+

StatusInfo.code

Undocumented in source.
struct StatusInfo
ushort code;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.response.StatusInfo.html b/docs/ddoc/primitives/handy_http_primitives.response.StatusInfo.html new file mode 100644 index 0000000..87246ab --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.response.StatusInfo.html @@ -0,0 +1,35 @@ + + + + StatusInfo (handy_http_primitives.response.StatusInfo) + + + + + + + + + + +
+
+

StatusInfo

A struct containing basic information about a response status.

struct StatusInfo {}

Members

Variables

code
ushort code;
Undocumented in source.
text
string text;
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.response.StatusInfo.text.html b/docs/ddoc/primitives/handy_http_primitives.response.StatusInfo.text.html new file mode 100644 index 0000000..7da1afe --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.response.StatusInfo.text.html @@ -0,0 +1,35 @@ + + + + StatusInfo.text (handy_http_primitives.response.StatusInfo.text) + + + + + + + + + + +
+
+

StatusInfo.text

Undocumented in source.
struct StatusInfo
string text;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.response.html b/docs/ddoc/primitives/handy_http_primitives.response.html new file mode 100644 index 0000000..9a3a30a --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.response.html @@ -0,0 +1,40 @@ + + + + handy_http_primitives.response (handy_http_primitives.response) + + + + + + + + + + +
+
+

handy_http_primitives.response

Defines the HTTP response structure and associated types that are generally +used when formulating a response to a client's request.

Members

Classes

HttpStatusException
class HttpStatusException

An exception that can be thrown while handling an HTTP request, to indicate +that the server should return a specified response code, usually when you +want to short-circuit due to an error.

Enums

ContentTypes
enum ContentTypes

Common "Content-Type" header values.

HttpStatus
enum HttpStatus

An enum defining all valid HTTP response statuses: +See here: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status

Structs

ServerHttpResponse
struct ServerHttpResponse

The response that's sent by a server back to a client after processing the +client's HTTP request.

StatusInfo
struct StatusInfo

A struct containing basic information about a response status.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.testing.assertHasHeader.html b/docs/ddoc/primitives/handy_http_primitives.testing.assertHasHeader.html new file mode 100644 index 0000000..b9f9719 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.testing.assertHasHeader.html @@ -0,0 +1,35 @@ + + + + assertHasHeader (handy_http_primitives.testing.assertHasHeader) + + + + + + + + + + +
+
+

assertHasHeader

Asserts that the given response has a header with a given value.

void
assertHasHeader

Parameters

response ServerHttpResponse

The response to check.

header string

The name of the header to check the value of.

expectedValue string

The expected value of the header.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.testing.assertStatus.html b/docs/ddoc/primitives/handy_http_primitives.testing.assertStatus.html new file mode 100644 index 0000000..6965753 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.testing.assertStatus.html @@ -0,0 +1,35 @@ + + + + assertStatus (handy_http_primitives.testing.assertStatus) + + + + + + + + + + +
+
+

assertStatus

Asserts that the given response's status matches an expected status.

Parameters

response ServerHttpResponse

The response to check.

expectedStatus StatusInfo

The expected status that the response should have.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.testing.assertStatusBadRequest.html b/docs/ddoc/primitives/handy_http_primitives.testing.assertStatusBadRequest.html new file mode 100644 index 0000000..bed88e0 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.testing.assertStatusBadRequest.html @@ -0,0 +1,35 @@ + + + + assertStatusBadRequest (handy_http_primitives.testing.assertStatusBadRequest) + + + + + + + + + + +
+
+

assertStatusBadRequest

Undocumented in source. Be warned that the author may not have intended to support it.
void
assertStatusBadRequest
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.testing.assertStatusForbidden.html b/docs/ddoc/primitives/handy_http_primitives.testing.assertStatusForbidden.html new file mode 100644 index 0000000..d1a9ec9 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.testing.assertStatusForbidden.html @@ -0,0 +1,35 @@ + + + + assertStatusForbidden (handy_http_primitives.testing.assertStatusForbidden) + + + + + + + + + + +
+
+

assertStatusForbidden

Undocumented in source. Be warned that the author may not have intended to support it.
void
assertStatusForbidden
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.testing.assertStatusInternalServerError.html b/docs/ddoc/primitives/handy_http_primitives.testing.assertStatusInternalServerError.html new file mode 100644 index 0000000..393178b --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.testing.assertStatusInternalServerError.html @@ -0,0 +1,35 @@ + + + + assertStatusInternalServerError (handy_http_primitives.testing.assertStatusInternalServerError) + + + + + + + + + + +
+
+

assertStatusInternalServerError

Undocumented in source. Be warned that the author may not have intended to support it.
void
assertStatusInternalServerError
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.testing.assertStatusNotFound.html b/docs/ddoc/primitives/handy_http_primitives.testing.assertStatusNotFound.html new file mode 100644 index 0000000..e3528ac --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.testing.assertStatusNotFound.html @@ -0,0 +1,35 @@ + + + + assertStatusNotFound (handy_http_primitives.testing.assertStatusNotFound) + + + + + + + + + + +
+
+

assertStatusNotFound

Undocumented in source. Be warned that the author may not have intended to support it.
void
assertStatusNotFound
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.testing.assertStatusOk.html b/docs/ddoc/primitives/handy_http_primitives.testing.assertStatusOk.html new file mode 100644 index 0000000..a50b8bc --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.testing.assertStatusOk.html @@ -0,0 +1,35 @@ + + + + assertStatusOk (handy_http_primitives.testing.assertStatusOk) + + + + + + + + + + +
+
+

assertStatusOk

Undocumented in source. Be warned that the author may not have intended to support it.
void
assertStatusOk
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.testing.assertStatusUnauthorized.html b/docs/ddoc/primitives/handy_http_primitives.testing.assertStatusUnauthorized.html new file mode 100644 index 0000000..ae8bc73 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.testing.assertStatusUnauthorized.html @@ -0,0 +1,35 @@ + + + + assertStatusUnauthorized (handy_http_primitives.testing.assertStatusUnauthorized) + + + + + + + + + + +
+
+

assertStatusUnauthorized

Undocumented in source. Be warned that the author may not have intended to support it.
void
assertStatusUnauthorized
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/handy_http_primitives.testing.html b/docs/ddoc/primitives/handy_http_primitives.testing.html new file mode 100644 index 0000000..a5f0da1 --- /dev/null +++ b/docs/ddoc/primitives/handy_http_primitives.testing.html @@ -0,0 +1,36 @@ + + + + handy_http_primitives.testing (handy_http_primitives.testing) + + + + + + + + + + +
+
+

handy_http_primitives.testing

The testing module defines helper methods for testing your HTTP handling +code.

Members

Functions

assertHasHeader
void assertHasHeader(ServerHttpResponse response, string header, string expectedValue)

Asserts that the given response has a header with a given value.

assertStatus
void assertStatus(ServerHttpResponse response, StatusInfo expectedStatus)

Asserts that the given response's status matches an expected status.

assertStatusBadRequest
void assertStatusBadRequest(ServerHttpResponse response)
Undocumented in source. Be warned that the author may not have intended to support it.
assertStatusForbidden
void assertStatusForbidden(ServerHttpResponse response)
Undocumented in source. Be warned that the author may not have intended to support it.
assertStatusInternalServerError
void assertStatusInternalServerError(ServerHttpResponse response)
Undocumented in source. Be warned that the author may not have intended to support it.
assertStatusNotFound
void assertStatusNotFound(ServerHttpResponse response)
Undocumented in source. Be warned that the author may not have intended to support it.
assertStatusOk
void assertStatusOk(ServerHttpResponse response)
Undocumented in source. Be warned that the author may not have intended to support it.
assertStatusUnauthorized
void assertStatusUnauthorized(ServerHttpResponse response)
Undocumented in source. Be warned that the author may not have intended to support it.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/index.html b/docs/ddoc/primitives/index.html new file mode 100644 index 0000000..c64afe2 --- /dev/null +++ b/docs/ddoc/primitives/index.html @@ -0,0 +1,37 @@ + + + + index (index) + + + + + + + + + + +
+
+

index

Modules

handy_http_primitives
module handy_http_primitives

The handy_http_primitives module defines a set of primitive types and +interfaces that are shared among all Handy-Http libraries, and form the +basis of how requests are handled.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/primitives/script.js b/docs/ddoc/primitives/script.js new file mode 100644 index 0000000..b47257e --- /dev/null +++ b/docs/ddoc/primitives/script.js @@ -0,0 +1,180 @@ +window.addEventListener("load", function() { + + var lineWrappers = document.querySelectorAll(".with-line-wrappers"); + for(var i = 0; i < lineWrappers.length; i++) { + var l = lineWrappers[i]; + + var codeblock = document.createElement("div"); + codeblock.className = "codeblock"; + l.parentNode.insertBefore(codeblock, l); + + var header = document.createElement("header"); + codeblock.appendChild(header); + codeblock.appendChild(l); + + var btn = document.createElement("button"); + btn.setAttribute("type", "button"); + var canCopyToClipboard = document.queryCommandSupported("copy"); + btn.addEventListener("click", (function(l) { return function() { + document.body.classList.add("hide-line-numbers"); + window.getSelection().selectAllChildren(l); + if(canCopyToClipboard) + if(!document.execCommand("copy")) { + alert("copy failed, try ctrl+c manually"); + } + };})(l)); + btn.textContent = canCopyToClipboard ? "Copy to Clipboard" : "Select All"; + header.appendChild(btn); + + var btn = document.createElement("button"); + btn.setAttribute("type", "button"); + btn.addEventListener("click", function() { + document.body.classList.toggle("hide-line-numbers"); + }); + btn.textContent = "Toggle Line Numbers"; + header.appendChild(btn); + } + + /* // still sucks in firefox! + document.addEventListener("copy", function(event) { + document.body.classList.add("hide-line-numbers"); + }); + */ + + document.body.addEventListener("mouseover", function(event) { + if(event.target.hasAttribute("data-ident")) { + var all = document.querySelectorAll("[data-ident=\""+event.target.getAttribute("data-ident")+"\"]"); + for(var i = 0; i < all.length; i++) + all[i].className += " active"; + } + }); + document.body.addEventListener("mouseout", function(event) { + if(event.target.hasAttribute("data-ident")) { + var all = document.querySelectorAll("[data-ident=\""+event.target.getAttribute("data-ident")+"\"]"); + for(var i = 0; i < all.length; i++) + all[i].className = all[i].className.replace(" active", ""); + } + }); + /* + document.body.addEventListener("dblclick", function(event) { + if(event.target.hasAttribute("data-ident")) { + location.href = "/" + event.target.getAttribute("data-ident"); + } + }); + */ + + var sn = document.getElementById("source-navigation"); + if(sn) { + sn.addEventListener("click", function(event) { + if(event.target.tagName != "A" || event.target.className == "docs") + return true; + if(event.target.nextSibling) { + var s = event.target.nextSibling; + if(s.style.display == "" || s.style.display == "none" || s.className.indexOf("search-hit") != -1) { + s.style.display = "block"; + var items = s.getElementsByTagName("ul"); + var i; + for(i = 0; i < items.length; i++) + items[i].style.display = ""; + items = s.getElementsByTagName("li"); + for(i = 0; i < items.length; i++) + items[i].style.display = ""; + } else + s.style.display = ""; + } + + //var id = event.target.href.substring(event.target.href.indexOf("#") + 1); + //sn.style.marginTop = (document.getElementById(id).offsetTop - event.target.offsetTop + 16) + "px"; + }); + + var search = document.createElement("input"); + search.setAttribute("type", "search"); + function searchHelper() { + var regex = new RegExp(search.value, "i"); + var items = document.querySelectorAll("#source-navigation a[href^=\"#\"]"); + var stxt = search.value; + for(var i = 0; i < items.length; i++) { + var a = items[i]; + if(stxt.length && regex.test(a.textContent)) { + var p = a.parentNode; + while(p.tagName != "DIV") { + if(p.tagName == "LI") + p.style.display = "list-item"; + else + p.style.display = "block"; + p.className += " search-hit"; + p = p.parentNode; + } + } else { + var p = a.parentNode; + if(stxt.length == 0) { + p.style.display = ""; + while(p.tagName != "DIV") { + p.style.display = ""; + p = p.parentNode; + } + } else + p.style.display = "none"; + p.className = p.className.replace(" search-hit", ""); + } + } + } + search.addEventListener("keyup", searchHelper); + sn.insertBefore(search, sn.firstChild); + } + + /* + function updateDynamicStyle() { + var thing = document.getElementById("page-content"); + var newStyle = document.getElementById("dynamic-style"); + if(!newStyle) { + newStyle = document.createElement("style"); + newStyle.setAttribute("id", "dynamic-style"); + newStyle.type = "text/css"; + document.head.appendChild(newStyle); + } + + var maxContentWidth = window.innerWidth; + // 800 is the threshold for putting nav vertically + if(maxContentWidth < 800) + maxContentWidth = 800; + else + maxContentWidth = + document.body.offsetWidth - + document.getElementById("page-nav").offsetWidth - + document.getElementById("page-nav").offsetLeft - + 64; + + // sanity check lol + if(maxContentWidth < 800) + maxContentWidth = 800; + + newStyle.innerHTML = ".member-list:not(.constructors) dt .simplified-prototype:hover { width: " + (thing.offsetWidth - 32) + "px; } #page-content pre.d_code, #page-content .overload-option, #page-content .member-list dt { max-width: " + (maxContentWidth) + "px; }"; + } + + updateDynamicStyle(); + + window.onresize = updateDynamicStyle; + */ + + // Disable line numbers in IE because the copy/paste with them sucks - it includes all line numbers + // in the middle making it too hard to use. Copy/paste is more important than line displays. + if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) { + var items = document.querySelectorAll(".with-line-wrappers"); + for(var a = 0; a < items.length; a++) + items[a].className = items[a].className.replace("with-line-wrappers", ""); + } + + // Keybind to focus search bar on '?' keydown. + document.addEventListener("keydown", (event) => { + if (event.key == "?") { + var searchBox = document.getElementsByName("searchTerm")[0]; + // Hack so the '?' doesn't auto-populate in the search bar. + this.setTimeout(() => { + searchBox.focus(); + }, 100); + } + }); + + +}); diff --git a/docs/ddoc/primitives/search-docs.html b/docs/ddoc/primitives/search-docs.html new file mode 100644 index 0000000..522aab4 --- /dev/null +++ b/docs/ddoc/primitives/search-docs.html @@ -0,0 +1,26 @@ + + + + + + + + diff --git a/docs/ddoc/primitives/search-docs.js b/docs/ddoc/primitives/search-docs.js new file mode 100644 index 0000000..768a988 --- /dev/null +++ b/docs/ddoc/primitives/search-docs.js @@ -0,0 +1,421 @@ +/* + This is the source for offline web search; it will be embedded + in a generated search page along with the search index xml. + + You will almost certainly want to gzip this when delivering it! + Also be sure it has the proper cache headers to give a remotely + acceptable performance result. Configure the web server to do + both these. When storing it for offline usage, you might just + leave it unzipped though for convenience of use without a web server. + + Tip to the end user: you might want to open this page and keep it + open in a reused tab. + + The file generated should be the skeleton.html with the search + index in a + + + + + + +
+
+
+ +
+ + + + + diff --git a/docs/ddoc/primitives/style.css b/docs/ddoc/primitives/style.css new file mode 100644 index 0000000..e6754c4 --- /dev/null +++ b/docs/ddoc/primitives/style.css @@ -0,0 +1,1661 @@ +/* a few things you can change to pick a basic color scheme */ + +/* + FIXME: have some automatic magic for choosing light vs dark and picking an accent color. + + Ideally, we'll get to the point where you can just say: + project name + project logo + project links + + light/dark scheme + project color + + and it will adapt the rest to a good-enough state automatically. +*/ + +#page-header, +#suggestion-box { + background-color: rgb(49, 57, 176); + background-color: rgb(49, 110, 47); + background-color: rgb(176, 57, 49); +} + +#page-header, +#suggestion-box, +#page-footer, +#page-nav { + border-color: rgb(41, 48, 148); + border-color: rgb(41, 110, 48); + border-color: rgb(148, 48, 41); + border-color: rgb(204, 204, 204); +} + +#page-nav { + background-color: rgb(245, 245, 255); + background-color: rgb(245, 250, 245); + background-color: rgb(245, 245, 245); + +} + +a:link { + color: #0000ff; + color: #bb0000; +} + +a:visited { + color: #004488; + color: #bb0044; +} + + +body { + font-family: "Roboto Slab", sans-serif; + tab-size: 4; +} + +h1, #page-nav a, .quickindex a.xref, .breadcrumb, dt > a { + font-family: Consolas, "Bitstream Vera Sans Mono", "Andale Mono", Monaco, "DejaVu Sans Mono", "Lucida Console", monospace; +} + + +/* done with basic colors */ + +html { + font-size: 100%; +} + +h1 { + font-size: 2.2rem; +} + +h2 { + font-size: 1.6rem; + margin-top: 1.5em; + font-family: "Roboto Slab", sans-serif; + font-weight: normal; +} + +h3 { + font-size: 1.26rem; +} + +body { + /*font-family: sans-serif;*/ + color: #111; + background-color: white; +} + +.big-o { + white-space: nowrap; +} + +.member-list .dt, +.overload-option, +pre { + box-sizing: border-box; + overflow: auto; + max-width: 800px; /* The script sets the real one */ + max-width: calc(80vw - 16em - 4em); +} + + +#page-header { + height: 32px; + line-height: 32px; + margin-bottom: 6px; + border-bottom-width: 1px; + border-bottom-style: solid; + color: white; + margin: -0.5em; + padding: 0em 0.5em; + margin-bottom: 0.0em; + overflow: hidden; +} + +#page-header span { + vertical-align: top; +} + +#page-header #logotype { + float: left; +} + +#page-header #search { + float: right; +} + +#page-header nav { + display: inline-block; + margin-left: 2em; + vertical-align: top; +} + +#page-header nav a { + display: inline-block; + color: white; + font-weight: bold; + margin-right: 2em; +} + +#page-body { + clear: both; + margin: 0px auto; + max-width: 1200px; + min-height: 800px; + min-height: calc(100vh - 3em - 32px); + display: flex; + box-sizing: border-box; +} + +#page-body #page-nav { + flex: 0 0 16em; + width: 16em; + min-width: 16em; + max-width: 16em; + order: 1; + padding-top: 0.25em; + padding-left: 1em; + padding-right: 0px; + min-height: 800px; + min-height: calc(100vh - 3em - 32px); + + border-right-style: solid; + border-right-width: 1px; + border-left-style: solid; + border-left-width: 1px; + box-sizing: border-box; +} + +#page-body #page-content { + flex: 1 1 auto; + order: 2; + padding: 0.25em; + padding-left: 1.75em; + box-sizing: border-box; + max-width: 960px; +} + +@media all and (max-width: 800px) { + #page-body { + display: block; + min-height: 0px; + } + + #page-body #page-nav { + display: block; + width: auto; + max-width: 800px; + border-top-style: solid; + border-top-width: 1px; + border-right: none; + min-height: 0px; + } + + #page-body #page-content { + padding-left: 0.25em; + } + + .member-list .dt, + .overload-option, + pre { + box-sizing: border-box; + overflow: auto; + max-width: 800px; /* The script sets the real one */ + max-width: calc(100vw - 2em); + } + + #page-header { + line-height: 20px; + height: auto; + min-height: 32px; + overflow: visible; + } + #page-header::after { + content: ' '; + display: block; + clear: both; + } +} + +#page-footer { + margin-top: 0em; + padding-top: 2em; + color: #999; + font-size: 0.9rem; + text-align: center; + border-top-style: solid; + border-top-width: 1px; +} + +a:link { + text-decoration: none; +} + +a:link:hover { + text-decoration: underline !important; /* important so it overrides even id level things on non-hover */ +} + +/* +pre.d_code { background-color: #fdf6e3; color: #002b36; padding: 0.25em; border: solid 1px #ccc; } +.d_code .kwrd { color: #b58900; font-weight: bold; } +.d_code .com { color: #666; font-style: italic; } +.d_code .num { color: #dc322f; font-weight: normal; } +.d_code .str { color: #2aa198; font-style: italic; } +.d_code .op { color: #586e75; font-weight: bold; } +.d_code .type { color: #268bd2; font-weight: bold; } +.d_code .cons { color: #859900; font-weight: bold; } + +.highlighted .kwrd { color: #b58900; font-weight: bold; } +.highlighted .com { color: #666; font-style: italic; } /* #93a1a1; * / +.highlighted .num { color: #dc322f; font-weight: normal; } +.highlighted .str { color: #2aa198; font-style: italic; } +.highlighted .op { color: #586e75; font-weight: bold; } +.highlighted .type { color: #268bd2; font-weight: bold; } +.highlighted .cons { color: #859900; font-weight: bold; } +*/ + +/* .member-list p, */ +#table-of-contents, +.enum-members, +.documentation-comment .tip, +.documentation-comment .note, +.documentation-comment .warning, +.documentation-comment .pitfall, +.documentation-comment li, +.documentation-comment p { + /* white-space: pre-line; */ + /* max-width: 74ch; */ + /*font-size: 1.1rem;*/ + font-size: 1.0rem; + line-height: 1.5; +} + +/* +.parameter-item::after { + content: ','; +} + +.parameter-item:last-child::after { + content: ''; +} +*/ + +.aggregate-declaration { + margin: 1em; +} + +.aggregate-member { + padding-left: 2em; +} + +/* +.aggregate-member::after { + content: ";"; +} +*/ + +.aggregate-member > a { + color: inherit; +} + +.template-constraint-expression, +.parameter-item { + padding-left: 2em; +} + + +/* +ol.overloads { + margin-bottom: -1px; + white-space: nowrap; +} + +ol.overloads::before { + content: "Overloads: "; +} + +ol.overloads li { + display: inline-block; + border: solid 1px #ccc; + list-style-position: inside; + text-align: center; + width: 5em; +} + +ol.overloads li.overload-option { + background-color: #eee; +} + +ol.overloads li a { + display: block; +} + +ol.overloads li.active-overload-option { + border-bottom: solid 1px white; +} + +ol.overloads + .aggregate-prototype, +ol.overloads + .function-prototype { + margin-top: 0px; +} +*/ + +.aggregate-prototype #help-link, +.function-prototype #help-link { + border-radius: 100%; + position: absolute; + top: -0.5em; + right: -0.5em; + display: block; + border: solid 1px #ccc; + background-color: white; + width: 1em; + height: 1em; + text-align: center; + font-size: 1.1rem; + padding-bottom: 3px; +} + +.aggregate-prototype #help-link:hover, +.function-prototype #help-link:hover { + text-decoration: none; + background-color: #ccc; +} + +.function-prototype .attributes { + color: #666; +} + +.declaration-prototype, +.aggregate-prototype, +.function-prototype { + border: solid 1px #ccc; + padding: 2em; + margin: 1em; + font-family: monospace; + position: relative; +} + +.declaration-prototype { + padding: 3em 2em; +} + +.parameters-list:empty { + display: none; +} + +/* +.parameters-list .parameters-list { + display: inline; +} +*/ + +.toplevel.parameters-list { + display: table; +} + +.toplevel.parameters-list > .parameter-item { + display: table-row; +} + +.toplevel.parameters-list > .parameter-item > *:first-child { + padding-left: 2em !important; +} + +.toplevel.parameters-list > .parameter-item + .comma { + display: none; +} + +.toplevel.parameters-list > .parameter-item > *:last-child::after { + content: ","; +} +.toplevel.parameters-list > .parameter-item:last-of-type > *:last-child::after { + content: ""; +} + +.parameter-attribute { + padding-left: 1em; +} + +.toplevel.parameters-list > .parameter-item .parameter-type-holder, +.toplevel.parameters-list > .parameter-item .parameter-name, +.toplevel.parameters-list > .parameter-item .parameter-default-value { + display: table-cell; + padding: 0px 0.25em; +} + +.toplevel.parameters-list > .parameter-item:hover { + background-color: #f8f8f8; +} + +.parameter-descriptions .parameter-name { + margin-right: 1.5rem; + font-weight: bold; + padding: 0.25ex 0.75ex; +} + +.parameter-descriptions dd { + margin-left: 1.5em; +} + +.parameter-descriptions dd p:first-child { + margin-top: 0.5em; +} + +.parameter-descriptions dt:not(:first-child) { + margin-top: 1.5em; +} + +.codeblock { + border: solid 1px #ccc; + padding: 0; + margin: 0; +} + +.codeblock header { + background-color: #e8e8e8; + padding: 0; + display: flex; + justify-content: flex-end; +} + +.codeblock header:before { + display: inline-block; + content: "Example"; + justify-content: flex-start; + flex-grow: 1; + padding: 0.25em 1em; + font-weight: bold; +} + +.codeblock header button { +/* TODO: add :before class with icons here (copy, line numbers) */ + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + margin: 0; + padding: 0 1em; + background-color: transparent; + border: none; + border-left: 1px solid #ccc; + cursor: pointer; +} + +.codeblock header button:hover { + background-color: rgba(255, 255, 255, 0.5); +} + +.codeblock header + pre { + border: none; + border-top: solid 1px #ccc; + margin: 0; + padding: 1em 0; + max-width: unset !important;; +} + +.hide-line-numbers .codeblock .with-line-wrappers, +.codeblock pre.d_code:not(.with-line-wrappers) { + padding: 1em; +} + +.codeblock .with-line-wrappers .br { + margin-right: 1em; +} + +.documentation-comment p { + hyphens: auto; +} + +.declaration-prototype, .aggregate-prototype, .function-prototype { + margin-left: 0; + margin-right: 0; +} + + + +tt.D, .inline-code { + color: black; + font-weight: 500; + background-color: #f2f2f2; + padding: 0px 0.5ex; + border-radius: 2px; +} + + +/* +.toplevel.parameters-list > .parameter-item > .parameter-type-holder { + text-align: right; +} + +.toplevel.parameters-list > .parameter-item > .parameter-type-holder > .parameter-type { + text-align: left; + display: inline-block; +} +*/ + +.function-prototype .return-type, .function-prototype .function-name { + display: inline; +} + +.function-name::before { + content: ' '; +} + +.function-name { + /*color: #008888;*/ +} + +.template-parameters[data-count="0"], +.template-parameters[data-count="0"] ~ .runtime-parameters[data-count="0"], +.template-parameters[data-count="0"] ~ .runtime-parameters[data-count="0"] > .parameters-list { + display: inline; +} + +.parameters-list:empty { + display: inline; +} + +.type-constructor, +.builtin-type { + text-decoration: none; + color: #004400 !important; + /*color: green !important; + font-weight: bold;*/ +} + +.kwrd, +.highlighted-keyword, +.lang-feature, +.storage-class { + text-decoration: none; + color: #026 !important; +} + +[data-ident].active { + outline: solid 1px red; +} + +table.enum-members { + border-collapse: collapse; + border: solid 1px #ccc; + min-width: 60%; +} + +.enum-members th, +.enum-members td { + border: solid 1px #ccc; + margin: 0px; + padding: 0.25em 0.5em; +} + +.enum-members th { + text-align: left; + color: #888; +} + +.enum-members td { + vertical-align: top; +} + +.enum-members td p:first-child { + margin-top: 0px; +} + +.enum-members .enum-member-name { + font-weight: bold; + color: inherit; +} + +.enum-members .enum-member-value { + display: block; + color: #666; +} + +.enum-members .enum-disabled { + font-style: italic; +} + +.enum-members .enum-deprecated { + margin-bottom: 1em; +} + +.enum-members .enum-deprecated > span.deprecated-label { + color: red; +} + +.enum-members .enum-attributes { + margin-top: 1em; +} + +.enum-member .enum-attributes:empty { + display: none; +} + +.enum-members tr.enum-member > td:nth-child(2) > div:only-child:empty:before { + display: inline; + content: "undocumented"; + color: rgba(0, 0, 0, 0.4); + font-style: italic; +} + +*:target { + background: #ffffbb; +} + +.breadcrumbs { + margin: 1em; +} + +.breadcrumbs a::before { + content: ' \00bb\a0'; +} + +.parameter-name { + font-weight: bold; +} + +.symbol-reference, +.return-type, +.parameter-type { + font-family: monospace; +} + +.phobos-booktable { + border-collapse: collapse; + margin-bottom: 1.5em; +} + +.phobos-booktable tt.D { + font-weight: bold; + background-color: transparent; +} + +.phobos-booktable caption { + text-align: left; +} + +.phobos-booktable tr { + border-bottom: solid 1px #ccc; +} + +.phobos-booktable tr:hover { + background-color: #fafafa; +} + +.phobos-booktable { + border-top: solid 2px black; + border-bottom: solid 2px black; +} + +.phobos-booktable tr:first-child:has(th) { + border-bottom: solid 1px black; +} + +.phobos-booktable th { + text-align: left; + padding-top: 0.3em; + padding-bottom: 0.3em; +} + +.phobos-booktable td:first-child { + padding-top: 0.3em; + padding-bottom: 0.3em; + padding-right: 1em; +} + +.phobos-booktable td:not(:last-child), +.phobos-booktable th:not(:last-child) { + padding-right: 1em; +} + +.quickindex .phobos-booktable td:last-child a { + padding-right: 1.2em; +} + +.current.breadcrumb { + color: inherit; + text-decoration: none; +} + +.andand-right { + display: inline; +} + +.oror-right { + display: inline; +} + +.parenthetical-expression > .parenthetical-expression-contents > .andand-left, +.parenthetical-expression > .parenthetical-expression-contents > .oror-left { + display: inline; +} + +/* +.parenthetical-expression > .parenthetical-expression-contents > .oror-left:first-child { + display: block; +} +*/ + + +.template-constraint-expression .parenthetical-expression { + display: block; + margin-left: 1em; +} + +.oror-left > .andand-left, +.oror-left > .andand-right { + display: inline; +} + +.aggregate-members:empty::after { + content: "This aggregate has no documented members available."; +} + +h1 .entity-name { + font-family: monospace; +} + +.other-section h3 { + font-size: 1rem; + margin-bottom: 0.25em; +} + +.other-section h3 + p { + margin-top: 0.25em; +} + +.function-prototype .in-contract, +.function-prototype .out-contract { + display: none; + white-space: pre; +} + +.note { + margin: 1em; + padding: 0.5em; + background-color: #f0f0ff; + border: solid 1px #ccc; + clear: both; +} + +/* +.note::before { + color: #000066; + font-weight: bold; + content: "Note: "; +} +*/ + +.warning { + margin: 1em; + padding: 0.5em; + background-color: #fffff0; + border: solid 1px #ccc; + clear: both; +} + +.pitfall { + margin: 1em; + padding: 0.5em; + background-color: #fff0f0; + border: solid 1px #ccc; + clear: both; +} + +.tip { + margin: 1em; + padding: 0.5em; + background-color: #f0fff0; + border: solid 1px #ccc; + clear: both; +} + +.sidebar { + float: right; + margin: 1em; + margin-top: 2px; + padding: 0.25em; + background: #f3f3f3; + border: solid 1px #ccc; + width: 20%; + min-width: 30ch; + clear: right; +} + +h2 { + clear: both; +} + +.sidebar > *:first-child { + margin-top: 0px; +} + +/* I want to clear floats. This leaves a gap about the size of a blank line + too, but that doesn't bother me (actually, I kinda like a small gap at the + bottom. */ +#page-content::after { + clear: both; + content: '\a0'; + display: block; +} + +tt.D, +.inline-code { + color: black; + font-weight: 500; + background-color: #f2f2f2; + padding: 0px 0.125em; +} + +#page-nav .type-separator { + text-transform: capitalize; + display: block; + border-bottom: solid 1px #ccc; + margin-top: 1em; + margin-bottom: 0.25em; +} + +#page-nav a { + display: block; + box-sizing: border-box; + padding: 1px 0.25em 1px 0.5em; + text-overflow: ellipsis; + overflow: hidden; + font-family: "Roboto Slab", sans-serif; +} + +#page-nav a:hover { + position: relative; + overflow: visible; + z-index: 10; + background-color: rgb(245, 245, 245); + width: max-content; +} + +#page-nav a.parent { + font-weight: bold; + font-size: 1.1rem; + line-height: 0.9; + overflow: visible; +} + +#page-nav a.parent:first-child { + margin-top: 0.75em; +} + +#page-nav a.parent + a.parent::before { + content: "."; +} + +#page-nav a.current { + font-weight: bold; + color: inherit; +} + +pre[data-language=console], +pre.console { + background-color: #222; + color: #eee; + padding: 0.5em; + border: solid 1px #ccc; +} + +#more-link { + display: block; + font-weight: bold; + font-size: 1.1rem; + color: blue; +} + +.member-list dd + dt { + border-top: solid 1px #ccc; + padding-top: 0.5em; + margin-top: 0.5em; +} + +/* +.member-list dd { + max-height: 4em; + overflow: hidden; + text-overflow: ellipsis; +} +*/ + +.member-list dt a { + overflow: hidden; + text-overflow: ellipsis; +} + +.member-list dt .simplified-prototype { + font-family: monospace; + font-size: 90%; + color: #333; + white-space: nowrap; + text-overflow: ellipsis; + text-overflow: '[...]'; /* only Firefox supports this but i like it */ + overflow: hidden; + border: solid 1px white; +} + +.member-list dt .simplified-prototype:hover { + background-color: white; + position: relative; + z-index: 5; + width: 800px; + width: calc(100vw - 16em); + border: solid 1px #eee; + box-shadow: 1px 1px 1px #ccc; +} + +@media screen and (min-width: 640px) { + .member-list dt { + float: left; + clear: left; + width: 20em; + box-sizing: border-box; + padding-right: 1em; + } + + .member-list dd, + .member-list dd + dt { + border-top: solid 1px #ccc; + padding-top: 0.5em; + margin-top: 0em; + } + + .member-list dd p:first-child { + margin-top: 0px; + } + + .member-list dd:first-of-type { + border-top: none; + padding-top: 0px; + } + + .member-list dd { + margin: 0px; + margin-left: 20em; + } + + .member-list dd::after { + content: '\a0'; + height: 0.5em; + clear: both; + display: block; + } +} + +.member-list.articles dt, +.member-list.constructors dt { + float: none; + clear: none; + margin: 0em; + width: auto; + border: none; +} + +.member-list.articles dd, +.member-list.constructors dd { + float: none; + clear: none; + margin: 1em 0em; + width: auto; + border: none; +} + +.member-list.articles dd, +.member-list.constructors dd { + padding-left: 2em; +} + +.member-list dt a { + display: block; +} + +#suggestion-box { + display: inline-block; + color: white; + font-weight: bold; + border: solid 2px black; + border-radius: 8px 8px 0px 0px; + position: fixed; + left: 1em; + bottom: 0em; + padding: 0.25em 0.5em; +} + +.synopsis { + margin: 2em 0px; +} + +/* If it was successfully looked up in an xref, no need to highlight anymore */ +a.xref:link span[data-ident].active { + border: none; +} + +#table-of-contents { + border: solid 1px #ccc; + margin: 1em; + padding: 1em; + padding-left: 0em; /* the list inside can handle this */ +} + +.parent-prototype { + font-size: 0.9rem; + padding-bottom: 1em; +} + +.parent-prototype::after { + content: " {"; +} + +.parent-prototype + div { + padding-left: 1em; +} + +.parent-prototype + div::after { + content: "}"; + display: block; + font-size: 0.9rem; + padding-top: 1em; + margin-left: -1.33em; /* 1/(3/4) */ +} + +.search-result::after { + content: '(Search Score: ' attr(data-score) ')'; + font-size: 0.9rem; +} + +table.std_math { + min-width: 25%; + border: solid 1px black; + border-collapse: collapse; + margin: 2em; +} + +table.std_math td, table.std_math th { + border: solid 1px #ccc; + text-align: left; + padding: 0.25em; +} + +table.std_math.special-values th { + border-bottom: solid 2px #000; +} + +table.std_math.special-values caption { + text-align: left; + font-weight: 700; +} + +.nan { + font-family: monospace; + color: red; +} + +.overload-option, +.overload-signature { + font-family: monospace; +} + +.block-code, +.d_code, +.annotated-prototype { + font-size: 1rem; +} + +.annotated-prototype .overloads { + display: block; + padding: 0px; +} + +.annotated-prototype .overloads li { + display: block; + width: auto; + padding: 0em 0.5em; + text-align: left; + overflow: hidden; + + margin: 0; +} + +.member-list .dt, .overload-option, pre { + max-width: unset; +} + +.annotated-prototype .overloads li.active-overload-option { + border: ridge 2px #ccc; +} + +.annotated-prototype .overloads li.active-overload-option .overload-signature { + white-space: nowrap; + border-bottom: dotted 1px #999; + display: block; +} + +.annotated-prototype .overloads li.overload-option { + border: solid 1px #ccc; + background-color: #eee; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.annotated-prototype .overloads li.ditto-option::before, +.annotated-prototype .overloads li.active-overload-option .overload-signature::before, +.annotated-prototype .overloads li.overload-option::before { + display: inline-block; + width: 6em; + width: 9ch; + font-size: 0.9rem; + vertical-align: baseline; +} + +.annotated-prototype .overloads li.overload-option::before { + content: "Overload: "; +} + +.annotated-prototype .overloads li.active-overload-option .overload-signature::before { + content: "Viewing: "; +} + +.annotated-prototype .overloads li.ditto-option::before { + content: "Related: "; +} + +.annotated-prototype li .declaration-prototype, +.annotated-prototype li .aggregate-prototype, +.annotated-prototype li .function-prototype { + border: none; + padding: 0px; +} + +.annotated-prototype li .declaration-prototype { + padding: 2em 0px; +} + +#page-nav ul { + margin: 0px; + padding: 0px; + list-style: none; +} + +.parameter-name > a[href^="#"], +a.parameter-name[href^="#"] { + color: inherit; +} + + + +/* adrdox special syntax styles */ + +.small-table { + border-collapse: collapse; + min-width: 10em; +} + +.small-table td, +.small-table th { + border: solid 1px #ccc; + padding: 0.25em; +} + +.small-table thead th { + border-bottom: solid 2px #999; +} + +.small-table tbody th, +.small-table.two-axes thead th:first-child { + border-right: solid 2px #999; +} + +.small-table.two-axes td, +.small-table.two-axes th { + text-align: center; + vertical-align: middle; +} + +.adrdox-sample { + display: table; + width: 100%; +} + +.adrdox-sample > div { + display: table-row; +} + +.adrdox-sample > div > * { + display: table-cell; + width: 50%; + vertical-align: top; + border-bottom: dashed 1px #ccc; + padding: 0.25em; + padding-bottom: 0.5em; +} + +.adrdox-sample > div > pre { + border-right: dashed 1px #ccc; +} + +.adrdox-sample > div > pre::before, +.adrdox-sample > div > div::before { + display: block; + font-style: italic; + border-bottom: dashed 1px #ccc; + margin-bottom: 0.5em; + font-family: sans-serif; + font-size: 1rem; + padding: 0px; +} + +.adrdox-sample > div > pre::before { + content: 'Doc source:'; +} +.adrdox-sample > div > div::before { + content: 'Rendered:'; +} + +blockquote { + margin: 1em; + padding: 1em; + border-left: 0.5em solid #ccc; + color: #333; +} + +pre.d_code, +.block-code:not([data-language=""]):not([data-language="pre"]) { + background-color: #fcfcfc; + padding: 0.25em; + border: solid 1px #ccc; + position: relative; +} + +.block-code:not([data-language=""]):not([data-language="pre"])::before { + content: attr(data-language); + display: block; + text-transform: capitalize; + font-size: 0.9rem; + padding: 0px 2px; + border: solid 1px #999; + border-top: none; + border-radius: 0px 0px 0.25em 0.25em; + background-color: #f0f0f0; + float: right; + margin: 0px; + margin-top: -0.25em; + margin-top: calc(-0.25em - 1px); +} +.type, +.highlighted-type { + color: green; + /* font-weight: bold; */ +} +.num, +.highlighted-number { + color: #dc322f; +} +.str, +.highlighted-string { + color: red; +} +.com, +.highlighted-comment { + color: blue; +} +.highlighted-preprocessor-directive { + color: #cd00cd; +} +.highlighted-identifier, +.highlighted-tag { + color: #008888; +} +.highlighted-tag-name { + color: #859900; +} +.highlighted-entity { + color: #cd00cd; + text-decoration: none; + cursor: help; +} +.highlighted-named-constant, +.highlighted-attribute-name { + color: green; +} +.highlighted-attribute-value { + color: red; +} +.highlighted-python-indent { + background: linear-gradient(to right, #eee, transparent 3px) no-repeat; +} +.highlighted-python-indent:hover { + background: linear-gradient(to right, #ccc, transparent 3px) no-repeat; +} + +/* +.with-line-wrappers { + counter-reset: line_numbers; +} + +.with-line-wrappers span.br { + counter-increment: line_numbers; +} + +.with-line-wrappers span.br::before { + content: counter(line_numbers); +*/ +.with-line-wrappers .br { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + width: 3em; + width: 4ch; + display: inline-block; + color: #999; + border-right: solid 2px #ccc; + padding: 0px; + margin: 0px; + margin-right: 3px; + padding-right: 3px; + font-style: normal; + font-weight: normal; + background-color: transparent; + text-align: right; + white-space: pre; +} + +.hide-line-numbers .with-line-wrappers .br { + display: none; +} +.with-line-wrappers .br:target { + background: #ffffbb; +} + +.thousand-lines.with-line-wrappers .br { + width: 4em; + width: 5ch; +} +.ten-thousand-lines.with-line-wrappers .br { + width: 5em; + width: 6ch; +} + +#source-navigation { + position: fixed; + width: 15.5em; +} + +#source-navigation .list-holder { + width: 100%; + overflow: auto; + max-height: 80vh; +} + +#source-navigation .list-holder ul { + padding-left: 1em; +} + +/* hide nested decls as it is too much... */ +#source-navigation .list-holder ul > li > ul { + display: none; +} + +/* ...but show top-level decls under the module cuz no reason not to */ +#source-navigation .list-holder > ul > li > ul { + display: block; +} + +#source-navigation li { + white-space: nowrap; +} + +#source-navigation a { + display: inline; +} + +.postcondition { + color: blue; + font-family: monospace; + font-size: 0.9rem; +} +.postcondition::before { + content: "Post: "; + font-style: italic; + color: black; +} + +.user-table { + border-top: solid 2px black; + border-collapse: collapse; +} + +.user-table tr:nth-of-type(1) th { + border-bottom: solid 1px black; + text-align: left; +} + +.user-table td { + border-bottom: solid 1px #ccc; + vertical-align: top; + padding: 4px; +} +.user-table th { + padding: 4px; +} + +.user-table.two-axes tr + tr th:first-child { + border-bottom: solid 1px #ccc; +} + +.user-table.two-axes th:first-child { + border-right: solid 1px black; + text-align: right; +} + +.allocator-table td:first-child tt { + background-color: transparent; + white-space: nowrap; + font-weight: bold; +} + +.header-anchor { + color: inherit !important; +} + +#members + h3, +.member-list + h3, +h3.member-list-header { + border-bottom: solid 1px #333; + text-transform: capitalize; +} + +#members + h4, +.member-list + h4, +h4.member-list-header { + font-weight: normal; + text-transform: capitalize; + text-decoration: underline; +} + + +tr.leading-row th { + border-bottom: solid 2px black; +} + +.lambda-expression * { + display: inline !important; + padding: 0px !important; + margin: 0px !important; +} + +.footnote-ref a {} +.footnote-ref abbr { + font-variant: none; + text-decoration: none; + cursor: help; +} + +.side-by-side { + table-layout: fixed; + border: none; + width: 100%; +} + +.side-by-side > tbody > tr > td { + vertical-align: top; +} + +/* +tt.D { + font-weight: bold; + background: transparent; + color: inherit; +} +*/ + +tt.D.highlighted *:not(a) { + font-weight: inherit; + color: inherit; +} +tt.D.highlighted a { + color: #500000; +} + +.date-posted { + font-size: 0.9rem; + font-style: italic; +} + +.token-string-literal { + font-style: italic; +} +.token-string-literal:hover { + background-color: rgba(255, 0, 0, 0.05); +} + +.specially-highlighted { + background-color: yellow; + background-color: rgba(255, 255, 0, 0.5); +} + +.console .specially-highlighted { + background-color: rgba(255, 255, 0, 1.0); + color: black; +} + +.quickindex { + background: #f5f5f5; + max-width: 760px; +} + +.quickindex .phobos-booktable { + width: 100%; +} + +.leading-row { + font-style: italic; + background-color: rgb(228, 233, 239); +} + +.leading-row th { + padding-left: 1.5em; +} + +.quickindex td, .quickindex th { + padding-left: 0.3em; +} + +.undocumented-note { + color: #999; +} + +.deprecated-decl { + color: #c00; + font-weight: bold; +} + +.conditional-compilation-attributes { + font-size: 90%; +} + +@media (prefers-color-scheme: dark) { + body { + color: #ddd; + background-color: black; + } + + a:link, a:visited { + color: #00aaff !important; + } + + #page-nav { + background-color: #333 !important; + } + + tt.D, + .inline-code { + background-color: #444; + color: #eee; + } + + .block-code:not([data-language=""]):not([data-language="pre"]), + pre.d_code { + background-color: #444; + color: #eee; + } + + .tip { + background-color: #306630; + } + + .pitfall { + background-color: #663030; + } + + .warning { + background-color: #666630; + } + + .note { + background-color: #3333aa; + } + + .sidebar { + background-color: #555; + } + + .member-list dt .simplified-prototype { + color: #aaa; + border-color: black; + } + + .member-list dt .simplified-prototype:hover { + background-color: black; + border-color: #555; + } + + .highlighted-comment, + .com { + color: #0ff !important; + } + + .kwrd, + .highlighted-keyword, + .lang-feature, + .storage-class { + color: #8ff !important; + } + + .type-constructor, + .builtin-type { + color: #00cc00 !important; + } + + .type, + .highlighted-type { + color: lime; + } +} + diff --git a/docs/ddoc/transport/handy_http_transport.helpers.consumeUntil.html b/docs/ddoc/transport/handy_http_transport.helpers.consumeUntil.html new file mode 100644 index 0000000..af44097 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.helpers.consumeUntil.html @@ -0,0 +1,36 @@ + + + + consumeUntil (handy_http_transport.helpers.consumeUntil) + + + + + + + + + + +
+
+

consumeUntil

Helper function to consume string content from an input stream until a +certain target pattern of characters is encountered.

Either!(string, "value", StreamError, "error")
consumeUntil
(
S
)
(,
string target
)
if (
isByteInputStream!S
)

Parameters

inputStream S

The stream to read from.

target string

The target at which to stop reading.

Return Value

Type: Either!(string, "value", StreamError, "error")

The string that was read, or a stream error.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.helpers.html b/docs/ddoc/transport/handy_http_transport.helpers.html new file mode 100644 index 0000000..0f0c3cd --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.helpers.html @@ -0,0 +1,38 @@ + + + + handy_http_transport.helpers (handy_http_transport.helpers) + + + + + + + + + + +
+
+

handy_http_transport.helpers

Undocumented in source.

Members

Functions

consumeUntil
Either!(string, "value", StreamError, "error") consumeUntil(S inputStream, string target)

Helper function to consume string content from an input stream until a +certain target pattern of characters is encountered.

indexOf
ptrdiff_t indexOf(string s, char c, size_t offset)

Internal helper function to get the first index of a character in a string.

stripSpaces
string stripSpaces(string s)

Internal helper function that returns the slice of a string excluding any +preceding or trailing spaces.

writeUIntToBuffer
void writeUIntToBuffer(uint value, char[] buffer, size_t idx)

Helper function to append an unsigned integer value to a char buffer. It is +assumed that there's enough space to write the value.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.helpers.indexOf.html b/docs/ddoc/transport/handy_http_transport.helpers.indexOf.html new file mode 100644 index 0000000..cea4399 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.helpers.indexOf.html @@ -0,0 +1,35 @@ + + + + indexOf (handy_http_transport.helpers.indexOf) + + + + + + + + + + +
+
+

indexOf

Internal helper function to get the first index of a character in a string.

ptrdiff_t
indexOf
(
string s
,
char c
,
size_t offset = 0
)

Parameters

s string

The string to look in.

c char

The character to look for.

offset size_t

An optional offset to look from.

Return Value

Type: ptrdiff_t

The index of the character, or -1.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.helpers.stripSpaces.html b/docs/ddoc/transport/handy_http_transport.helpers.stripSpaces.html new file mode 100644 index 0000000..cd61446 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.helpers.stripSpaces.html @@ -0,0 +1,36 @@ + + + + stripSpaces (handy_http_transport.helpers.stripSpaces) + + + + + + + + + + +
+
+

stripSpaces

Internal helper function that returns the slice of a string excluding any +preceding or trailing spaces.

string
stripSpaces
(
string s
)

Parameters

s string

The string to strip.

Return Value

Type: string

The slice of the string that has been stripped.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.helpers.writeUIntToBuffer.html b/docs/ddoc/transport/handy_http_transport.helpers.writeUIntToBuffer.html new file mode 100644 index 0000000..1c24079 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.helpers.writeUIntToBuffer.html @@ -0,0 +1,36 @@ + + + + writeUIntToBuffer (handy_http_transport.helpers.writeUIntToBuffer) + + + + + + + + + + +
+
+

writeUIntToBuffer

Helper function to append an unsigned integer value to a char buffer. It is +assumed that there's enough space to write the value.

void
writeUIntToBuffer
(
uint value
,
char[] buffer
,
ref size_t idx
)

Parameters

value uint

The value to append.

buffer char[]

The buffer to append to.

idx size_t

A reference to a variable tracking the next writable index in the buffer.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.html b/docs/ddoc/transport/handy_http_transport.html new file mode 100644 index 0000000..f1c08f5 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.html @@ -0,0 +1,39 @@ + + + + handy_http_transport (handy_http_transport) + + + + + + + + + + +
+
+

handy_http_transport

Undocumented in source.

Modules

helpers
module handy_http_transport.helpers
Undocumented in source.
http1
module handy_http_transport.http1

This package defines the Handy-Http implementation of HTTP/1.1.

http2
module handy_http_transport.http2
Undocumented in source.
interfaces
module handy_http_transport.interfaces
Undocumented in source.
response_output_stream
module handy_http_transport.response_output_stream
Undocumented in source.

Public Imports

handy_http_transport.http1
public +import handy_http_transport.http1;
Undocumented in source.
handy_http_transport.http2
public +import handy_http_transport.http2;
Undocumented in source.
handy_http_transport.interfaces
public +import handy_http_transport.interfaces;
Undocumented in source.
handy_http_transport.response_output_stream
public +import handy_http_transport.response_output_stream;
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.epoll.Http1EpollTransport.html b/docs/ddoc/transport/handy_http_transport.http1.epoll.Http1EpollTransport.html new file mode 100644 index 0000000..1b5528a --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.epoll.Http1EpollTransport.html @@ -0,0 +1,35 @@ + + + + Http1EpollTransport (handy_http_transport.http1.epoll.Http1EpollTransport) + + + + + + + + + + +
+
+

Http1EpollTransport

Undocumented in source.

Constructors

this
this(HttpRequestHandler requestHandler, ushort port)
Undocumented in source.

Members

Functions

start
void start()
Undocumented in source. Be warned that the author may not have intended to support it.

Inherited Members

From Http1Transport

requestHandler
HttpRequestHandler requestHandler;
Undocumented in source.
port
ushort port;
Undocumented in source.
isRunning
bool isRunning()
Undocumented in source. Be warned that the author may not have intended to support it.
start
void start()
Undocumented in source. Be warned that the author may not have intended to support it.
runServer
void runServer()
Undocumented in source.
stop
void stop()
Undocumented in source. Be warned that the author may not have intended to support it.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.epoll.Http1EpollTransport.start.html b/docs/ddoc/transport/handy_http_transport.http1.epoll.Http1EpollTransport.start.html new file mode 100644 index 0000000..4ac1ffe --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.epoll.Http1EpollTransport.start.html @@ -0,0 +1,35 @@ + + + + Http1EpollTransport.start (handy_http_transport.http1.epoll.Http1EpollTransport.start) + + + + + + + + + + +
+
+

Http1EpollTransport.start

Undocumented in source. Be warned that the author may not have intended to support it.
class Http1EpollTransport
override
void
start
()
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.epoll.Http1EpollTransport.this.html b/docs/ddoc/transport/handy_http_transport.http1.epoll.Http1EpollTransport.this.html new file mode 100644 index 0000000..7945e75 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.epoll.Http1EpollTransport.this.html @@ -0,0 +1,35 @@ + + + + Http1EpollTransport.this (handy_http_transport.http1.epoll.Http1EpollTransport.this) + + + + + + + + + + +
+
+

Http1EpollTransport.this

Undocumented in source.
class Http1EpollTransport
this
(
HttpRequestHandler requestHandler
,
ushort port
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.epoll.accept4.html b/docs/ddoc/transport/handy_http_transport.http1.epoll.accept4.html new file mode 100644 index 0000000..5b061e2 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.epoll.accept4.html @@ -0,0 +1,35 @@ + + + + accept4 (handy_http_transport.http1.epoll.accept4) + + + + + + + + + + +
+
+

accept4

Undocumented in source but is binding to C. You might be able to learn more by searching the web for its name.
extern (C)
int
accept4
(
int sockfd
,
sockaddr* addr
,
socklen_t* addrlen
,
int flags
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.epoll.html b/docs/ddoc/transport/handy_http_transport.http1.epoll.html new file mode 100644 index 0000000..6d38f87 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.epoll.html @@ -0,0 +1,35 @@ + + + + handy_http_transport.http1.epoll (handy_http_transport.http1.epoll) + + + + + + + + + + +
+
+

handy_http_transport.http1.epoll

Undocumented in source.

Members

Classes

Http1EpollTransport
class Http1EpollTransport
Undocumented in source.

Functions

accept4
int accept4(int sockfd, sockaddr* addr, socklen_t* addrlen, int flags)
Undocumented in source but is binding to C. You might be able to learn more by searching the web for its name.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.html b/docs/ddoc/transport/handy_http_transport.http1.html new file mode 100644 index 0000000..6a8ac6e --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.html @@ -0,0 +1,37 @@ + + + + handy_http_transport.http1 (handy_http_transport.http1) + + + + + + + + + + +
+
+

handy_http_transport.http1

This package defines the Handy-Http implementation of HTTP/1.1.

Modules

epoll
module handy_http_transport.http1.epoll
Undocumented in source.
photon
module handy_http_transport.http1.photon
Undocumented in source.
task_pool
module handy_http_transport.http1.task_pool
Undocumented in source.
transport
module handy_http_transport.http1.transport
Undocumented in source.

Public Imports

handy_http_transport.http1.transport
public +import handy_http_transport.http1.transport;
Undocumented in source.
handy_http_transport.http1.task_pool
public +import handy_http_transport.http1.task_pool;
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.photon.PhotonHttp1Transport.html b/docs/ddoc/transport/handy_http_transport.http1.photon.PhotonHttp1Transport.html new file mode 100644 index 0000000..70a0408 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.photon.PhotonHttp1Transport.html @@ -0,0 +1,38 @@ + + + + PhotonHttp1Transport (handy_http_transport.http1.photon.PhotonHttp1Transport) + + + + + + + + + + +
+
+

PhotonHttp1Transport

An implementation of Http1Transport which uses Dimitry Olshansky's Photon +library for asynchronous task processing. A main fiber is started which +accepts incoming client sockets, and a fiber is spawned for each client so +its request can be handled asynchronously.

Constructors

this
this(HttpRequestHandler handler, ushort port)
Undocumented in source.

Members

Functions

runServer
void runServer()
Undocumented in source. Be warned that the author may not have intended to support it.
stop
void stop()
Undocumented in source. Be warned that the author may not have intended to support it.

Inherited Members

From Http1Transport

requestHandler
HttpRequestHandler requestHandler;
Undocumented in source.
port
ushort port;
Undocumented in source.
isRunning
bool isRunning()
Undocumented in source. Be warned that the author may not have intended to support it.
start
void start()
Undocumented in source. Be warned that the author may not have intended to support it.
runServer
void runServer()
Undocumented in source.
stop
void stop()
Undocumented in source. Be warned that the author may not have intended to support it.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.photon.PhotonHttp1Transport.runServer.html b/docs/ddoc/transport/handy_http_transport.http1.photon.PhotonHttp1Transport.runServer.html new file mode 100644 index 0000000..a2b8019 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.photon.PhotonHttp1Transport.runServer.html @@ -0,0 +1,35 @@ + + + + PhotonHttp1Transport.runServer (handy_http_transport.http1.photon.PhotonHttp1Transport.runServer) + + + + + + + + + + +
+
+

PhotonHttp1Transport.runServer

Undocumented in source. Be warned that the author may not have intended to support it.
class PhotonHttp1Transport
override
void
runServer
()
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.photon.PhotonHttp1Transport.stop.html b/docs/ddoc/transport/handy_http_transport.http1.photon.PhotonHttp1Transport.stop.html new file mode 100644 index 0000000..beea9f5 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.photon.PhotonHttp1Transport.stop.html @@ -0,0 +1,35 @@ + + + + PhotonHttp1Transport.stop (handy_http_transport.http1.photon.PhotonHttp1Transport.stop) + + + + + + + + + + +
+
+

PhotonHttp1Transport.stop

Undocumented in source. Be warned that the author may not have intended to support it.
class PhotonHttp1Transport
override
void
stop
()
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.photon.PhotonHttp1Transport.this.html b/docs/ddoc/transport/handy_http_transport.http1.photon.PhotonHttp1Transport.this.html new file mode 100644 index 0000000..661b4fb --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.photon.PhotonHttp1Transport.this.html @@ -0,0 +1,35 @@ + + + + PhotonHttp1Transport.this (handy_http_transport.http1.photon.PhotonHttp1Transport.this) + + + + + + + + + + +
+
+

PhotonHttp1Transport.this

Undocumented in source.
class PhotonHttp1Transport
this
(
HttpRequestHandler handler
,
ushort port = 8080
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.photon.html b/docs/ddoc/transport/handy_http_transport.http1.photon.html new file mode 100644 index 0000000..eff5623 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.photon.html @@ -0,0 +1,38 @@ + + + + handy_http_transport.http1.photon (handy_http_transport.http1.photon) + + + + + + + + + + +
+
+

handy_http_transport.http1.photon

Undocumented in source.

Members

Classes

PhotonHttp1Transport
class PhotonHttp1Transport

An implementation of Http1Transport which uses Dimitry Olshansky's Photon +library for asynchronous task processing. A main fiber is started which +accepts incoming client sockets, and a fiber is spawned for each client so +its request can be handled asynchronously.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.task_pool.Http1TransportConfig.host.html b/docs/ddoc/transport/handy_http_transport.http1.task_pool.Http1TransportConfig.host.html new file mode 100644 index 0000000..a9aea6b --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.task_pool.Http1TransportConfig.host.html @@ -0,0 +1,35 @@ + + + + Http1TransportConfig.host (handy_http_transport.http1.task_pool.Http1TransportConfig.host) + + + + + + + + + + +
+
+

Http1TransportConfig.host

The host address to bind to.

struct Http1TransportConfig
string host;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.task_pool.Http1TransportConfig.html b/docs/ddoc/transport/handy_http_transport.http1.task_pool.Http1TransportConfig.html new file mode 100644 index 0000000..c1102e1 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.task_pool.Http1TransportConfig.html @@ -0,0 +1,36 @@ + + + + Http1TransportConfig (handy_http_transport.http1.task_pool.Http1TransportConfig) + + + + + + + + + + +
+
+

Http1TransportConfig

Configuration options to provide when creating a new Http1Transport +instance.

struct Http1TransportConfig {}

Members

Variables

host
string host;

The host address to bind to.

port
ushort port;

The port to bind to.

workerCount
size_t workerCount;

The number of workers to use in the task pool.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.task_pool.Http1TransportConfig.port.html b/docs/ddoc/transport/handy_http_transport.http1.task_pool.Http1TransportConfig.port.html new file mode 100644 index 0000000..c95e5be --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.task_pool.Http1TransportConfig.port.html @@ -0,0 +1,35 @@ + + + + Http1TransportConfig.port (handy_http_transport.http1.task_pool.Http1TransportConfig.port) + + + + + + + + + + +
+
+

Http1TransportConfig.port

The port to bind to.

struct Http1TransportConfig
ushort port;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.task_pool.Http1TransportConfig.workerCount.html b/docs/ddoc/transport/handy_http_transport.http1.task_pool.Http1TransportConfig.workerCount.html new file mode 100644 index 0000000..4d1bdd1 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.task_pool.Http1TransportConfig.workerCount.html @@ -0,0 +1,35 @@ + + + + Http1TransportConfig.workerCount (handy_http_transport.http1.task_pool.Http1TransportConfig.workerCount) + + + + + + + + + + +
+
+

Http1TransportConfig.workerCount

The number of workers to use in the task pool.

struct Http1TransportConfig
size_t workerCount;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.task_pool.TaskPoolHttp1Transport.html b/docs/ddoc/transport/handy_http_transport.http1.task_pool.TaskPoolHttp1Transport.html new file mode 100644 index 0000000..a07a95f --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.task_pool.TaskPoolHttp1Transport.html @@ -0,0 +1,38 @@ + + + + TaskPoolHttp1Transport (handy_http_transport.http1.task_pool.TaskPoolHttp1Transport) + + + + + + + + + + +
+
+

TaskPoolHttp1Transport

An implementation of Http1Transport which uses D's standard library +parallelization, where each incoming client request is turned into a task +and submitted to the standard task pool.

Constructors

this
this(HttpRequestHandler requestHandler, Http1TransportConfig config)

Creates a new transport instance using a std.parallelism TaskPool for +handling requests.

Members

Functions

runServer
void runServer()
Undocumented in source. Be warned that the author may not have intended to support it.
stop
void stop()
Undocumented in source. Be warned that the author may not have intended to support it.

Inherited Members

From Http1Transport

requestHandler
HttpRequestHandler requestHandler;
Undocumented in source.
port
ushort port;
Undocumented in source.
isRunning
bool isRunning()
Undocumented in source. Be warned that the author may not have intended to support it.
start
void start()
Undocumented in source. Be warned that the author may not have intended to support it.
runServer
void runServer()
Undocumented in source.
stop
void stop()
Undocumented in source. Be warned that the author may not have intended to support it.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.task_pool.TaskPoolHttp1Transport.runServer.html b/docs/ddoc/transport/handy_http_transport.http1.task_pool.TaskPoolHttp1Transport.runServer.html new file mode 100644 index 0000000..e1c356a --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.task_pool.TaskPoolHttp1Transport.runServer.html @@ -0,0 +1,35 @@ + + + + TaskPoolHttp1Transport.runServer (handy_http_transport.http1.task_pool.TaskPoolHttp1Transport.runServer) + + + + + + + + + + +
+
+

TaskPoolHttp1Transport.runServer

Undocumented in source. Be warned that the author may not have intended to support it.
class TaskPoolHttp1Transport
override
void
runServer
()
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.task_pool.TaskPoolHttp1Transport.stop.html b/docs/ddoc/transport/handy_http_transport.http1.task_pool.TaskPoolHttp1Transport.stop.html new file mode 100644 index 0000000..178aa41 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.task_pool.TaskPoolHttp1Transport.stop.html @@ -0,0 +1,35 @@ + + + + TaskPoolHttp1Transport.stop (handy_http_transport.http1.task_pool.TaskPoolHttp1Transport.stop) + + + + + + + + + + +
+
+

TaskPoolHttp1Transport.stop

Undocumented in source. Be warned that the author may not have intended to support it.
class TaskPoolHttp1Transport
override
void
stop
()
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.task_pool.TaskPoolHttp1Transport.this.html b/docs/ddoc/transport/handy_http_transport.http1.task_pool.TaskPoolHttp1Transport.this.html new file mode 100644 index 0000000..4ae08c9 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.task_pool.TaskPoolHttp1Transport.this.html @@ -0,0 +1,36 @@ + + + + TaskPoolHttp1Transport.this (handy_http_transport.http1.task_pool.TaskPoolHttp1Transport.this) + + + + + + + + + + +
+
+

TaskPoolHttp1Transport.this

Creates a new transport instance using a std.parallelism TaskPool for +handling requests.

class TaskPoolHttp1Transport
this

Parameters

requestHandler HttpRequestHandler

The handler to call for each incoming request.

config Http1TransportConfig

The configuration settings for this transport instance.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.task_pool.defaultConfig.html b/docs/ddoc/transport/handy_http_transport.http1.task_pool.defaultConfig.html new file mode 100644 index 0000000..c4122b8 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.task_pool.defaultConfig.html @@ -0,0 +1,38 @@ + + + + defaultConfig (handy_http_transport.http1.task_pool.defaultConfig) + + + + + + + + + + +
+
+

defaultConfig

Defines the default configuration options if none are provided. They are: +* Host address 127.0.0.1 +* Port 8080 +* Worker count of 5.

defaultConfig
()

Return Value

The default configuration.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.task_pool.html b/docs/ddoc/transport/handy_http_transport.http1.task_pool.html new file mode 100644 index 0000000..b346dca --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.task_pool.html @@ -0,0 +1,41 @@ + + + + handy_http_transport.http1.task_pool (handy_http_transport.http1.task_pool) + + + + + + + + + + +
+
+

handy_http_transport.http1.task_pool

Undocumented in source.

Members

Classes

TaskPoolHttp1Transport
class TaskPoolHttp1Transport

An implementation of Http1Transport which uses D's standard library +parallelization, where each incoming client request is turned into a task +and submitted to the standard task pool.

Functions

defaultConfig
Http1TransportConfig defaultConfig()

Defines the default configuration options if none are provided. They are: +* Host address 127.0.0.1 +* Port 8080 +* Worker count of 5.

Structs

Http1TransportConfig
struct Http1TransportConfig

Configuration options to provide when creating a new Http1Transport +instance.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.html b/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.html new file mode 100644 index 0000000..1e7944d --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.html @@ -0,0 +1,36 @@ + + + + Http1Transport (handy_http_transport.http1.transport.Http1Transport) + + + + + + + + + + +
+
+

Http1Transport

Base class for HTTP/1.1 transport, where different subclasses can define +how the actual socket communication works (threadpool / epoll/ etc).

Constructors

this
this(HttpRequestHandler requestHandler, ushort port)
Undocumented in source.

Members

Functions

isRunning
bool isRunning()
Undocumented in source. Be warned that the author may not have intended to support it.
runServer
void runServer()
Undocumented in source.
start
void start()
Undocumented in source. Be warned that the author may not have intended to support it.
stop
void stop()
Undocumented in source. Be warned that the author may not have intended to support it.

Variables

port
ushort port;
Undocumented in source.
requestHandler
HttpRequestHandler requestHandler;
Undocumented in source.

Inherited Members

From HttpTransport

start
void start()
Undocumented in source.
stop
void stop()
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.isRunning.html b/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.isRunning.html new file mode 100644 index 0000000..913d7cf --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.isRunning.html @@ -0,0 +1,35 @@ + + + + Http1Transport.isRunning (handy_http_transport.http1.transport.Http1Transport.isRunning) + + + + + + + + + + +
+
+

Http1Transport.isRunning

Undocumented in source. Be warned that the author may not have intended to support it.
class Http1Transport
bool
isRunning
()
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.port.html b/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.port.html new file mode 100644 index 0000000..69e9e2d --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.port.html @@ -0,0 +1,35 @@ + + + + Http1Transport.port (handy_http_transport.http1.transport.Http1Transport.port) + + + + + + + + + + +
+
+

Http1Transport.port

Undocumented in source.
class Http1Transport
protected immutable
ushort port;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.requestHandler.html b/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.requestHandler.html new file mode 100644 index 0000000..057d7fc --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.requestHandler.html @@ -0,0 +1,35 @@ + + + + Http1Transport.requestHandler (handy_http_transport.http1.transport.Http1Transport.requestHandler) + + + + + + + + + + +
+
+

Http1Transport.requestHandler

Undocumented in source.
class Http1Transport
protected
HttpRequestHandler requestHandler;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.runServer.html b/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.runServer.html new file mode 100644 index 0000000..9904fc3 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.runServer.html @@ -0,0 +1,35 @@ + + + + Http1Transport.runServer (handy_http_transport.http1.transport.Http1Transport.runServer) + + + + + + + + + + +
+
+

Http1Transport.runServer

Undocumented in source.
class Http1Transport
protected abstract
void
runServer
()
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.start.html b/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.start.html new file mode 100644 index 0000000..6007af8 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.start.html @@ -0,0 +1,35 @@ + + + + Http1Transport.start (handy_http_transport.http1.transport.Http1Transport.start) + + + + + + + + + + +
+
+

Http1Transport.start

Undocumented in source. Be warned that the author may not have intended to support it.
class Http1Transport
void
start
()
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.stop.html b/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.stop.html new file mode 100644 index 0000000..a4f1a26 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.stop.html @@ -0,0 +1,35 @@ + + + + Http1Transport.stop (handy_http_transport.http1.transport.Http1Transport.stop) + + + + + + + + + + +
+
+

Http1Transport.stop

Undocumented in source. Be warned that the author may not have intended to support it.
class Http1Transport
void
stop
()
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.this.html b/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.this.html new file mode 100644 index 0000000..1058a36 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.transport.Http1Transport.this.html @@ -0,0 +1,35 @@ + + + + Http1Transport.this (handy_http_transport.http1.transport.Http1Transport.this) + + + + + + + + + + +
+
+

Http1Transport.this

Undocumented in source.
class Http1Transport
this
(
HttpRequestHandler requestHandler
,
ushort port = 8080
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.transport.HttpRequestParseResult.html b/docs/ddoc/transport/handy_http_transport.http1.transport.HttpRequestParseResult.html new file mode 100644 index 0000000..cc2efd6 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.transport.HttpRequestParseResult.html @@ -0,0 +1,35 @@ + + + + HttpRequestParseResult (handy_http_transport.http1.transport.HttpRequestParseResult) + + + + + + + + + + +
+
+

HttpRequestParseResult

Alias for the result of the readHttpRequest function which parses HTTP requests.

alias HttpRequestParseResult = Either!(ServerHttpRequest, "request", StreamError, "error")
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.transport.getAddress.html b/docs/ddoc/transport/handy_http_transport.http1.transport.getAddress.html new file mode 100644 index 0000000..3535707 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.transport.getAddress.html @@ -0,0 +1,35 @@ + + + + getAddress (handy_http_transport.http1.transport.getAddress) + + + + + + + + + + +
+
+

getAddress

Gets a ClientAddress value from a socket's address information.

ClientAddress
getAddress
(
Socket socket
)

Parameters

socket Socket

The socket to get address information for.

Return Value

Type: ClientAddress

The address that was obtained.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.transport.handleClient.html b/docs/ddoc/transport/handy_http_transport.http1.transport.handleClient.html new file mode 100644 index 0000000..84ce660 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.transport.handleClient.html @@ -0,0 +1,38 @@ + + + + handleClient (handy_http_transport.http1.transport.handleClient) + + + + + + + + + + +
+
+

handleClient

The main logic for handling an incoming request from a client. It involves +reading bytes from the client, parsing them as an HTTP request, passing that +to the HTTP Transport's request handler, and then writing the response back +to the client.

void
handleClient
(,
HttpRequestHandler requestHandler
)

Parameters

clientSocket Socket

The newly-accepted client socket.

requestHandler HttpRequestHandler

The request handler that will handle the received HTTP request.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.transport.html b/docs/ddoc/transport/handy_http_transport.http1.transport.html new file mode 100644 index 0000000..6b1e1f6 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.transport.html @@ -0,0 +1,41 @@ + + + + handy_http_transport.http1.transport (handy_http_transport.http1.transport) + + + + + + + + + + +
+
+

handy_http_transport.http1.transport

Undocumented in source.

Members

Aliases

HttpRequestParseResult
alias HttpRequestParseResult = Either!(ServerHttpRequest, "request", StreamError, "error")

Alias for the result of the readHttpRequest function which parses HTTP requests.

Classes

Http1Transport
class Http1Transport

Base class for HTTP/1.1 transport, where different subclasses can define +how the actual socket communication works (threadpool / epoll/ etc).

Functions

getAddress
ClientAddress getAddress(Socket socket)

Gets a ClientAddress value from a socket's address information.

handleClient
void handleClient(Socket clientSocket, HttpRequestHandler requestHandler)

The main logic for handling an incoming request from a client. It involves +reading bytes from the client, parsing them as an HTTP request, passing that +to the HTTP Transport's request handler, and then writing the response back +to the client.

parseHeaders
Either!(string[][string], "headers", StreamError, "error") parseHeaders(S inputStream)

Parses HTTP headers from an input stream, and returns them as an associative +array mapping header names to their list of values.

readHttpRequest
HttpRequestParseResult readHttpRequest(S inputStream, ClientAddress addr)

Parses an HTTP/1.1 request from a byte input stream.

testHttp1Transport
void testHttp1Transport(Http1Transport transport)

A generic test to ensure that any Http1Transport implementation behaves +properly to start & stop, and process requests when running.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.transport.parseHeaders.html b/docs/ddoc/transport/handy_http_transport.http1.transport.parseHeaders.html new file mode 100644 index 0000000..67afd95 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.transport.parseHeaders.html @@ -0,0 +1,38 @@ + + + + parseHeaders (handy_http_transport.http1.transport.parseHeaders) + + + + + + + + + + +
+
+

parseHeaders

Parses HTTP headers from an input stream, and returns them as an associative +array mapping header names to their list of values.

Either!(string[][string], "headers", StreamError, "error")
parseHeaders
(
S
)
if (
isByteInputStream!S
)

Parameters

inputStream S

The byte input stream to read from. Note that this stream + should be passed as a pointer / reference, values will be + consumed from the stream.

Return Value

Type: Either!(string[][string], "headers", StreamError, "error")

Either the headers, or a stream error.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.transport.readHttpRequest.html b/docs/ddoc/transport/handy_http_transport.http1.transport.readHttpRequest.html new file mode 100644 index 0000000..fa9c3b5 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.transport.readHttpRequest.html @@ -0,0 +1,35 @@ + + + + readHttpRequest (handy_http_transport.http1.transport.readHttpRequest) + + + + + + + + + + +
+
+

readHttpRequest

Parses an HTTP/1.1 request from a byte input stream.

readHttpRequest
(
S
)
(,
in ClientAddress addr
)
if (
isByteInputStream!S
)

Parameters

inputStream S

The byte input stream to read from.

addr ClientAddress

The client address, used in constructed the http request struct.

Return Value

Either the request which was parsed, or a stream error.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http1.transport.testHttp1Transport.html b/docs/ddoc/transport/handy_http_transport.http1.transport.testHttp1Transport.html new file mode 100644 index 0000000..d8684a6 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http1.transport.testHttp1Transport.html @@ -0,0 +1,37 @@ + + + + testHttp1Transport (handy_http_transport.http1.transport.testHttp1Transport) + + + + + + + + + + +
+
+

testHttp1Transport

A generic test to ensure that any Http1Transport implementation behaves +properly to start & stop, and process requests when running.

It's assumed that the given transport is configured to run on localhost, +port 8080, and return a standard 200 OK empty response to all requests.

version(unittest)
void
testHttp1Transport

Parameters

transport Http1Transport

The transport implementation to test.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.http2.html b/docs/ddoc/transport/handy_http_transport.http2.html new file mode 100644 index 0000000..e64fe6b --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.http2.html @@ -0,0 +1,35 @@ + + + + handy_http_transport.http2 (handy_http_transport.http2) + + + + + + + + + + +
+
+

handy_http_transport.http2

Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.interfaces.HttpTransport.html b/docs/ddoc/transport/handy_http_transport.interfaces.HttpTransport.html new file mode 100644 index 0000000..a102595 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.interfaces.HttpTransport.html @@ -0,0 +1,35 @@ + + + + HttpTransport (handy_http_transport.interfaces.HttpTransport) + + + + + + + + + + +
+
+

HttpTransport

Undocumented in source.
interface HttpTransport {}

Members

Functions

start
void start()
Undocumented in source.
stop
void stop()
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.interfaces.HttpTransport.start.html b/docs/ddoc/transport/handy_http_transport.interfaces.HttpTransport.start.html new file mode 100644 index 0000000..5ce5c5f --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.interfaces.HttpTransport.start.html @@ -0,0 +1,35 @@ + + + + HttpTransport.start (handy_http_transport.interfaces.HttpTransport.start) + + + + + + + + + + +
+
+

HttpTransport.start

Undocumented in source.
interface HttpTransport
void
start
()
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.interfaces.HttpTransport.stop.html b/docs/ddoc/transport/handy_http_transport.interfaces.HttpTransport.stop.html new file mode 100644 index 0000000..567653e --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.interfaces.HttpTransport.stop.html @@ -0,0 +1,35 @@ + + + + HttpTransport.stop (handy_http_transport.interfaces.HttpTransport.stop) + + + + + + + + + + +
+
+

HttpTransport.stop

Undocumented in source.
interface HttpTransport
void
stop
()
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.interfaces.html b/docs/ddoc/transport/handy_http_transport.interfaces.html new file mode 100644 index 0000000..e0ab3a7 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.interfaces.html @@ -0,0 +1,37 @@ + + + + handy_http_transport.interfaces (handy_http_transport.interfaces) + + + + + + + + + + +
+
+

handy_http_transport.interfaces

Undocumented in source.

Members

Functions

startInNewThread
Thread startInNewThread(HttpTransport transport)

Starts a new thread to run an HTTP transport implementation in, separate +from the calling thread. This is useful for running a server in the +background, like for integration tests.

Interfaces

HttpTransport
interface HttpTransport
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.interfaces.startInNewThread.html b/docs/ddoc/transport/handy_http_transport.interfaces.startInNewThread.html new file mode 100644 index 0000000..72114e3 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.interfaces.startInNewThread.html @@ -0,0 +1,37 @@ + + + + startInNewThread (handy_http_transport.interfaces.startInNewThread) + + + + + + + + + + +
+
+

startInNewThread

Starts a new thread to run an HTTP transport implementation in, separate +from the calling thread. This is useful for running a server in the +background, like for integration tests.

Thread
startInNewThread

Parameters

transport HttpTransport

The transport implementation to start.

Return Value

Type: Thread

The thread that was started.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.response_output_stream.HttpResponseOutputStream.areHeadersFlushed.html b/docs/ddoc/transport/handy_http_transport.response_output_stream.HttpResponseOutputStream.areHeadersFlushed.html new file mode 100644 index 0000000..7555e38 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.response_output_stream.HttpResponseOutputStream.areHeadersFlushed.html @@ -0,0 +1,36 @@ + + + + HttpResponseOutputStream.areHeadersFlushed (handy_http_transport.response_output_stream.HttpResponseOutputStream.areHeadersFlushed) + + + + + + + + + + +
+
+

HttpResponseOutputStream.areHeadersFlushed

Determines if the HTTP response headers have been flushed to the +underlying output stream.

struct HttpResponseOutputStream(S)
const
bool
areHeadersFlushed
()
if (
isByteOutputStream!S
)

Return Value

Type: bool

true if the headers have been flushed, false otherwise.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.response_output_stream.HttpResponseOutputStream.html b/docs/ddoc/transport/handy_http_transport.response_output_stream.HttpResponseOutputStream.html new file mode 100644 index 0000000..5a2d3b8 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.response_output_stream.HttpResponseOutputStream.html @@ -0,0 +1,41 @@ + + + + HttpResponseOutputStream (handy_http_transport.response_output_stream.HttpResponseOutputStream) + + + + + + + + + + +
+
+

HttpResponseOutputStream

A wrapper around a byte output stream that's used for writing HTTP response +content. It keeps a reference to the ServerHttpResponse so that when a +handler writes data to the stream, it'll flush the HTTP response status and +headers beforehand.

Constructors

this
this(S outputStream, ServerHttpResponse* response)
Undocumented in source.

Members

Functions

areHeadersFlushed
bool areHeadersFlushed()

Determines if the HTTP response headers have been flushed to the +underlying output stream.

writeHeaders
StreamResult writeHeaders()

Writes HTTP/1.1 status line and headers to the underlying output stream, +which is done before any body content can be written.

writeToStream
StreamResult writeToStream(ubyte[] buffer)

Writes the given data to the stream. If the referenced HTTP response's +status and headers haven't yet been written, they will be written first.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.response_output_stream.HttpResponseOutputStream.this.html b/docs/ddoc/transport/handy_http_transport.response_output_stream.HttpResponseOutputStream.this.html new file mode 100644 index 0000000..77d2053 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.response_output_stream.HttpResponseOutputStream.this.html @@ -0,0 +1,35 @@ + + + + HttpResponseOutputStream.this (handy_http_transport.response_output_stream.HttpResponseOutputStream.this) + + + + + + + + + + +
+
+

HttpResponseOutputStream.this

Undocumented in source.
struct HttpResponseOutputStream(S)
this
(,
ServerHttpResponse* response
)
if (
isByteOutputStream!S
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.response_output_stream.HttpResponseOutputStream.writeHeaders.html b/docs/ddoc/transport/handy_http_transport.response_output_stream.HttpResponseOutputStream.writeHeaders.html new file mode 100644 index 0000000..315d86e --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.response_output_stream.HttpResponseOutputStream.writeHeaders.html @@ -0,0 +1,36 @@ + + + + HttpResponseOutputStream.writeHeaders (handy_http_transport.response_output_stream.HttpResponseOutputStream.writeHeaders) + + + + + + + + + + +
+
+

HttpResponseOutputStream.writeHeaders

Writes HTTP/1.1 status line and headers to the underlying output stream, +which is done before any body content can be written.

struct HttpResponseOutputStream(S)
StreamResult
writeHeaders
()
if (
isByteOutputStream!S
)

Return Value

Type: StreamResult

The stream result of writing.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.response_output_stream.HttpResponseOutputStream.writeToStream.html b/docs/ddoc/transport/handy_http_transport.response_output_stream.HttpResponseOutputStream.writeToStream.html new file mode 100644 index 0000000..83b3012 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.response_output_stream.HttpResponseOutputStream.writeToStream.html @@ -0,0 +1,37 @@ + + + + HttpResponseOutputStream.writeToStream (handy_http_transport.response_output_stream.HttpResponseOutputStream.writeToStream) + + + + + + + + + + +
+
+

HttpResponseOutputStream.writeToStream

Writes the given data to the stream. If the referenced HTTP response's +status and headers haven't yet been written, they will be written first.

struct HttpResponseOutputStream(S)
StreamResult
writeToStream
(
ubyte[] buffer
)
if (
isByteOutputStream!S
)

Parameters

buffer ubyte[]

The buffer containing data to write.

Return Value

Type: StreamResult

The result of writing. If status and headers are written, the +number of bytes written will include that in addition to the buffer size.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/handy_http_transport.response_output_stream.html b/docs/ddoc/transport/handy_http_transport.response_output_stream.html new file mode 100644 index 0000000..0085e50 --- /dev/null +++ b/docs/ddoc/transport/handy_http_transport.response_output_stream.html @@ -0,0 +1,38 @@ + + + + handy_http_transport.response_output_stream (handy_http_transport.response_output_stream) + + + + + + + + + + +
+
+

handy_http_transport.response_output_stream

Undocumented in source.

Members

Structs

HttpResponseOutputStream
struct HttpResponseOutputStream(S)

A wrapper around a byte output stream that's used for writing HTTP response +content. It keeps a reference to the ServerHttpResponse so that when a +handler writes data to the stream, it'll flush the HTTP response status and +headers beforehand.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/index.html b/docs/ddoc/transport/index.html new file mode 100644 index 0000000..f5c1aeb --- /dev/null +++ b/docs/ddoc/transport/index.html @@ -0,0 +1,35 @@ + + + + index (index) + + + + + + + + + + +
+
+

index

Modules

handy_http_transport
module handy_http_transport
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/transport/script.js b/docs/ddoc/transport/script.js new file mode 100644 index 0000000..b47257e --- /dev/null +++ b/docs/ddoc/transport/script.js @@ -0,0 +1,180 @@ +window.addEventListener("load", function() { + + var lineWrappers = document.querySelectorAll(".with-line-wrappers"); + for(var i = 0; i < lineWrappers.length; i++) { + var l = lineWrappers[i]; + + var codeblock = document.createElement("div"); + codeblock.className = "codeblock"; + l.parentNode.insertBefore(codeblock, l); + + var header = document.createElement("header"); + codeblock.appendChild(header); + codeblock.appendChild(l); + + var btn = document.createElement("button"); + btn.setAttribute("type", "button"); + var canCopyToClipboard = document.queryCommandSupported("copy"); + btn.addEventListener("click", (function(l) { return function() { + document.body.classList.add("hide-line-numbers"); + window.getSelection().selectAllChildren(l); + if(canCopyToClipboard) + if(!document.execCommand("copy")) { + alert("copy failed, try ctrl+c manually"); + } + };})(l)); + btn.textContent = canCopyToClipboard ? "Copy to Clipboard" : "Select All"; + header.appendChild(btn); + + var btn = document.createElement("button"); + btn.setAttribute("type", "button"); + btn.addEventListener("click", function() { + document.body.classList.toggle("hide-line-numbers"); + }); + btn.textContent = "Toggle Line Numbers"; + header.appendChild(btn); + } + + /* // still sucks in firefox! + document.addEventListener("copy", function(event) { + document.body.classList.add("hide-line-numbers"); + }); + */ + + document.body.addEventListener("mouseover", function(event) { + if(event.target.hasAttribute("data-ident")) { + var all = document.querySelectorAll("[data-ident=\""+event.target.getAttribute("data-ident")+"\"]"); + for(var i = 0; i < all.length; i++) + all[i].className += " active"; + } + }); + document.body.addEventListener("mouseout", function(event) { + if(event.target.hasAttribute("data-ident")) { + var all = document.querySelectorAll("[data-ident=\""+event.target.getAttribute("data-ident")+"\"]"); + for(var i = 0; i < all.length; i++) + all[i].className = all[i].className.replace(" active", ""); + } + }); + /* + document.body.addEventListener("dblclick", function(event) { + if(event.target.hasAttribute("data-ident")) { + location.href = "/" + event.target.getAttribute("data-ident"); + } + }); + */ + + var sn = document.getElementById("source-navigation"); + if(sn) { + sn.addEventListener("click", function(event) { + if(event.target.tagName != "A" || event.target.className == "docs") + return true; + if(event.target.nextSibling) { + var s = event.target.nextSibling; + if(s.style.display == "" || s.style.display == "none" || s.className.indexOf("search-hit") != -1) { + s.style.display = "block"; + var items = s.getElementsByTagName("ul"); + var i; + for(i = 0; i < items.length; i++) + items[i].style.display = ""; + items = s.getElementsByTagName("li"); + for(i = 0; i < items.length; i++) + items[i].style.display = ""; + } else + s.style.display = ""; + } + + //var id = event.target.href.substring(event.target.href.indexOf("#") + 1); + //sn.style.marginTop = (document.getElementById(id).offsetTop - event.target.offsetTop + 16) + "px"; + }); + + var search = document.createElement("input"); + search.setAttribute("type", "search"); + function searchHelper() { + var regex = new RegExp(search.value, "i"); + var items = document.querySelectorAll("#source-navigation a[href^=\"#\"]"); + var stxt = search.value; + for(var i = 0; i < items.length; i++) { + var a = items[i]; + if(stxt.length && regex.test(a.textContent)) { + var p = a.parentNode; + while(p.tagName != "DIV") { + if(p.tagName == "LI") + p.style.display = "list-item"; + else + p.style.display = "block"; + p.className += " search-hit"; + p = p.parentNode; + } + } else { + var p = a.parentNode; + if(stxt.length == 0) { + p.style.display = ""; + while(p.tagName != "DIV") { + p.style.display = ""; + p = p.parentNode; + } + } else + p.style.display = "none"; + p.className = p.className.replace(" search-hit", ""); + } + } + } + search.addEventListener("keyup", searchHelper); + sn.insertBefore(search, sn.firstChild); + } + + /* + function updateDynamicStyle() { + var thing = document.getElementById("page-content"); + var newStyle = document.getElementById("dynamic-style"); + if(!newStyle) { + newStyle = document.createElement("style"); + newStyle.setAttribute("id", "dynamic-style"); + newStyle.type = "text/css"; + document.head.appendChild(newStyle); + } + + var maxContentWidth = window.innerWidth; + // 800 is the threshold for putting nav vertically + if(maxContentWidth < 800) + maxContentWidth = 800; + else + maxContentWidth = + document.body.offsetWidth - + document.getElementById("page-nav").offsetWidth - + document.getElementById("page-nav").offsetLeft - + 64; + + // sanity check lol + if(maxContentWidth < 800) + maxContentWidth = 800; + + newStyle.innerHTML = ".member-list:not(.constructors) dt .simplified-prototype:hover { width: " + (thing.offsetWidth - 32) + "px; } #page-content pre.d_code, #page-content .overload-option, #page-content .member-list dt { max-width: " + (maxContentWidth) + "px; }"; + } + + updateDynamicStyle(); + + window.onresize = updateDynamicStyle; + */ + + // Disable line numbers in IE because the copy/paste with them sucks - it includes all line numbers + // in the middle making it too hard to use. Copy/paste is more important than line displays. + if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) { + var items = document.querySelectorAll(".with-line-wrappers"); + for(var a = 0; a < items.length; a++) + items[a].className = items[a].className.replace("with-line-wrappers", ""); + } + + // Keybind to focus search bar on '?' keydown. + document.addEventListener("keydown", (event) => { + if (event.key == "?") { + var searchBox = document.getElementsByName("searchTerm")[0]; + // Hack so the '?' doesn't auto-populate in the search bar. + this.setTimeout(() => { + searchBox.focus(); + }, 100); + } + }); + + +}); diff --git a/docs/ddoc/transport/search-docs.html b/docs/ddoc/transport/search-docs.html new file mode 100644 index 0000000..522aab4 --- /dev/null +++ b/docs/ddoc/transport/search-docs.html @@ -0,0 +1,26 @@ + + + + + + + + diff --git a/docs/ddoc/transport/search-docs.js b/docs/ddoc/transport/search-docs.js new file mode 100644 index 0000000..768a988 --- /dev/null +++ b/docs/ddoc/transport/search-docs.js @@ -0,0 +1,421 @@ +/* + This is the source for offline web search; it will be embedded + in a generated search page along with the search index xml. + + You will almost certainly want to gzip this when delivering it! + Also be sure it has the proper cache headers to give a remotely + acceptable performance result. Configure the web server to do + both these. When storing it for offline usage, you might just + leave it unzipped though for convenience of use without a web server. + + Tip to the end user: you might want to open this page and keep it + open in a reused tab. + + The file generated should be the skeleton.html with the search + index in a + + + + + + +
+
+
+ +
+ + + + + diff --git a/docs/ddoc/transport/style.css b/docs/ddoc/transport/style.css new file mode 100644 index 0000000..e6754c4 --- /dev/null +++ b/docs/ddoc/transport/style.css @@ -0,0 +1,1661 @@ +/* a few things you can change to pick a basic color scheme */ + +/* + FIXME: have some automatic magic for choosing light vs dark and picking an accent color. + + Ideally, we'll get to the point where you can just say: + project name + project logo + project links + + light/dark scheme + project color + + and it will adapt the rest to a good-enough state automatically. +*/ + +#page-header, +#suggestion-box { + background-color: rgb(49, 57, 176); + background-color: rgb(49, 110, 47); + background-color: rgb(176, 57, 49); +} + +#page-header, +#suggestion-box, +#page-footer, +#page-nav { + border-color: rgb(41, 48, 148); + border-color: rgb(41, 110, 48); + border-color: rgb(148, 48, 41); + border-color: rgb(204, 204, 204); +} + +#page-nav { + background-color: rgb(245, 245, 255); + background-color: rgb(245, 250, 245); + background-color: rgb(245, 245, 245); + +} + +a:link { + color: #0000ff; + color: #bb0000; +} + +a:visited { + color: #004488; + color: #bb0044; +} + + +body { + font-family: "Roboto Slab", sans-serif; + tab-size: 4; +} + +h1, #page-nav a, .quickindex a.xref, .breadcrumb, dt > a { + font-family: Consolas, "Bitstream Vera Sans Mono", "Andale Mono", Monaco, "DejaVu Sans Mono", "Lucida Console", monospace; +} + + +/* done with basic colors */ + +html { + font-size: 100%; +} + +h1 { + font-size: 2.2rem; +} + +h2 { + font-size: 1.6rem; + margin-top: 1.5em; + font-family: "Roboto Slab", sans-serif; + font-weight: normal; +} + +h3 { + font-size: 1.26rem; +} + +body { + /*font-family: sans-serif;*/ + color: #111; + background-color: white; +} + +.big-o { + white-space: nowrap; +} + +.member-list .dt, +.overload-option, +pre { + box-sizing: border-box; + overflow: auto; + max-width: 800px; /* The script sets the real one */ + max-width: calc(80vw - 16em - 4em); +} + + +#page-header { + height: 32px; + line-height: 32px; + margin-bottom: 6px; + border-bottom-width: 1px; + border-bottom-style: solid; + color: white; + margin: -0.5em; + padding: 0em 0.5em; + margin-bottom: 0.0em; + overflow: hidden; +} + +#page-header span { + vertical-align: top; +} + +#page-header #logotype { + float: left; +} + +#page-header #search { + float: right; +} + +#page-header nav { + display: inline-block; + margin-left: 2em; + vertical-align: top; +} + +#page-header nav a { + display: inline-block; + color: white; + font-weight: bold; + margin-right: 2em; +} + +#page-body { + clear: both; + margin: 0px auto; + max-width: 1200px; + min-height: 800px; + min-height: calc(100vh - 3em - 32px); + display: flex; + box-sizing: border-box; +} + +#page-body #page-nav { + flex: 0 0 16em; + width: 16em; + min-width: 16em; + max-width: 16em; + order: 1; + padding-top: 0.25em; + padding-left: 1em; + padding-right: 0px; + min-height: 800px; + min-height: calc(100vh - 3em - 32px); + + border-right-style: solid; + border-right-width: 1px; + border-left-style: solid; + border-left-width: 1px; + box-sizing: border-box; +} + +#page-body #page-content { + flex: 1 1 auto; + order: 2; + padding: 0.25em; + padding-left: 1.75em; + box-sizing: border-box; + max-width: 960px; +} + +@media all and (max-width: 800px) { + #page-body { + display: block; + min-height: 0px; + } + + #page-body #page-nav { + display: block; + width: auto; + max-width: 800px; + border-top-style: solid; + border-top-width: 1px; + border-right: none; + min-height: 0px; + } + + #page-body #page-content { + padding-left: 0.25em; + } + + .member-list .dt, + .overload-option, + pre { + box-sizing: border-box; + overflow: auto; + max-width: 800px; /* The script sets the real one */ + max-width: calc(100vw - 2em); + } + + #page-header { + line-height: 20px; + height: auto; + min-height: 32px; + overflow: visible; + } + #page-header::after { + content: ' '; + display: block; + clear: both; + } +} + +#page-footer { + margin-top: 0em; + padding-top: 2em; + color: #999; + font-size: 0.9rem; + text-align: center; + border-top-style: solid; + border-top-width: 1px; +} + +a:link { + text-decoration: none; +} + +a:link:hover { + text-decoration: underline !important; /* important so it overrides even id level things on non-hover */ +} + +/* +pre.d_code { background-color: #fdf6e3; color: #002b36; padding: 0.25em; border: solid 1px #ccc; } +.d_code .kwrd { color: #b58900; font-weight: bold; } +.d_code .com { color: #666; font-style: italic; } +.d_code .num { color: #dc322f; font-weight: normal; } +.d_code .str { color: #2aa198; font-style: italic; } +.d_code .op { color: #586e75; font-weight: bold; } +.d_code .type { color: #268bd2; font-weight: bold; } +.d_code .cons { color: #859900; font-weight: bold; } + +.highlighted .kwrd { color: #b58900; font-weight: bold; } +.highlighted .com { color: #666; font-style: italic; } /* #93a1a1; * / +.highlighted .num { color: #dc322f; font-weight: normal; } +.highlighted .str { color: #2aa198; font-style: italic; } +.highlighted .op { color: #586e75; font-weight: bold; } +.highlighted .type { color: #268bd2; font-weight: bold; } +.highlighted .cons { color: #859900; font-weight: bold; } +*/ + +/* .member-list p, */ +#table-of-contents, +.enum-members, +.documentation-comment .tip, +.documentation-comment .note, +.documentation-comment .warning, +.documentation-comment .pitfall, +.documentation-comment li, +.documentation-comment p { + /* white-space: pre-line; */ + /* max-width: 74ch; */ + /*font-size: 1.1rem;*/ + font-size: 1.0rem; + line-height: 1.5; +} + +/* +.parameter-item::after { + content: ','; +} + +.parameter-item:last-child::after { + content: ''; +} +*/ + +.aggregate-declaration { + margin: 1em; +} + +.aggregate-member { + padding-left: 2em; +} + +/* +.aggregate-member::after { + content: ";"; +} +*/ + +.aggregate-member > a { + color: inherit; +} + +.template-constraint-expression, +.parameter-item { + padding-left: 2em; +} + + +/* +ol.overloads { + margin-bottom: -1px; + white-space: nowrap; +} + +ol.overloads::before { + content: "Overloads: "; +} + +ol.overloads li { + display: inline-block; + border: solid 1px #ccc; + list-style-position: inside; + text-align: center; + width: 5em; +} + +ol.overloads li.overload-option { + background-color: #eee; +} + +ol.overloads li a { + display: block; +} + +ol.overloads li.active-overload-option { + border-bottom: solid 1px white; +} + +ol.overloads + .aggregate-prototype, +ol.overloads + .function-prototype { + margin-top: 0px; +} +*/ + +.aggregate-prototype #help-link, +.function-prototype #help-link { + border-radius: 100%; + position: absolute; + top: -0.5em; + right: -0.5em; + display: block; + border: solid 1px #ccc; + background-color: white; + width: 1em; + height: 1em; + text-align: center; + font-size: 1.1rem; + padding-bottom: 3px; +} + +.aggregate-prototype #help-link:hover, +.function-prototype #help-link:hover { + text-decoration: none; + background-color: #ccc; +} + +.function-prototype .attributes { + color: #666; +} + +.declaration-prototype, +.aggregate-prototype, +.function-prototype { + border: solid 1px #ccc; + padding: 2em; + margin: 1em; + font-family: monospace; + position: relative; +} + +.declaration-prototype { + padding: 3em 2em; +} + +.parameters-list:empty { + display: none; +} + +/* +.parameters-list .parameters-list { + display: inline; +} +*/ + +.toplevel.parameters-list { + display: table; +} + +.toplevel.parameters-list > .parameter-item { + display: table-row; +} + +.toplevel.parameters-list > .parameter-item > *:first-child { + padding-left: 2em !important; +} + +.toplevel.parameters-list > .parameter-item + .comma { + display: none; +} + +.toplevel.parameters-list > .parameter-item > *:last-child::after { + content: ","; +} +.toplevel.parameters-list > .parameter-item:last-of-type > *:last-child::after { + content: ""; +} + +.parameter-attribute { + padding-left: 1em; +} + +.toplevel.parameters-list > .parameter-item .parameter-type-holder, +.toplevel.parameters-list > .parameter-item .parameter-name, +.toplevel.parameters-list > .parameter-item .parameter-default-value { + display: table-cell; + padding: 0px 0.25em; +} + +.toplevel.parameters-list > .parameter-item:hover { + background-color: #f8f8f8; +} + +.parameter-descriptions .parameter-name { + margin-right: 1.5rem; + font-weight: bold; + padding: 0.25ex 0.75ex; +} + +.parameter-descriptions dd { + margin-left: 1.5em; +} + +.parameter-descriptions dd p:first-child { + margin-top: 0.5em; +} + +.parameter-descriptions dt:not(:first-child) { + margin-top: 1.5em; +} + +.codeblock { + border: solid 1px #ccc; + padding: 0; + margin: 0; +} + +.codeblock header { + background-color: #e8e8e8; + padding: 0; + display: flex; + justify-content: flex-end; +} + +.codeblock header:before { + display: inline-block; + content: "Example"; + justify-content: flex-start; + flex-grow: 1; + padding: 0.25em 1em; + font-weight: bold; +} + +.codeblock header button { +/* TODO: add :before class with icons here (copy, line numbers) */ + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + margin: 0; + padding: 0 1em; + background-color: transparent; + border: none; + border-left: 1px solid #ccc; + cursor: pointer; +} + +.codeblock header button:hover { + background-color: rgba(255, 255, 255, 0.5); +} + +.codeblock header + pre { + border: none; + border-top: solid 1px #ccc; + margin: 0; + padding: 1em 0; + max-width: unset !important;; +} + +.hide-line-numbers .codeblock .with-line-wrappers, +.codeblock pre.d_code:not(.with-line-wrappers) { + padding: 1em; +} + +.codeblock .with-line-wrappers .br { + margin-right: 1em; +} + +.documentation-comment p { + hyphens: auto; +} + +.declaration-prototype, .aggregate-prototype, .function-prototype { + margin-left: 0; + margin-right: 0; +} + + + +tt.D, .inline-code { + color: black; + font-weight: 500; + background-color: #f2f2f2; + padding: 0px 0.5ex; + border-radius: 2px; +} + + +/* +.toplevel.parameters-list > .parameter-item > .parameter-type-holder { + text-align: right; +} + +.toplevel.parameters-list > .parameter-item > .parameter-type-holder > .parameter-type { + text-align: left; + display: inline-block; +} +*/ + +.function-prototype .return-type, .function-prototype .function-name { + display: inline; +} + +.function-name::before { + content: ' '; +} + +.function-name { + /*color: #008888;*/ +} + +.template-parameters[data-count="0"], +.template-parameters[data-count="0"] ~ .runtime-parameters[data-count="0"], +.template-parameters[data-count="0"] ~ .runtime-parameters[data-count="0"] > .parameters-list { + display: inline; +} + +.parameters-list:empty { + display: inline; +} + +.type-constructor, +.builtin-type { + text-decoration: none; + color: #004400 !important; + /*color: green !important; + font-weight: bold;*/ +} + +.kwrd, +.highlighted-keyword, +.lang-feature, +.storage-class { + text-decoration: none; + color: #026 !important; +} + +[data-ident].active { + outline: solid 1px red; +} + +table.enum-members { + border-collapse: collapse; + border: solid 1px #ccc; + min-width: 60%; +} + +.enum-members th, +.enum-members td { + border: solid 1px #ccc; + margin: 0px; + padding: 0.25em 0.5em; +} + +.enum-members th { + text-align: left; + color: #888; +} + +.enum-members td { + vertical-align: top; +} + +.enum-members td p:first-child { + margin-top: 0px; +} + +.enum-members .enum-member-name { + font-weight: bold; + color: inherit; +} + +.enum-members .enum-member-value { + display: block; + color: #666; +} + +.enum-members .enum-disabled { + font-style: italic; +} + +.enum-members .enum-deprecated { + margin-bottom: 1em; +} + +.enum-members .enum-deprecated > span.deprecated-label { + color: red; +} + +.enum-members .enum-attributes { + margin-top: 1em; +} + +.enum-member .enum-attributes:empty { + display: none; +} + +.enum-members tr.enum-member > td:nth-child(2) > div:only-child:empty:before { + display: inline; + content: "undocumented"; + color: rgba(0, 0, 0, 0.4); + font-style: italic; +} + +*:target { + background: #ffffbb; +} + +.breadcrumbs { + margin: 1em; +} + +.breadcrumbs a::before { + content: ' \00bb\a0'; +} + +.parameter-name { + font-weight: bold; +} + +.symbol-reference, +.return-type, +.parameter-type { + font-family: monospace; +} + +.phobos-booktable { + border-collapse: collapse; + margin-bottom: 1.5em; +} + +.phobos-booktable tt.D { + font-weight: bold; + background-color: transparent; +} + +.phobos-booktable caption { + text-align: left; +} + +.phobos-booktable tr { + border-bottom: solid 1px #ccc; +} + +.phobos-booktable tr:hover { + background-color: #fafafa; +} + +.phobos-booktable { + border-top: solid 2px black; + border-bottom: solid 2px black; +} + +.phobos-booktable tr:first-child:has(th) { + border-bottom: solid 1px black; +} + +.phobos-booktable th { + text-align: left; + padding-top: 0.3em; + padding-bottom: 0.3em; +} + +.phobos-booktable td:first-child { + padding-top: 0.3em; + padding-bottom: 0.3em; + padding-right: 1em; +} + +.phobos-booktable td:not(:last-child), +.phobos-booktable th:not(:last-child) { + padding-right: 1em; +} + +.quickindex .phobos-booktable td:last-child a { + padding-right: 1.2em; +} + +.current.breadcrumb { + color: inherit; + text-decoration: none; +} + +.andand-right { + display: inline; +} + +.oror-right { + display: inline; +} + +.parenthetical-expression > .parenthetical-expression-contents > .andand-left, +.parenthetical-expression > .parenthetical-expression-contents > .oror-left { + display: inline; +} + +/* +.parenthetical-expression > .parenthetical-expression-contents > .oror-left:first-child { + display: block; +} +*/ + + +.template-constraint-expression .parenthetical-expression { + display: block; + margin-left: 1em; +} + +.oror-left > .andand-left, +.oror-left > .andand-right { + display: inline; +} + +.aggregate-members:empty::after { + content: "This aggregate has no documented members available."; +} + +h1 .entity-name { + font-family: monospace; +} + +.other-section h3 { + font-size: 1rem; + margin-bottom: 0.25em; +} + +.other-section h3 + p { + margin-top: 0.25em; +} + +.function-prototype .in-contract, +.function-prototype .out-contract { + display: none; + white-space: pre; +} + +.note { + margin: 1em; + padding: 0.5em; + background-color: #f0f0ff; + border: solid 1px #ccc; + clear: both; +} + +/* +.note::before { + color: #000066; + font-weight: bold; + content: "Note: "; +} +*/ + +.warning { + margin: 1em; + padding: 0.5em; + background-color: #fffff0; + border: solid 1px #ccc; + clear: both; +} + +.pitfall { + margin: 1em; + padding: 0.5em; + background-color: #fff0f0; + border: solid 1px #ccc; + clear: both; +} + +.tip { + margin: 1em; + padding: 0.5em; + background-color: #f0fff0; + border: solid 1px #ccc; + clear: both; +} + +.sidebar { + float: right; + margin: 1em; + margin-top: 2px; + padding: 0.25em; + background: #f3f3f3; + border: solid 1px #ccc; + width: 20%; + min-width: 30ch; + clear: right; +} + +h2 { + clear: both; +} + +.sidebar > *:first-child { + margin-top: 0px; +} + +/* I want to clear floats. This leaves a gap about the size of a blank line + too, but that doesn't bother me (actually, I kinda like a small gap at the + bottom. */ +#page-content::after { + clear: both; + content: '\a0'; + display: block; +} + +tt.D, +.inline-code { + color: black; + font-weight: 500; + background-color: #f2f2f2; + padding: 0px 0.125em; +} + +#page-nav .type-separator { + text-transform: capitalize; + display: block; + border-bottom: solid 1px #ccc; + margin-top: 1em; + margin-bottom: 0.25em; +} + +#page-nav a { + display: block; + box-sizing: border-box; + padding: 1px 0.25em 1px 0.5em; + text-overflow: ellipsis; + overflow: hidden; + font-family: "Roboto Slab", sans-serif; +} + +#page-nav a:hover { + position: relative; + overflow: visible; + z-index: 10; + background-color: rgb(245, 245, 245); + width: max-content; +} + +#page-nav a.parent { + font-weight: bold; + font-size: 1.1rem; + line-height: 0.9; + overflow: visible; +} + +#page-nav a.parent:first-child { + margin-top: 0.75em; +} + +#page-nav a.parent + a.parent::before { + content: "."; +} + +#page-nav a.current { + font-weight: bold; + color: inherit; +} + +pre[data-language=console], +pre.console { + background-color: #222; + color: #eee; + padding: 0.5em; + border: solid 1px #ccc; +} + +#more-link { + display: block; + font-weight: bold; + font-size: 1.1rem; + color: blue; +} + +.member-list dd + dt { + border-top: solid 1px #ccc; + padding-top: 0.5em; + margin-top: 0.5em; +} + +/* +.member-list dd { + max-height: 4em; + overflow: hidden; + text-overflow: ellipsis; +} +*/ + +.member-list dt a { + overflow: hidden; + text-overflow: ellipsis; +} + +.member-list dt .simplified-prototype { + font-family: monospace; + font-size: 90%; + color: #333; + white-space: nowrap; + text-overflow: ellipsis; + text-overflow: '[...]'; /* only Firefox supports this but i like it */ + overflow: hidden; + border: solid 1px white; +} + +.member-list dt .simplified-prototype:hover { + background-color: white; + position: relative; + z-index: 5; + width: 800px; + width: calc(100vw - 16em); + border: solid 1px #eee; + box-shadow: 1px 1px 1px #ccc; +} + +@media screen and (min-width: 640px) { + .member-list dt { + float: left; + clear: left; + width: 20em; + box-sizing: border-box; + padding-right: 1em; + } + + .member-list dd, + .member-list dd + dt { + border-top: solid 1px #ccc; + padding-top: 0.5em; + margin-top: 0em; + } + + .member-list dd p:first-child { + margin-top: 0px; + } + + .member-list dd:first-of-type { + border-top: none; + padding-top: 0px; + } + + .member-list dd { + margin: 0px; + margin-left: 20em; + } + + .member-list dd::after { + content: '\a0'; + height: 0.5em; + clear: both; + display: block; + } +} + +.member-list.articles dt, +.member-list.constructors dt { + float: none; + clear: none; + margin: 0em; + width: auto; + border: none; +} + +.member-list.articles dd, +.member-list.constructors dd { + float: none; + clear: none; + margin: 1em 0em; + width: auto; + border: none; +} + +.member-list.articles dd, +.member-list.constructors dd { + padding-left: 2em; +} + +.member-list dt a { + display: block; +} + +#suggestion-box { + display: inline-block; + color: white; + font-weight: bold; + border: solid 2px black; + border-radius: 8px 8px 0px 0px; + position: fixed; + left: 1em; + bottom: 0em; + padding: 0.25em 0.5em; +} + +.synopsis { + margin: 2em 0px; +} + +/* If it was successfully looked up in an xref, no need to highlight anymore */ +a.xref:link span[data-ident].active { + border: none; +} + +#table-of-contents { + border: solid 1px #ccc; + margin: 1em; + padding: 1em; + padding-left: 0em; /* the list inside can handle this */ +} + +.parent-prototype { + font-size: 0.9rem; + padding-bottom: 1em; +} + +.parent-prototype::after { + content: " {"; +} + +.parent-prototype + div { + padding-left: 1em; +} + +.parent-prototype + div::after { + content: "}"; + display: block; + font-size: 0.9rem; + padding-top: 1em; + margin-left: -1.33em; /* 1/(3/4) */ +} + +.search-result::after { + content: '(Search Score: ' attr(data-score) ')'; + font-size: 0.9rem; +} + +table.std_math { + min-width: 25%; + border: solid 1px black; + border-collapse: collapse; + margin: 2em; +} + +table.std_math td, table.std_math th { + border: solid 1px #ccc; + text-align: left; + padding: 0.25em; +} + +table.std_math.special-values th { + border-bottom: solid 2px #000; +} + +table.std_math.special-values caption { + text-align: left; + font-weight: 700; +} + +.nan { + font-family: monospace; + color: red; +} + +.overload-option, +.overload-signature { + font-family: monospace; +} + +.block-code, +.d_code, +.annotated-prototype { + font-size: 1rem; +} + +.annotated-prototype .overloads { + display: block; + padding: 0px; +} + +.annotated-prototype .overloads li { + display: block; + width: auto; + padding: 0em 0.5em; + text-align: left; + overflow: hidden; + + margin: 0; +} + +.member-list .dt, .overload-option, pre { + max-width: unset; +} + +.annotated-prototype .overloads li.active-overload-option { + border: ridge 2px #ccc; +} + +.annotated-prototype .overloads li.active-overload-option .overload-signature { + white-space: nowrap; + border-bottom: dotted 1px #999; + display: block; +} + +.annotated-prototype .overloads li.overload-option { + border: solid 1px #ccc; + background-color: #eee; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.annotated-prototype .overloads li.ditto-option::before, +.annotated-prototype .overloads li.active-overload-option .overload-signature::before, +.annotated-prototype .overloads li.overload-option::before { + display: inline-block; + width: 6em; + width: 9ch; + font-size: 0.9rem; + vertical-align: baseline; +} + +.annotated-prototype .overloads li.overload-option::before { + content: "Overload: "; +} + +.annotated-prototype .overloads li.active-overload-option .overload-signature::before { + content: "Viewing: "; +} + +.annotated-prototype .overloads li.ditto-option::before { + content: "Related: "; +} + +.annotated-prototype li .declaration-prototype, +.annotated-prototype li .aggregate-prototype, +.annotated-prototype li .function-prototype { + border: none; + padding: 0px; +} + +.annotated-prototype li .declaration-prototype { + padding: 2em 0px; +} + +#page-nav ul { + margin: 0px; + padding: 0px; + list-style: none; +} + +.parameter-name > a[href^="#"], +a.parameter-name[href^="#"] { + color: inherit; +} + + + +/* adrdox special syntax styles */ + +.small-table { + border-collapse: collapse; + min-width: 10em; +} + +.small-table td, +.small-table th { + border: solid 1px #ccc; + padding: 0.25em; +} + +.small-table thead th { + border-bottom: solid 2px #999; +} + +.small-table tbody th, +.small-table.two-axes thead th:first-child { + border-right: solid 2px #999; +} + +.small-table.two-axes td, +.small-table.two-axes th { + text-align: center; + vertical-align: middle; +} + +.adrdox-sample { + display: table; + width: 100%; +} + +.adrdox-sample > div { + display: table-row; +} + +.adrdox-sample > div > * { + display: table-cell; + width: 50%; + vertical-align: top; + border-bottom: dashed 1px #ccc; + padding: 0.25em; + padding-bottom: 0.5em; +} + +.adrdox-sample > div > pre { + border-right: dashed 1px #ccc; +} + +.adrdox-sample > div > pre::before, +.adrdox-sample > div > div::before { + display: block; + font-style: italic; + border-bottom: dashed 1px #ccc; + margin-bottom: 0.5em; + font-family: sans-serif; + font-size: 1rem; + padding: 0px; +} + +.adrdox-sample > div > pre::before { + content: 'Doc source:'; +} +.adrdox-sample > div > div::before { + content: 'Rendered:'; +} + +blockquote { + margin: 1em; + padding: 1em; + border-left: 0.5em solid #ccc; + color: #333; +} + +pre.d_code, +.block-code:not([data-language=""]):not([data-language="pre"]) { + background-color: #fcfcfc; + padding: 0.25em; + border: solid 1px #ccc; + position: relative; +} + +.block-code:not([data-language=""]):not([data-language="pre"])::before { + content: attr(data-language); + display: block; + text-transform: capitalize; + font-size: 0.9rem; + padding: 0px 2px; + border: solid 1px #999; + border-top: none; + border-radius: 0px 0px 0.25em 0.25em; + background-color: #f0f0f0; + float: right; + margin: 0px; + margin-top: -0.25em; + margin-top: calc(-0.25em - 1px); +} +.type, +.highlighted-type { + color: green; + /* font-weight: bold; */ +} +.num, +.highlighted-number { + color: #dc322f; +} +.str, +.highlighted-string { + color: red; +} +.com, +.highlighted-comment { + color: blue; +} +.highlighted-preprocessor-directive { + color: #cd00cd; +} +.highlighted-identifier, +.highlighted-tag { + color: #008888; +} +.highlighted-tag-name { + color: #859900; +} +.highlighted-entity { + color: #cd00cd; + text-decoration: none; + cursor: help; +} +.highlighted-named-constant, +.highlighted-attribute-name { + color: green; +} +.highlighted-attribute-value { + color: red; +} +.highlighted-python-indent { + background: linear-gradient(to right, #eee, transparent 3px) no-repeat; +} +.highlighted-python-indent:hover { + background: linear-gradient(to right, #ccc, transparent 3px) no-repeat; +} + +/* +.with-line-wrappers { + counter-reset: line_numbers; +} + +.with-line-wrappers span.br { + counter-increment: line_numbers; +} + +.with-line-wrappers span.br::before { + content: counter(line_numbers); +*/ +.with-line-wrappers .br { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + width: 3em; + width: 4ch; + display: inline-block; + color: #999; + border-right: solid 2px #ccc; + padding: 0px; + margin: 0px; + margin-right: 3px; + padding-right: 3px; + font-style: normal; + font-weight: normal; + background-color: transparent; + text-align: right; + white-space: pre; +} + +.hide-line-numbers .with-line-wrappers .br { + display: none; +} +.with-line-wrappers .br:target { + background: #ffffbb; +} + +.thousand-lines.with-line-wrappers .br { + width: 4em; + width: 5ch; +} +.ten-thousand-lines.with-line-wrappers .br { + width: 5em; + width: 6ch; +} + +#source-navigation { + position: fixed; + width: 15.5em; +} + +#source-navigation .list-holder { + width: 100%; + overflow: auto; + max-height: 80vh; +} + +#source-navigation .list-holder ul { + padding-left: 1em; +} + +/* hide nested decls as it is too much... */ +#source-navigation .list-holder ul > li > ul { + display: none; +} + +/* ...but show top-level decls under the module cuz no reason not to */ +#source-navigation .list-holder > ul > li > ul { + display: block; +} + +#source-navigation li { + white-space: nowrap; +} + +#source-navigation a { + display: inline; +} + +.postcondition { + color: blue; + font-family: monospace; + font-size: 0.9rem; +} +.postcondition::before { + content: "Post: "; + font-style: italic; + color: black; +} + +.user-table { + border-top: solid 2px black; + border-collapse: collapse; +} + +.user-table tr:nth-of-type(1) th { + border-bottom: solid 1px black; + text-align: left; +} + +.user-table td { + border-bottom: solid 1px #ccc; + vertical-align: top; + padding: 4px; +} +.user-table th { + padding: 4px; +} + +.user-table.two-axes tr + tr th:first-child { + border-bottom: solid 1px #ccc; +} + +.user-table.two-axes th:first-child { + border-right: solid 1px black; + text-align: right; +} + +.allocator-table td:first-child tt { + background-color: transparent; + white-space: nowrap; + font-weight: bold; +} + +.header-anchor { + color: inherit !important; +} + +#members + h3, +.member-list + h3, +h3.member-list-header { + border-bottom: solid 1px #333; + text-transform: capitalize; +} + +#members + h4, +.member-list + h4, +h4.member-list-header { + font-weight: normal; + text-transform: capitalize; + text-decoration: underline; +} + + +tr.leading-row th { + border-bottom: solid 2px black; +} + +.lambda-expression * { + display: inline !important; + padding: 0px !important; + margin: 0px !important; +} + +.footnote-ref a {} +.footnote-ref abbr { + font-variant: none; + text-decoration: none; + cursor: help; +} + +.side-by-side { + table-layout: fixed; + border: none; + width: 100%; +} + +.side-by-side > tbody > tr > td { + vertical-align: top; +} + +/* +tt.D { + font-weight: bold; + background: transparent; + color: inherit; +} +*/ + +tt.D.highlighted *:not(a) { + font-weight: inherit; + color: inherit; +} +tt.D.highlighted a { + color: #500000; +} + +.date-posted { + font-size: 0.9rem; + font-style: italic; +} + +.token-string-literal { + font-style: italic; +} +.token-string-literal:hover { + background-color: rgba(255, 0, 0, 0.05); +} + +.specially-highlighted { + background-color: yellow; + background-color: rgba(255, 255, 0, 0.5); +} + +.console .specially-highlighted { + background-color: rgba(255, 255, 0, 1.0); + color: black; +} + +.quickindex { + background: #f5f5f5; + max-width: 760px; +} + +.quickindex .phobos-booktable { + width: 100%; +} + +.leading-row { + font-style: italic; + background-color: rgb(228, 233, 239); +} + +.leading-row th { + padding-left: 1.5em; +} + +.quickindex td, .quickindex th { + padding-left: 0.3em; +} + +.undocumented-note { + color: #999; +} + +.deprecated-decl { + color: #c00; + font-weight: bold; +} + +.conditional-compilation-attributes { + font-size: 90%; +} + +@media (prefers-color-scheme: dark) { + body { + color: #ddd; + background-color: black; + } + + a:link, a:visited { + color: #00aaff !important; + } + + #page-nav { + background-color: #333 !important; + } + + tt.D, + .inline-code { + background-color: #444; + color: #eee; + } + + .block-code:not([data-language=""]):not([data-language="pre"]), + pre.d_code { + background-color: #444; + color: #eee; + } + + .tip { + background-color: #306630; + } + + .pitfall { + background-color: #663030; + } + + .warning { + background-color: #666630; + } + + .note { + background-color: #3333aa; + } + + .sidebar { + background-color: #555; + } + + .member-list dt .simplified-prototype { + color: #aaa; + border-color: black; + } + + .member-list dt .simplified-prototype:hover { + background-color: black; + border-color: #555; + } + + .highlighted-comment, + .com { + color: #0ff !important; + } + + .kwrd, + .highlighted-keyword, + .lang-feature, + .storage-class { + color: #8ff !important; + } + + .type-constructor, + .builtin-type { + color: #00cc00 !important; + } + + .type, + .highlighted-type { + color: lime; + } +} + diff --git a/docs/ddoc/websockets/handy_http_websockets.components.WebSocketBinaryMessage.conn.html b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketBinaryMessage.conn.html new file mode 100644 index 0000000..88aa382 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketBinaryMessage.conn.html @@ -0,0 +1,35 @@ + + + + WebSocketBinaryMessage.conn (handy_http_websockets.components.WebSocketBinaryMessage.conn) + + + + + + + + + + +
+
+

WebSocketBinaryMessage.conn

Undocumented in source.
struct WebSocketBinaryMessage
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.components.WebSocketBinaryMessage.html b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketBinaryMessage.html new file mode 100644 index 0000000..49fe9a1 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketBinaryMessage.html @@ -0,0 +1,35 @@ + + + + WebSocketBinaryMessage (handy_http_websockets.components.WebSocketBinaryMessage) + + + + + + + + + + +
+
+

WebSocketBinaryMessage

A binary websocket message.

struct WebSocketBinaryMessage {}

Members

Variables

conn
WebSocketConnection conn;
Undocumented in source.
payload
ubyte[] payload;
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.components.WebSocketBinaryMessage.payload.html b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketBinaryMessage.payload.html new file mode 100644 index 0000000..ee8e5b0 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketBinaryMessage.payload.html @@ -0,0 +1,35 @@ + + + + WebSocketBinaryMessage.payload (handy_http_websockets.components.WebSocketBinaryMessage.payload) + + + + + + + + + + +
+
+

WebSocketBinaryMessage.payload

Undocumented in source.
struct WebSocketBinaryMessage
ubyte[] payload;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.components.WebSocketCloseMessage.conn.html b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketCloseMessage.conn.html new file mode 100644 index 0000000..5fbd25f --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketCloseMessage.conn.html @@ -0,0 +1,35 @@ + + + + WebSocketCloseMessage.conn (handy_http_websockets.components.WebSocketCloseMessage.conn) + + + + + + + + + + +
+
+

WebSocketCloseMessage.conn

Undocumented in source.
struct WebSocketCloseMessage
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.components.WebSocketCloseMessage.html b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketCloseMessage.html new file mode 100644 index 0000000..33f430c --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketCloseMessage.html @@ -0,0 +1,36 @@ + + + + WebSocketCloseMessage (handy_http_websockets.components.WebSocketCloseMessage) + + + + + + + + + + +
+
+

WebSocketCloseMessage

A "close" control websocket message indicating the client is closing the +connection.

Members

Variables

conn
WebSocketConnection conn;
Undocumented in source.
message
string message;
Undocumented in source.
statusCode
ushort statusCode;
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.components.WebSocketCloseMessage.message.html b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketCloseMessage.message.html new file mode 100644 index 0000000..7c515c7 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketCloseMessage.message.html @@ -0,0 +1,35 @@ + + + + WebSocketCloseMessage.message (handy_http_websockets.components.WebSocketCloseMessage.message) + + + + + + + + + + +
+
+

WebSocketCloseMessage.message

Undocumented in source.
struct WebSocketCloseMessage
string message;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.components.WebSocketCloseMessage.statusCode.html b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketCloseMessage.statusCode.html new file mode 100644 index 0000000..0f85a6f --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketCloseMessage.statusCode.html @@ -0,0 +1,35 @@ + + + + WebSocketCloseMessage.statusCode (handy_http_websockets.components.WebSocketCloseMessage.statusCode) + + + + + + + + + + +
+
+

WebSocketCloseMessage.statusCode

Undocumented in source.
struct WebSocketCloseMessage
ushort statusCode;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.components.WebSocketException.__anonymous.html b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketException.__anonymous.html new file mode 100644 index 0000000..5401553 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketException.__anonymous.html @@ -0,0 +1,35 @@ + + + + WebSocketException.__anonymous (handy_http_websockets.components.WebSocketException.__anonymous) + + + + + + + + + + +
+
+

WebSocketException.__anonymous

Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.components.WebSocketException.html b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketException.html new file mode 100644 index 0000000..40f5993 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketException.html @@ -0,0 +1,38 @@ + + + + WebSocketException (handy_http_websockets.components.WebSocketException) + + + + + + + + + + +
+
+

WebSocketException

An exception that's thrown if an unexpected situation arises while dealing +with a websocket connection.

Members

Mixins

__anonymous
mixin basicExceptionCtors
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.html b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.html new file mode 100644 index 0000000..4af6e36 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.html @@ -0,0 +1,38 @@ + + + + WebSocketMessageHandler (handy_http_websockets.components.WebSocketMessageHandler) + + + + + + + + + + +
+
+

WebSocketMessageHandler

An abstract class that you should extend to define logic for handling +websocket messages and events. Create a new class that inherits from this +one, and overrides any "on..." methods that you'd like.

Members

Functions

onBinaryMessage
void onBinaryMessage(WebSocketBinaryMessage msg)

Called when a binary message is received.

onCloseMessage
void onCloseMessage(WebSocketCloseMessage msg)

Called when a CLOSE message is received. Note that this is called before +the socket is necessarily guaranteed to be closed.

onConnectionClosed
void onConnectionClosed(WebSocketConnection conn)

Called when a websocket connection is closed.

onConnectionEstablished
void onConnectionEstablished(WebSocketConnection conn, ServerHttpRequest request)

Called when a new websocket connection is established.

onTextMessage
void onTextMessage(WebSocketTextMessage msg)

Called when a text message is received.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.onBinaryMessage.html b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.onBinaryMessage.html new file mode 100644 index 0000000..5285aae --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.onBinaryMessage.html @@ -0,0 +1,35 @@ + + + + WebSocketMessageHandler.onBinaryMessage (handy_http_websockets.components.WebSocketMessageHandler.onBinaryMessage) + + + + + + + + + + +
+
+

WebSocketMessageHandler.onBinaryMessage

Called when a binary message is received.

class WebSocketMessageHandler
void
onBinaryMessage

Parameters

msg WebSocketBinaryMessage

The message that was received.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.onCloseMessage.html b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.onCloseMessage.html new file mode 100644 index 0000000..d02e32a --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.onCloseMessage.html @@ -0,0 +1,36 @@ + + + + WebSocketMessageHandler.onCloseMessage (handy_http_websockets.components.WebSocketMessageHandler.onCloseMessage) + + + + + + + + + + +
+
+

WebSocketMessageHandler.onCloseMessage

Called when a CLOSE message is received. Note that this is called before +the socket is necessarily guaranteed to be closed.

class WebSocketMessageHandler
void
onCloseMessage

Parameters

msg WebSocketCloseMessage

The close message.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.onConnectionClosed.html b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.onConnectionClosed.html new file mode 100644 index 0000000..033ec49 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.onConnectionClosed.html @@ -0,0 +1,35 @@ + + + + WebSocketMessageHandler.onConnectionClosed (handy_http_websockets.components.WebSocketMessageHandler.onConnectionClosed) + + + + + + + + + + +
+
+

WebSocketMessageHandler.onConnectionClosed

Called when a websocket connection is closed.

class WebSocketMessageHandler
void
onConnectionClosed

Parameters

conn WebSocketConnection

The connection that was closed.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.onConnectionEstablished.html b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.onConnectionEstablished.html new file mode 100644 index 0000000..8b3ea1f --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.onConnectionEstablished.html @@ -0,0 +1,35 @@ + + + + WebSocketMessageHandler.onConnectionEstablished (handy_http_websockets.components.WebSocketMessageHandler.onConnectionEstablished) + + + + + + + + + + +
+
+

WebSocketMessageHandler.onConnectionEstablished

Called when a new websocket connection is established.

class WebSocketMessageHandler
void
onConnectionEstablished
(,
in ServerHttpRequest request
)

Parameters

conn WebSocketConnection

The new connection.

request ServerHttpRequest

The HTTP request that initiated the connection.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.onTextMessage.html b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.onTextMessage.html new file mode 100644 index 0000000..bc478b4 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketMessageHandler.onTextMessage.html @@ -0,0 +1,35 @@ + + + + WebSocketMessageHandler.onTextMessage (handy_http_websockets.components.WebSocketMessageHandler.onTextMessage) + + + + + + + + + + +
+
+

WebSocketMessageHandler.onTextMessage

Called when a text message is received.

class WebSocketMessageHandler
void
onTextMessage

Parameters

msg WebSocketTextMessage

The message that was received.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.components.WebSocketTextMessage.conn.html b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketTextMessage.conn.html new file mode 100644 index 0000000..dd6db95 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketTextMessage.conn.html @@ -0,0 +1,35 @@ + + + + WebSocketTextMessage.conn (handy_http_websockets.components.WebSocketTextMessage.conn) + + + + + + + + + + +
+
+

WebSocketTextMessage.conn

Undocumented in source.
struct WebSocketTextMessage
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.components.WebSocketTextMessage.html b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketTextMessage.html new file mode 100644 index 0000000..6804b12 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketTextMessage.html @@ -0,0 +1,35 @@ + + + + WebSocketTextMessage (handy_http_websockets.components.WebSocketTextMessage) + + + + + + + + + + +
+
+

WebSocketTextMessage

A text-based websocket message.

struct WebSocketTextMessage {}

Members

Variables

conn
WebSocketConnection conn;
Undocumented in source.
payload
string payload;
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.components.WebSocketTextMessage.payload.html b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketTextMessage.payload.html new file mode 100644 index 0000000..9146c86 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.components.WebSocketTextMessage.payload.html @@ -0,0 +1,35 @@ + + + + WebSocketTextMessage.payload (handy_http_websockets.components.WebSocketTextMessage.payload) + + + + + + + + + + +
+
+

WebSocketTextMessage.payload

Undocumented in source.
struct WebSocketTextMessage
string payload;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.components.html b/docs/ddoc/websockets/handy_http_websockets.components.html new file mode 100644 index 0000000..0ac4031 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.components.html @@ -0,0 +1,39 @@ + + + + handy_http_websockets.components (handy_http_websockets.components) + + + + + + + + + + +
+
+

handy_http_websockets.components

Undocumented in source.

Members

Classes

WebSocketException
class WebSocketException

An exception that's thrown if an unexpected situation arises while dealing +with a websocket connection.

WebSocketMessageHandler
class WebSocketMessageHandler

An abstract class that you should extend to define logic for handling +websocket messages and events. Create a new class that inherits from this +one, and overrides any "on..." methods that you'd like.

Structs

WebSocketBinaryMessage
struct WebSocketBinaryMessage

A binary websocket message.

WebSocketCloseMessage
struct WebSocketCloseMessage

A "close" control websocket message indicating the client is closing the +connection.

WebSocketTextMessage
struct WebSocketTextMessage

A text-based websocket message.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.close.html b/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.close.html new file mode 100644 index 0000000..bd811e5 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.close.html @@ -0,0 +1,35 @@ + + + + WebSocketConnection.close (handy_http_websockets.connection.WebSocketConnection.close) + + + + + + + + + + +
+
+

WebSocketConnection.close

Closes this connection, if it's alive, sending a websocket close message.

class WebSocketConnection
void
close
()
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.getMessageHandler.html b/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.getMessageHandler.html new file mode 100644 index 0000000..d7d9300 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.getMessageHandler.html @@ -0,0 +1,35 @@ + + + + WebSocketConnection.getMessageHandler (handy_http_websockets.connection.WebSocketConnection.getMessageHandler) + + + + + + + + + + +
+
+

WebSocketConnection.getMessageHandler

Gets the message handler that handles events for this connection.

class WebSocketConnection
getMessageHandler
()

Return Value

The message handler.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.getRequestHandler.html b/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.getRequestHandler.html new file mode 100644 index 0000000..52e8eec --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.getRequestHandler.html @@ -0,0 +1,36 @@ + + + + WebSocketConnection.getRequestHandler (handy_http_websockets.connection.WebSocketConnection.getRequestHandler) + + + + + + + + + + +
+
+

WebSocketConnection.getRequestHandler

Gets the WebSocketRequestHandler that owns this connection. Use this +to interact with the set of connections managed by that handler.

class WebSocketConnection
getRequestHandler
()

Return Value

The request handler.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.html b/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.html new file mode 100644 index 0000000..f4df672 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.html @@ -0,0 +1,38 @@ + + + + WebSocketConnection (handy_http_websockets.connection.WebSocketConnection) + + + + + + + + + + +
+
+

WebSocketConnection

All the data that represents a WebSocket connection tracked by the +WebSocketHandler.

Constructors

this
this(WebSocketMessageHandler messageHandler, WebSocketRequestHandler requestHandler, InputStream!ubyte inputStream, OutputStream!ubyte outputStream)
Undocumented in source.

Members

Functions

close
void close()

Closes this connection, if it's alive, sending a websocket close message.

getMessageHandler
WebSocketMessageHandler getMessageHandler()

Gets the message handler that handles events for this connection.

getRequestHandler
WebSocketRequestHandler getRequestHandler()

Gets the WebSocketRequestHandler that owns this connection. Use this +to interact with the set of connections managed by that handler.

sendBinaryMessage
void sendBinaryMessage(ubyte[] bytes)

Sends a binary message to the connected client.

sendCloseMessage
void sendCloseMessage(WebSocketCloseStatusCode status, string message)

Sends a close message to the client, indicating that we'll be closing +the connection.

sendTextMessage
void sendTextMessage(string text)

Sends a text message to the connected client.

Variables

id
UUID id;

The internal id assigned to this connection.

inputStream
InputStream!ubyte inputStream;

Stream for reading from the client.

outputStream
OutputStream!ubyte outputStream;

Stream for writing to the client.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.id.html b/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.id.html new file mode 100644 index 0000000..7706dc6 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.id.html @@ -0,0 +1,35 @@ + + + + WebSocketConnection.id (handy_http_websockets.connection.WebSocketConnection.id) + + + + + + + + + + +
+
+

WebSocketConnection.id

The internal id assigned to this connection.

class WebSocketConnection
immutable
UUID id;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.inputStream.html b/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.inputStream.html new file mode 100644 index 0000000..52e7101 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.inputStream.html @@ -0,0 +1,35 @@ + + + + WebSocketConnection.inputStream (handy_http_websockets.connection.WebSocketConnection.inputStream) + + + + + + + + + + +
+
+

WebSocketConnection.inputStream

Stream for reading from the client.

class WebSocketConnection
InputStream!ubyte inputStream;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.outputStream.html b/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.outputStream.html new file mode 100644 index 0000000..b611d1e --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.outputStream.html @@ -0,0 +1,35 @@ + + + + WebSocketConnection.outputStream (handy_http_websockets.connection.WebSocketConnection.outputStream) + + + + + + + + + + +
+
+

WebSocketConnection.outputStream

Stream for writing to the client.

class WebSocketConnection
OutputStream!ubyte outputStream;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.sendBinaryMessage.html b/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.sendBinaryMessage.html new file mode 100644 index 0000000..1412a56 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.sendBinaryMessage.html @@ -0,0 +1,35 @@ + + + + WebSocketConnection.sendBinaryMessage (handy_http_websockets.connection.WebSocketConnection.sendBinaryMessage) + + + + + + + + + + +
+
+

WebSocketConnection.sendBinaryMessage

Sends a binary message to the connected client.

class WebSocketConnection
void
sendBinaryMessage
(
ubyte[] bytes
)

Parameters

bytes ubyte[]

The binary data to send.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.sendCloseMessage.html b/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.sendCloseMessage.html new file mode 100644 index 0000000..4ae2e2b --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.sendCloseMessage.html @@ -0,0 +1,36 @@ + + + + WebSocketConnection.sendCloseMessage (handy_http_websockets.connection.WebSocketConnection.sendCloseMessage) + + + + + + + + + + +
+
+

WebSocketConnection.sendCloseMessage

Sends a close message to the client, indicating that we'll be closing +the connection.

class WebSocketConnection
void
sendCloseMessage

Parameters

status WebSocketCloseStatusCode

The status code for closing.

message string

A message explaining why we're closing. Length must be <= 123.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.sendTextMessage.html b/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.sendTextMessage.html new file mode 100644 index 0000000..9423e36 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.sendTextMessage.html @@ -0,0 +1,35 @@ + + + + WebSocketConnection.sendTextMessage (handy_http_websockets.connection.WebSocketConnection.sendTextMessage) + + + + + + + + + + +
+
+

WebSocketConnection.sendTextMessage

Sends a text message to the connected client.

class WebSocketConnection
void
sendTextMessage
(
string text
)

Parameters

text string

The text to send. Should be valid UTF-8.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.this.html b/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.this.html new file mode 100644 index 0000000..e097a7f --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.connection.WebSocketConnection.this.html @@ -0,0 +1,35 @@ + + + + WebSocketConnection.this (handy_http_websockets.connection.WebSocketConnection.this) + + + + + + + + + + +
+
+

WebSocketConnection.this

Undocumented in source.
class WebSocketConnection
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.connection.html b/docs/ddoc/websockets/handy_http_websockets.connection.html new file mode 100644 index 0000000..5a5ca98 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.connection.html @@ -0,0 +1,36 @@ + + + + handy_http_websockets.connection (handy_http_websockets.connection) + + + + + + + + + + +
+
+

handy_http_websockets.connection

Undocumented in source.

Members

Classes

WebSocketConnection
class WebSocketConnection

All the data that represents a WebSocket connection tracked by the +WebSocketHandler.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.frame.WebSocketCloseStatusCode.html b/docs/ddoc/websockets/handy_http_websockets.frame.WebSocketCloseStatusCode.html new file mode 100644 index 0000000..5ab93b4 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.frame.WebSocketCloseStatusCode.html @@ -0,0 +1,36 @@ + + + + WebSocketCloseStatusCode (handy_http_websockets.frame.WebSocketCloseStatusCode) + + + + + + + + + + +
+ + +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.frame.WebSocketFrame.finalFragment.html b/docs/ddoc/websockets/handy_http_websockets.frame.WebSocketFrame.finalFragment.html new file mode 100644 index 0000000..0e8e337 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.frame.WebSocketFrame.finalFragment.html @@ -0,0 +1,35 @@ + + + + WebSocketFrame.finalFragment (handy_http_websockets.frame.WebSocketFrame.finalFragment) + + + + + + + + + + +
+
+

WebSocketFrame.finalFragment

Undocumented in source.
struct WebSocketFrame
bool finalFragment;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.frame.WebSocketFrame.html b/docs/ddoc/websockets/handy_http_websockets.frame.WebSocketFrame.html new file mode 100644 index 0000000..785e520 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.frame.WebSocketFrame.html @@ -0,0 +1,36 @@ + + + + WebSocketFrame (handy_http_websockets.frame.WebSocketFrame) + + + + + + + + + + +
+
+

WebSocketFrame

Internal intermediary structure used to hold the results of parsing a +websocket frame.

Members

Variables

finalFragment
bool finalFragment;
Undocumented in source.
opcode
WebSocketFrameOpcode opcode;
Undocumented in source.
payload
ubyte[] payload;
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.frame.WebSocketFrame.opcode.html b/docs/ddoc/websockets/handy_http_websockets.frame.WebSocketFrame.opcode.html new file mode 100644 index 0000000..f630b86 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.frame.WebSocketFrame.opcode.html @@ -0,0 +1,35 @@ + + + + WebSocketFrame.opcode (handy_http_websockets.frame.WebSocketFrame.opcode) + + + + + + + + + + +
+
+

WebSocketFrame.opcode

Undocumented in source.
struct WebSocketFrame
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.frame.WebSocketFrame.payload.html b/docs/ddoc/websockets/handy_http_websockets.frame.WebSocketFrame.payload.html new file mode 100644 index 0000000..18172aa --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.frame.WebSocketFrame.payload.html @@ -0,0 +1,35 @@ + + + + WebSocketFrame.payload (handy_http_websockets.frame.WebSocketFrame.payload) + + + + + + + + + + +
+
+

WebSocketFrame.payload

Undocumented in source.
struct WebSocketFrame
ubyte[] payload;
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.frame.WebSocketFrameOpcode.html b/docs/ddoc/websockets/handy_http_websockets.frame.WebSocketFrameOpcode.html new file mode 100644 index 0000000..c0f700b --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.frame.WebSocketFrameOpcode.html @@ -0,0 +1,36 @@ + + + + WebSocketFrameOpcode (handy_http_websockets.frame.WebSocketFrameOpcode) + + + + + + + + + + +
+
+

WebSocketFrameOpcode

An enumeration of valid opcodes for websocket data frames. +https://datatracker.ietf.org/doc/html/rfc6455#section-5.2

Values

ValueMeaning
CONTINUATION0
TEXT_FRAME1
BINARY_FRAME2
CONNECTION_CLOSE8
PING9
PONG10
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.frame.html b/docs/ddoc/websockets/handy_http_websockets.frame.html new file mode 100644 index 0000000..426c6ca --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.frame.html @@ -0,0 +1,41 @@ + + + + handy_http_websockets.frame (handy_http_websockets.frame) + + + + + + + + + + +
+
+

handy_http_websockets.frame

Defines low-level structs and functions for dealing with WebSocket data +frame protocol. Usually, you won't need to use these functions and structs +directly, since abstractions are provided by the websocket connection and +message structs.

Members

Enums

WebSocketCloseStatusCode
enum WebSocketCloseStatusCode

An enumeration of possible closing status codes for websocket connections, +as per https://datatracker.ietf.org/doc/html/rfc6455#section-7.4

WebSocketFrameOpcode
enum WebSocketFrameOpcode

An enumeration of valid opcodes for websocket data frames. +https://datatracker.ietf.org/doc/html/rfc6455#section-5.2

Functions

receiveWebSocketFrame
WebSocketFrame receiveWebSocketFrame(S stream)

Receives a websocket frame from a byte input stream.

sendWebSocketBinaryFrame
void sendWebSocketBinaryFrame(S stream, ubyte[] bytes)
Undocumented in source. Be warned that the author may not have intended to support it.
sendWebSocketCloseFrame
void sendWebSocketCloseFrame(S stream, WebSocketCloseStatusCode code, string message)
Undocumented in source. Be warned that the author may not have intended to support it.
sendWebSocketFrame
void sendWebSocketFrame(S stream, WebSocketFrame frame)

Sends a websocket frame to a byte output stream.

sendWebSocketPingFrame
void sendWebSocketPingFrame(S stream, ubyte[] payload)
Undocumented in source. Be warned that the author may not have intended to support it.
sendWebSocketPongFrame
void sendWebSocketPongFrame(S stream, ubyte[] pingPayload)
Undocumented in source. Be warned that the author may not have intended to support it.
sendWebSocketTextFrame
void sendWebSocketTextFrame(S stream, string text)
Undocumented in source. Be warned that the author may not have intended to support it.

Structs

WebSocketFrame
struct WebSocketFrame

Internal intermediary structure used to hold the results of parsing a +websocket frame.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.frame.receiveWebSocketFrame.html b/docs/ddoc/websockets/handy_http_websockets.frame.receiveWebSocketFrame.html new file mode 100644 index 0000000..5767725 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.frame.receiveWebSocketFrame.html @@ -0,0 +1,35 @@ + + + + receiveWebSocketFrame (handy_http_websockets.frame.receiveWebSocketFrame) + + + + + + + + + + +
+
+

receiveWebSocketFrame

Receives a websocket frame from a byte input stream.

receiveWebSocketFrame
(
S
)
()
if (
isByteInputStream!S
)

Parameters

stream S

The stream to receive from.

Return Value

The frame that was received.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketBinaryFrame.html b/docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketBinaryFrame.html new file mode 100644 index 0000000..87d07a9 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketBinaryFrame.html @@ -0,0 +1,35 @@ + + + + sendWebSocketBinaryFrame (handy_http_websockets.frame.sendWebSocketBinaryFrame) + + + + + + + + + + +
+
+

sendWebSocketBinaryFrame

Undocumented in source. Be warned that the author may not have intended to support it.
void
sendWebSocketBinaryFrame
(
S
)
(,
ubyte[] bytes
)
if (
isByteOutputStream!S
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketCloseFrame.html b/docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketCloseFrame.html new file mode 100644 index 0000000..bcc5943 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketCloseFrame.html @@ -0,0 +1,35 @@ + + + + sendWebSocketCloseFrame (handy_http_websockets.frame.sendWebSocketCloseFrame) + + + + + + + + + + +
+
+

sendWebSocketCloseFrame

Undocumented in source. Be warned that the author may not have intended to support it.
void
sendWebSocketCloseFrame
(
S
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketFrame.html b/docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketFrame.html new file mode 100644 index 0000000..4149a4f --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketFrame.html @@ -0,0 +1,35 @@ + + + + sendWebSocketFrame (handy_http_websockets.frame.sendWebSocketFrame) + + + + + + + + + + +
+
+

sendWebSocketFrame

Sends a websocket frame to a byte output stream.

void
sendWebSocketFrame
(
S
)
if (
isByteOutputStream!S
)

Parameters

stream S

The stream to write to.

frame WebSocketFrame

The frame to write.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketPingFrame.html b/docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketPingFrame.html new file mode 100644 index 0000000..da031e0 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketPingFrame.html @@ -0,0 +1,35 @@ + + + + sendWebSocketPingFrame (handy_http_websockets.frame.sendWebSocketPingFrame) + + + + + + + + + + +
+
+

sendWebSocketPingFrame

Undocumented in source. Be warned that the author may not have intended to support it.
void
sendWebSocketPingFrame
(
S
)
(,
ubyte[] payload
)
if (
isByteOutputStream!S
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketPongFrame.html b/docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketPongFrame.html new file mode 100644 index 0000000..5a9275d --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketPongFrame.html @@ -0,0 +1,35 @@ + + + + sendWebSocketPongFrame (handy_http_websockets.frame.sendWebSocketPongFrame) + + + + + + + + + + +
+
+

sendWebSocketPongFrame

Undocumented in source. Be warned that the author may not have intended to support it.
void
sendWebSocketPongFrame
(
S
)
(,
ubyte[] pingPayload
)
if (
isByteOutputStream!S
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketTextFrame.html b/docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketTextFrame.html new file mode 100644 index 0000000..cde5247 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.frame.sendWebSocketTextFrame.html @@ -0,0 +1,35 @@ + + + + sendWebSocketTextFrame (handy_http_websockets.frame.sendWebSocketTextFrame) + + + + + + + + + + +
+
+

sendWebSocketTextFrame

Undocumented in source. Be warned that the author may not have intended to support it.
void
sendWebSocketTextFrame
(
S
)
(,
string text
)
if (
isByteOutputStream!S
)
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.addConnection.html b/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.addConnection.html new file mode 100644 index 0000000..784d605 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.addConnection.html @@ -0,0 +1,35 @@ + + + + WebSocketRequestHandler.addConnection (handy_http_websockets.handler.WebSocketRequestHandler.addConnection) + + + + + + + + + + +
+
+

WebSocketRequestHandler.addConnection

Adds a connection to the manager and starts listening for messages.

class WebSocketRequestHandler
void
addConnection
(,
in ServerHttpRequest request
)

Parameters

conn WebSocketConnection

The connection to add.

request ServerHttpRequest

The HTTP request that initiated the connection.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.broadcast.1.html b/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.broadcast.1.html new file mode 100644 index 0000000..42f4736 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.broadcast.1.html @@ -0,0 +1,35 @@ + + + + WebSocketRequestHandler.broadcast (handy_http_websockets.handler.WebSocketRequestHandler.broadcast) + + + + + + + + + + +
+
+

WebSocketRequestHandler.broadcast

Broadcasts a message to all connected clients.

  1. void broadcast(string text)
    class WebSocketRequestHandler
    void
    broadcast
    (
    string text
    )
  2. void broadcast(ubyte[] data)

Parameters

text string

The text to send to all clients.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.broadcast.2.html b/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.broadcast.2.html new file mode 100644 index 0000000..57110b4 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.broadcast.2.html @@ -0,0 +1,35 @@ + + + + WebSocketRequestHandler.broadcast (handy_http_websockets.handler.WebSocketRequestHandler.broadcast) + + + + + + + + + + +
+
+

WebSocketRequestHandler.broadcast

Broadcasts a binary message to all connected clients.

  1. void broadcast(string text)
  2. void broadcast(ubyte[] data)
    class WebSocketRequestHandler
    void
    broadcast
    (
    ubyte[] data
    )

Parameters

data ubyte[]

The binary data to send to all clients.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.broadcast.html b/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.broadcast.html new file mode 100644 index 0000000..c4255d7 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.broadcast.html @@ -0,0 +1 @@ + Continue to overload \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.connectionCount.html b/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.connectionCount.html new file mode 100644 index 0000000..14167f2 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.connectionCount.html @@ -0,0 +1,35 @@ + + + + WebSocketRequestHandler.connectionCount (handy_http_websockets.handler.WebSocketRequestHandler.connectionCount) + + + + + + + + + + +
+
+

WebSocketRequestHandler.connectionCount

Gets the number of active connections.

class WebSocketRequestHandler
size_t
connectionCount
()

Return Value

Type: size_t

The number of active connections.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.handle.html b/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.handle.html new file mode 100644 index 0000000..814bb5f --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.handle.html @@ -0,0 +1,38 @@ + + + + WebSocketRequestHandler.handle (handy_http_websockets.handler.WebSocketRequestHandler.handle) + + + + + + + + + + +
+
+

WebSocketRequestHandler.handle

Handles an incoming HTTP request and tries to establish a websocket +connection by first verifying the request, then sending a switching- +protocols response, and finally registering the new connection with the +websocket manager.

class WebSocketRequestHandler
void
handle
(
ref ServerHttpRequest request
,
ref ServerHttpResponse response
)

Parameters

request ServerHttpRequest

The request to read from.

response ServerHttpResponse

The response to write to.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.html b/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.html new file mode 100644 index 0000000..4a2df41 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.html @@ -0,0 +1,44 @@ + + + + WebSocketRequestHandler (handy_http_websockets.handler.WebSocketRequestHandler) + + + + + + + + + + +
+
+

WebSocketRequestHandler

An HTTP request handler implementation that's used as the entrypoint for +clients that want to establish a websocket connection. It will verify the +websocket request, and if successful, send back a SWITCHING_PROTOCOLS +response, and register a new websocket connection.

Constructors

this
this(WebSocketMessageHandler messageHandler)

Constructs a request handler that will use the given message handler to +deal with events from any websocket connections that are established.

Members

Functions

addConnection
void addConnection(WebSocketConnection conn, ServerHttpRequest request)

Adds a connection to the manager and starts listening for messages.

broadcast
void broadcast(ubyte[] data)

Broadcasts a binary message to all connected clients.

broadcast
void broadcast(string text)

Broadcasts a message to all connected clients.

connectionCount
size_t connectionCount()

Gets the number of active connections.

handle
void handle(ServerHttpRequest request, ServerHttpResponse response)

Handles an incoming HTTP request and tries to establish a websocket +connection by first verifying the request, then sending a switching- +protocols response, and finally registering the new connection with the +websocket manager.

removeConnection
void removeConnection(WebSocketConnection conn)

Removes a websocket connection from the manager and closes it. This is +called automatically if the client sends a CLOSE frame, but you can also +call it yourself.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.removeConnection.html b/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.removeConnection.html new file mode 100644 index 0000000..44f92f5 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.removeConnection.html @@ -0,0 +1,37 @@ + + + + WebSocketRequestHandler.removeConnection (handy_http_websockets.handler.WebSocketRequestHandler.removeConnection) + + + + + + + + + + +
+
+

WebSocketRequestHandler.removeConnection

Removes a websocket connection from the manager and closes it. This is +called automatically if the client sends a CLOSE frame, but you can also +call it yourself.

class WebSocketRequestHandler
void
removeConnection

Parameters

conn WebSocketConnection

The connection to remove.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.this.html b/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.this.html new file mode 100644 index 0000000..225fa26 --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.handler.WebSocketRequestHandler.this.html @@ -0,0 +1,36 @@ + + + + WebSocketRequestHandler.this (handy_http_websockets.handler.WebSocketRequestHandler.this) + + + + + + + + + + +
+
+

WebSocketRequestHandler.this

Constructs a request handler that will use the given message handler to +deal with events from any websocket connections that are established.

class WebSocketRequestHandler

Parameters

messageHandler WebSocketMessageHandler

The message handler to use.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.handler.html b/docs/ddoc/websockets/handy_http_websockets.handler.html new file mode 100644 index 0000000..457373d --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.handler.html @@ -0,0 +1,38 @@ + + + + handy_http_websockets.handler (handy_http_websockets.handler) + + + + + + + + + + +
+
+

handy_http_websockets.handler

Undocumented in source.

Members

Classes

WebSocketRequestHandler
class WebSocketRequestHandler

An HTTP request handler implementation that's used as the entrypoint for +clients that want to establish a websocket connection. It will verify the +websocket request, and if successful, send back a SWITCHING_PROTOCOLS +response, and register a new websocket connection.

+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/handy_http_websockets.html b/docs/ddoc/websockets/handy_http_websockets.html new file mode 100644 index 0000000..390260b --- /dev/null +++ b/docs/ddoc/websockets/handy_http_websockets.html @@ -0,0 +1,42 @@ + + + + handy_http_websockets (handy_http_websockets) + + + + + + + + + + +
+
+

handy_http_websockets

Undocumented in source.

Modules

components
module handy_http_websockets.components
Undocumented in source.
connection
module handy_http_websockets.connection
Undocumented in source.
frame
module handy_http_websockets.frame

Defines low-level structs and functions for dealing with WebSocket data +frame protocol. Usually, you won't need to use these functions and structs +directly, since abstractions are provided by the websocket connection and +message structs.

handler
module handy_http_websockets.handler
Undocumented in source.

Public Imports

handy_http_websockets.components
public +import handy_http_websockets.components;
Undocumented in source.
handy_http_websockets.connection
public +import handy_http_websockets.connection;
Undocumented in source.
handy_http_websockets.handler
public +import handy_http_websockets.handler;
Undocumented in source.

Members

Imports

WebSocketCloseStatusCode (from handy_http_websockets.frame)
public +import handy_http_websockets.frame : WebSocketCloseStatusCode;
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/index.html b/docs/ddoc/websockets/index.html new file mode 100644 index 0000000..ff54b27 --- /dev/null +++ b/docs/ddoc/websockets/index.html @@ -0,0 +1,35 @@ + + + + index (index) + + + + + + + + + + +
+
+

index

Modules

handy_http_websockets
module handy_http_websockets
Undocumented in source.
+ +
+ + + \ No newline at end of file diff --git a/docs/ddoc/websockets/script.js b/docs/ddoc/websockets/script.js new file mode 100644 index 0000000..b47257e --- /dev/null +++ b/docs/ddoc/websockets/script.js @@ -0,0 +1,180 @@ +window.addEventListener("load", function() { + + var lineWrappers = document.querySelectorAll(".with-line-wrappers"); + for(var i = 0; i < lineWrappers.length; i++) { + var l = lineWrappers[i]; + + var codeblock = document.createElement("div"); + codeblock.className = "codeblock"; + l.parentNode.insertBefore(codeblock, l); + + var header = document.createElement("header"); + codeblock.appendChild(header); + codeblock.appendChild(l); + + var btn = document.createElement("button"); + btn.setAttribute("type", "button"); + var canCopyToClipboard = document.queryCommandSupported("copy"); + btn.addEventListener("click", (function(l) { return function() { + document.body.classList.add("hide-line-numbers"); + window.getSelection().selectAllChildren(l); + if(canCopyToClipboard) + if(!document.execCommand("copy")) { + alert("copy failed, try ctrl+c manually"); + } + };})(l)); + btn.textContent = canCopyToClipboard ? "Copy to Clipboard" : "Select All"; + header.appendChild(btn); + + var btn = document.createElement("button"); + btn.setAttribute("type", "button"); + btn.addEventListener("click", function() { + document.body.classList.toggle("hide-line-numbers"); + }); + btn.textContent = "Toggle Line Numbers"; + header.appendChild(btn); + } + + /* // still sucks in firefox! + document.addEventListener("copy", function(event) { + document.body.classList.add("hide-line-numbers"); + }); + */ + + document.body.addEventListener("mouseover", function(event) { + if(event.target.hasAttribute("data-ident")) { + var all = document.querySelectorAll("[data-ident=\""+event.target.getAttribute("data-ident")+"\"]"); + for(var i = 0; i < all.length; i++) + all[i].className += " active"; + } + }); + document.body.addEventListener("mouseout", function(event) { + if(event.target.hasAttribute("data-ident")) { + var all = document.querySelectorAll("[data-ident=\""+event.target.getAttribute("data-ident")+"\"]"); + for(var i = 0; i < all.length; i++) + all[i].className = all[i].className.replace(" active", ""); + } + }); + /* + document.body.addEventListener("dblclick", function(event) { + if(event.target.hasAttribute("data-ident")) { + location.href = "/" + event.target.getAttribute("data-ident"); + } + }); + */ + + var sn = document.getElementById("source-navigation"); + if(sn) { + sn.addEventListener("click", function(event) { + if(event.target.tagName != "A" || event.target.className == "docs") + return true; + if(event.target.nextSibling) { + var s = event.target.nextSibling; + if(s.style.display == "" || s.style.display == "none" || s.className.indexOf("search-hit") != -1) { + s.style.display = "block"; + var items = s.getElementsByTagName("ul"); + var i; + for(i = 0; i < items.length; i++) + items[i].style.display = ""; + items = s.getElementsByTagName("li"); + for(i = 0; i < items.length; i++) + items[i].style.display = ""; + } else + s.style.display = ""; + } + + //var id = event.target.href.substring(event.target.href.indexOf("#") + 1); + //sn.style.marginTop = (document.getElementById(id).offsetTop - event.target.offsetTop + 16) + "px"; + }); + + var search = document.createElement("input"); + search.setAttribute("type", "search"); + function searchHelper() { + var regex = new RegExp(search.value, "i"); + var items = document.querySelectorAll("#source-navigation a[href^=\"#\"]"); + var stxt = search.value; + for(var i = 0; i < items.length; i++) { + var a = items[i]; + if(stxt.length && regex.test(a.textContent)) { + var p = a.parentNode; + while(p.tagName != "DIV") { + if(p.tagName == "LI") + p.style.display = "list-item"; + else + p.style.display = "block"; + p.className += " search-hit"; + p = p.parentNode; + } + } else { + var p = a.parentNode; + if(stxt.length == 0) { + p.style.display = ""; + while(p.tagName != "DIV") { + p.style.display = ""; + p = p.parentNode; + } + } else + p.style.display = "none"; + p.className = p.className.replace(" search-hit", ""); + } + } + } + search.addEventListener("keyup", searchHelper); + sn.insertBefore(search, sn.firstChild); + } + + /* + function updateDynamicStyle() { + var thing = document.getElementById("page-content"); + var newStyle = document.getElementById("dynamic-style"); + if(!newStyle) { + newStyle = document.createElement("style"); + newStyle.setAttribute("id", "dynamic-style"); + newStyle.type = "text/css"; + document.head.appendChild(newStyle); + } + + var maxContentWidth = window.innerWidth; + // 800 is the threshold for putting nav vertically + if(maxContentWidth < 800) + maxContentWidth = 800; + else + maxContentWidth = + document.body.offsetWidth - + document.getElementById("page-nav").offsetWidth - + document.getElementById("page-nav").offsetLeft - + 64; + + // sanity check lol + if(maxContentWidth < 800) + maxContentWidth = 800; + + newStyle.innerHTML = ".member-list:not(.constructors) dt .simplified-prototype:hover { width: " + (thing.offsetWidth - 32) + "px; } #page-content pre.d_code, #page-content .overload-option, #page-content .member-list dt { max-width: " + (maxContentWidth) + "px; }"; + } + + updateDynamicStyle(); + + window.onresize = updateDynamicStyle; + */ + + // Disable line numbers in IE because the copy/paste with them sucks - it includes all line numbers + // in the middle making it too hard to use. Copy/paste is more important than line displays. + if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) { + var items = document.querySelectorAll(".with-line-wrappers"); + for(var a = 0; a < items.length; a++) + items[a].className = items[a].className.replace("with-line-wrappers", ""); + } + + // Keybind to focus search bar on '?' keydown. + document.addEventListener("keydown", (event) => { + if (event.key == "?") { + var searchBox = document.getElementsByName("searchTerm")[0]; + // Hack so the '?' doesn't auto-populate in the search bar. + this.setTimeout(() => { + searchBox.focus(); + }, 100); + } + }); + + +}); diff --git a/docs/ddoc/websockets/search-docs.html b/docs/ddoc/websockets/search-docs.html new file mode 100644 index 0000000..522aab4 --- /dev/null +++ b/docs/ddoc/websockets/search-docs.html @@ -0,0 +1,26 @@ + + + + + + + + diff --git a/docs/ddoc/websockets/search-docs.js b/docs/ddoc/websockets/search-docs.js new file mode 100644 index 0000000..768a988 --- /dev/null +++ b/docs/ddoc/websockets/search-docs.js @@ -0,0 +1,421 @@ +/* + This is the source for offline web search; it will be embedded + in a generated search page along with the search index xml. + + You will almost certainly want to gzip this when delivering it! + Also be sure it has the proper cache headers to give a remotely + acceptable performance result. Configure the web server to do + both these. When storing it for offline usage, you might just + leave it unzipped though for convenience of use without a web server. + + Tip to the end user: you might want to open this page and keep it + open in a reused tab. + + The file generated should be the skeleton.html with the search + index in a + + + + + + +
+
+
+ +
+ + + + + diff --git a/docs/ddoc/websockets/style.css b/docs/ddoc/websockets/style.css new file mode 100644 index 0000000..e6754c4 --- /dev/null +++ b/docs/ddoc/websockets/style.css @@ -0,0 +1,1661 @@ +/* a few things you can change to pick a basic color scheme */ + +/* + FIXME: have some automatic magic for choosing light vs dark and picking an accent color. + + Ideally, we'll get to the point where you can just say: + project name + project logo + project links + + light/dark scheme + project color + + and it will adapt the rest to a good-enough state automatically. +*/ + +#page-header, +#suggestion-box { + background-color: rgb(49, 57, 176); + background-color: rgb(49, 110, 47); + background-color: rgb(176, 57, 49); +} + +#page-header, +#suggestion-box, +#page-footer, +#page-nav { + border-color: rgb(41, 48, 148); + border-color: rgb(41, 110, 48); + border-color: rgb(148, 48, 41); + border-color: rgb(204, 204, 204); +} + +#page-nav { + background-color: rgb(245, 245, 255); + background-color: rgb(245, 250, 245); + background-color: rgb(245, 245, 245); + +} + +a:link { + color: #0000ff; + color: #bb0000; +} + +a:visited { + color: #004488; + color: #bb0044; +} + + +body { + font-family: "Roboto Slab", sans-serif; + tab-size: 4; +} + +h1, #page-nav a, .quickindex a.xref, .breadcrumb, dt > a { + font-family: Consolas, "Bitstream Vera Sans Mono", "Andale Mono", Monaco, "DejaVu Sans Mono", "Lucida Console", monospace; +} + + +/* done with basic colors */ + +html { + font-size: 100%; +} + +h1 { + font-size: 2.2rem; +} + +h2 { + font-size: 1.6rem; + margin-top: 1.5em; + font-family: "Roboto Slab", sans-serif; + font-weight: normal; +} + +h3 { + font-size: 1.26rem; +} + +body { + /*font-family: sans-serif;*/ + color: #111; + background-color: white; +} + +.big-o { + white-space: nowrap; +} + +.member-list .dt, +.overload-option, +pre { + box-sizing: border-box; + overflow: auto; + max-width: 800px; /* The script sets the real one */ + max-width: calc(80vw - 16em - 4em); +} + + +#page-header { + height: 32px; + line-height: 32px; + margin-bottom: 6px; + border-bottom-width: 1px; + border-bottom-style: solid; + color: white; + margin: -0.5em; + padding: 0em 0.5em; + margin-bottom: 0.0em; + overflow: hidden; +} + +#page-header span { + vertical-align: top; +} + +#page-header #logotype { + float: left; +} + +#page-header #search { + float: right; +} + +#page-header nav { + display: inline-block; + margin-left: 2em; + vertical-align: top; +} + +#page-header nav a { + display: inline-block; + color: white; + font-weight: bold; + margin-right: 2em; +} + +#page-body { + clear: both; + margin: 0px auto; + max-width: 1200px; + min-height: 800px; + min-height: calc(100vh - 3em - 32px); + display: flex; + box-sizing: border-box; +} + +#page-body #page-nav { + flex: 0 0 16em; + width: 16em; + min-width: 16em; + max-width: 16em; + order: 1; + padding-top: 0.25em; + padding-left: 1em; + padding-right: 0px; + min-height: 800px; + min-height: calc(100vh - 3em - 32px); + + border-right-style: solid; + border-right-width: 1px; + border-left-style: solid; + border-left-width: 1px; + box-sizing: border-box; +} + +#page-body #page-content { + flex: 1 1 auto; + order: 2; + padding: 0.25em; + padding-left: 1.75em; + box-sizing: border-box; + max-width: 960px; +} + +@media all and (max-width: 800px) { + #page-body { + display: block; + min-height: 0px; + } + + #page-body #page-nav { + display: block; + width: auto; + max-width: 800px; + border-top-style: solid; + border-top-width: 1px; + border-right: none; + min-height: 0px; + } + + #page-body #page-content { + padding-left: 0.25em; + } + + .member-list .dt, + .overload-option, + pre { + box-sizing: border-box; + overflow: auto; + max-width: 800px; /* The script sets the real one */ + max-width: calc(100vw - 2em); + } + + #page-header { + line-height: 20px; + height: auto; + min-height: 32px; + overflow: visible; + } + #page-header::after { + content: ' '; + display: block; + clear: both; + } +} + +#page-footer { + margin-top: 0em; + padding-top: 2em; + color: #999; + font-size: 0.9rem; + text-align: center; + border-top-style: solid; + border-top-width: 1px; +} + +a:link { + text-decoration: none; +} + +a:link:hover { + text-decoration: underline !important; /* important so it overrides even id level things on non-hover */ +} + +/* +pre.d_code { background-color: #fdf6e3; color: #002b36; padding: 0.25em; border: solid 1px #ccc; } +.d_code .kwrd { color: #b58900; font-weight: bold; } +.d_code .com { color: #666; font-style: italic; } +.d_code .num { color: #dc322f; font-weight: normal; } +.d_code .str { color: #2aa198; font-style: italic; } +.d_code .op { color: #586e75; font-weight: bold; } +.d_code .type { color: #268bd2; font-weight: bold; } +.d_code .cons { color: #859900; font-weight: bold; } + +.highlighted .kwrd { color: #b58900; font-weight: bold; } +.highlighted .com { color: #666; font-style: italic; } /* #93a1a1; * / +.highlighted .num { color: #dc322f; font-weight: normal; } +.highlighted .str { color: #2aa198; font-style: italic; } +.highlighted .op { color: #586e75; font-weight: bold; } +.highlighted .type { color: #268bd2; font-weight: bold; } +.highlighted .cons { color: #859900; font-weight: bold; } +*/ + +/* .member-list p, */ +#table-of-contents, +.enum-members, +.documentation-comment .tip, +.documentation-comment .note, +.documentation-comment .warning, +.documentation-comment .pitfall, +.documentation-comment li, +.documentation-comment p { + /* white-space: pre-line; */ + /* max-width: 74ch; */ + /*font-size: 1.1rem;*/ + font-size: 1.0rem; + line-height: 1.5; +} + +/* +.parameter-item::after { + content: ','; +} + +.parameter-item:last-child::after { + content: ''; +} +*/ + +.aggregate-declaration { + margin: 1em; +} + +.aggregate-member { + padding-left: 2em; +} + +/* +.aggregate-member::after { + content: ";"; +} +*/ + +.aggregate-member > a { + color: inherit; +} + +.template-constraint-expression, +.parameter-item { + padding-left: 2em; +} + + +/* +ol.overloads { + margin-bottom: -1px; + white-space: nowrap; +} + +ol.overloads::before { + content: "Overloads: "; +} + +ol.overloads li { + display: inline-block; + border: solid 1px #ccc; + list-style-position: inside; + text-align: center; + width: 5em; +} + +ol.overloads li.overload-option { + background-color: #eee; +} + +ol.overloads li a { + display: block; +} + +ol.overloads li.active-overload-option { + border-bottom: solid 1px white; +} + +ol.overloads + .aggregate-prototype, +ol.overloads + .function-prototype { + margin-top: 0px; +} +*/ + +.aggregate-prototype #help-link, +.function-prototype #help-link { + border-radius: 100%; + position: absolute; + top: -0.5em; + right: -0.5em; + display: block; + border: solid 1px #ccc; + background-color: white; + width: 1em; + height: 1em; + text-align: center; + font-size: 1.1rem; + padding-bottom: 3px; +} + +.aggregate-prototype #help-link:hover, +.function-prototype #help-link:hover { + text-decoration: none; + background-color: #ccc; +} + +.function-prototype .attributes { + color: #666; +} + +.declaration-prototype, +.aggregate-prototype, +.function-prototype { + border: solid 1px #ccc; + padding: 2em; + margin: 1em; + font-family: monospace; + position: relative; +} + +.declaration-prototype { + padding: 3em 2em; +} + +.parameters-list:empty { + display: none; +} + +/* +.parameters-list .parameters-list { + display: inline; +} +*/ + +.toplevel.parameters-list { + display: table; +} + +.toplevel.parameters-list > .parameter-item { + display: table-row; +} + +.toplevel.parameters-list > .parameter-item > *:first-child { + padding-left: 2em !important; +} + +.toplevel.parameters-list > .parameter-item + .comma { + display: none; +} + +.toplevel.parameters-list > .parameter-item > *:last-child::after { + content: ","; +} +.toplevel.parameters-list > .parameter-item:last-of-type > *:last-child::after { + content: ""; +} + +.parameter-attribute { + padding-left: 1em; +} + +.toplevel.parameters-list > .parameter-item .parameter-type-holder, +.toplevel.parameters-list > .parameter-item .parameter-name, +.toplevel.parameters-list > .parameter-item .parameter-default-value { + display: table-cell; + padding: 0px 0.25em; +} + +.toplevel.parameters-list > .parameter-item:hover { + background-color: #f8f8f8; +} + +.parameter-descriptions .parameter-name { + margin-right: 1.5rem; + font-weight: bold; + padding: 0.25ex 0.75ex; +} + +.parameter-descriptions dd { + margin-left: 1.5em; +} + +.parameter-descriptions dd p:first-child { + margin-top: 0.5em; +} + +.parameter-descriptions dt:not(:first-child) { + margin-top: 1.5em; +} + +.codeblock { + border: solid 1px #ccc; + padding: 0; + margin: 0; +} + +.codeblock header { + background-color: #e8e8e8; + padding: 0; + display: flex; + justify-content: flex-end; +} + +.codeblock header:before { + display: inline-block; + content: "Example"; + justify-content: flex-start; + flex-grow: 1; + padding: 0.25em 1em; + font-weight: bold; +} + +.codeblock header button { +/* TODO: add :before class with icons here (copy, line numbers) */ + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + margin: 0; + padding: 0 1em; + background-color: transparent; + border: none; + border-left: 1px solid #ccc; + cursor: pointer; +} + +.codeblock header button:hover { + background-color: rgba(255, 255, 255, 0.5); +} + +.codeblock header + pre { + border: none; + border-top: solid 1px #ccc; + margin: 0; + padding: 1em 0; + max-width: unset !important;; +} + +.hide-line-numbers .codeblock .with-line-wrappers, +.codeblock pre.d_code:not(.with-line-wrappers) { + padding: 1em; +} + +.codeblock .with-line-wrappers .br { + margin-right: 1em; +} + +.documentation-comment p { + hyphens: auto; +} + +.declaration-prototype, .aggregate-prototype, .function-prototype { + margin-left: 0; + margin-right: 0; +} + + + +tt.D, .inline-code { + color: black; + font-weight: 500; + background-color: #f2f2f2; + padding: 0px 0.5ex; + border-radius: 2px; +} + + +/* +.toplevel.parameters-list > .parameter-item > .parameter-type-holder { + text-align: right; +} + +.toplevel.parameters-list > .parameter-item > .parameter-type-holder > .parameter-type { + text-align: left; + display: inline-block; +} +*/ + +.function-prototype .return-type, .function-prototype .function-name { + display: inline; +} + +.function-name::before { + content: ' '; +} + +.function-name { + /*color: #008888;*/ +} + +.template-parameters[data-count="0"], +.template-parameters[data-count="0"] ~ .runtime-parameters[data-count="0"], +.template-parameters[data-count="0"] ~ .runtime-parameters[data-count="0"] > .parameters-list { + display: inline; +} + +.parameters-list:empty { + display: inline; +} + +.type-constructor, +.builtin-type { + text-decoration: none; + color: #004400 !important; + /*color: green !important; + font-weight: bold;*/ +} + +.kwrd, +.highlighted-keyword, +.lang-feature, +.storage-class { + text-decoration: none; + color: #026 !important; +} + +[data-ident].active { + outline: solid 1px red; +} + +table.enum-members { + border-collapse: collapse; + border: solid 1px #ccc; + min-width: 60%; +} + +.enum-members th, +.enum-members td { + border: solid 1px #ccc; + margin: 0px; + padding: 0.25em 0.5em; +} + +.enum-members th { + text-align: left; + color: #888; +} + +.enum-members td { + vertical-align: top; +} + +.enum-members td p:first-child { + margin-top: 0px; +} + +.enum-members .enum-member-name { + font-weight: bold; + color: inherit; +} + +.enum-members .enum-member-value { + display: block; + color: #666; +} + +.enum-members .enum-disabled { + font-style: italic; +} + +.enum-members .enum-deprecated { + margin-bottom: 1em; +} + +.enum-members .enum-deprecated > span.deprecated-label { + color: red; +} + +.enum-members .enum-attributes { + margin-top: 1em; +} + +.enum-member .enum-attributes:empty { + display: none; +} + +.enum-members tr.enum-member > td:nth-child(2) > div:only-child:empty:before { + display: inline; + content: "undocumented"; + color: rgba(0, 0, 0, 0.4); + font-style: italic; +} + +*:target { + background: #ffffbb; +} + +.breadcrumbs { + margin: 1em; +} + +.breadcrumbs a::before { + content: ' \00bb\a0'; +} + +.parameter-name { + font-weight: bold; +} + +.symbol-reference, +.return-type, +.parameter-type { + font-family: monospace; +} + +.phobos-booktable { + border-collapse: collapse; + margin-bottom: 1.5em; +} + +.phobos-booktable tt.D { + font-weight: bold; + background-color: transparent; +} + +.phobos-booktable caption { + text-align: left; +} + +.phobos-booktable tr { + border-bottom: solid 1px #ccc; +} + +.phobos-booktable tr:hover { + background-color: #fafafa; +} + +.phobos-booktable { + border-top: solid 2px black; + border-bottom: solid 2px black; +} + +.phobos-booktable tr:first-child:has(th) { + border-bottom: solid 1px black; +} + +.phobos-booktable th { + text-align: left; + padding-top: 0.3em; + padding-bottom: 0.3em; +} + +.phobos-booktable td:first-child { + padding-top: 0.3em; + padding-bottom: 0.3em; + padding-right: 1em; +} + +.phobos-booktable td:not(:last-child), +.phobos-booktable th:not(:last-child) { + padding-right: 1em; +} + +.quickindex .phobos-booktable td:last-child a { + padding-right: 1.2em; +} + +.current.breadcrumb { + color: inherit; + text-decoration: none; +} + +.andand-right { + display: inline; +} + +.oror-right { + display: inline; +} + +.parenthetical-expression > .parenthetical-expression-contents > .andand-left, +.parenthetical-expression > .parenthetical-expression-contents > .oror-left { + display: inline; +} + +/* +.parenthetical-expression > .parenthetical-expression-contents > .oror-left:first-child { + display: block; +} +*/ + + +.template-constraint-expression .parenthetical-expression { + display: block; + margin-left: 1em; +} + +.oror-left > .andand-left, +.oror-left > .andand-right { + display: inline; +} + +.aggregate-members:empty::after { + content: "This aggregate has no documented members available."; +} + +h1 .entity-name { + font-family: monospace; +} + +.other-section h3 { + font-size: 1rem; + margin-bottom: 0.25em; +} + +.other-section h3 + p { + margin-top: 0.25em; +} + +.function-prototype .in-contract, +.function-prototype .out-contract { + display: none; + white-space: pre; +} + +.note { + margin: 1em; + padding: 0.5em; + background-color: #f0f0ff; + border: solid 1px #ccc; + clear: both; +} + +/* +.note::before { + color: #000066; + font-weight: bold; + content: "Note: "; +} +*/ + +.warning { + margin: 1em; + padding: 0.5em; + background-color: #fffff0; + border: solid 1px #ccc; + clear: both; +} + +.pitfall { + margin: 1em; + padding: 0.5em; + background-color: #fff0f0; + border: solid 1px #ccc; + clear: both; +} + +.tip { + margin: 1em; + padding: 0.5em; + background-color: #f0fff0; + border: solid 1px #ccc; + clear: both; +} + +.sidebar { + float: right; + margin: 1em; + margin-top: 2px; + padding: 0.25em; + background: #f3f3f3; + border: solid 1px #ccc; + width: 20%; + min-width: 30ch; + clear: right; +} + +h2 { + clear: both; +} + +.sidebar > *:first-child { + margin-top: 0px; +} + +/* I want to clear floats. This leaves a gap about the size of a blank line + too, but that doesn't bother me (actually, I kinda like a small gap at the + bottom. */ +#page-content::after { + clear: both; + content: '\a0'; + display: block; +} + +tt.D, +.inline-code { + color: black; + font-weight: 500; + background-color: #f2f2f2; + padding: 0px 0.125em; +} + +#page-nav .type-separator { + text-transform: capitalize; + display: block; + border-bottom: solid 1px #ccc; + margin-top: 1em; + margin-bottom: 0.25em; +} + +#page-nav a { + display: block; + box-sizing: border-box; + padding: 1px 0.25em 1px 0.5em; + text-overflow: ellipsis; + overflow: hidden; + font-family: "Roboto Slab", sans-serif; +} + +#page-nav a:hover { + position: relative; + overflow: visible; + z-index: 10; + background-color: rgb(245, 245, 245); + width: max-content; +} + +#page-nav a.parent { + font-weight: bold; + font-size: 1.1rem; + line-height: 0.9; + overflow: visible; +} + +#page-nav a.parent:first-child { + margin-top: 0.75em; +} + +#page-nav a.parent + a.parent::before { + content: "."; +} + +#page-nav a.current { + font-weight: bold; + color: inherit; +} + +pre[data-language=console], +pre.console { + background-color: #222; + color: #eee; + padding: 0.5em; + border: solid 1px #ccc; +} + +#more-link { + display: block; + font-weight: bold; + font-size: 1.1rem; + color: blue; +} + +.member-list dd + dt { + border-top: solid 1px #ccc; + padding-top: 0.5em; + margin-top: 0.5em; +} + +/* +.member-list dd { + max-height: 4em; + overflow: hidden; + text-overflow: ellipsis; +} +*/ + +.member-list dt a { + overflow: hidden; + text-overflow: ellipsis; +} + +.member-list dt .simplified-prototype { + font-family: monospace; + font-size: 90%; + color: #333; + white-space: nowrap; + text-overflow: ellipsis; + text-overflow: '[...]'; /* only Firefox supports this but i like it */ + overflow: hidden; + border: solid 1px white; +} + +.member-list dt .simplified-prototype:hover { + background-color: white; + position: relative; + z-index: 5; + width: 800px; + width: calc(100vw - 16em); + border: solid 1px #eee; + box-shadow: 1px 1px 1px #ccc; +} + +@media screen and (min-width: 640px) { + .member-list dt { + float: left; + clear: left; + width: 20em; + box-sizing: border-box; + padding-right: 1em; + } + + .member-list dd, + .member-list dd + dt { + border-top: solid 1px #ccc; + padding-top: 0.5em; + margin-top: 0em; + } + + .member-list dd p:first-child { + margin-top: 0px; + } + + .member-list dd:first-of-type { + border-top: none; + padding-top: 0px; + } + + .member-list dd { + margin: 0px; + margin-left: 20em; + } + + .member-list dd::after { + content: '\a0'; + height: 0.5em; + clear: both; + display: block; + } +} + +.member-list.articles dt, +.member-list.constructors dt { + float: none; + clear: none; + margin: 0em; + width: auto; + border: none; +} + +.member-list.articles dd, +.member-list.constructors dd { + float: none; + clear: none; + margin: 1em 0em; + width: auto; + border: none; +} + +.member-list.articles dd, +.member-list.constructors dd { + padding-left: 2em; +} + +.member-list dt a { + display: block; +} + +#suggestion-box { + display: inline-block; + color: white; + font-weight: bold; + border: solid 2px black; + border-radius: 8px 8px 0px 0px; + position: fixed; + left: 1em; + bottom: 0em; + padding: 0.25em 0.5em; +} + +.synopsis { + margin: 2em 0px; +} + +/* If it was successfully looked up in an xref, no need to highlight anymore */ +a.xref:link span[data-ident].active { + border: none; +} + +#table-of-contents { + border: solid 1px #ccc; + margin: 1em; + padding: 1em; + padding-left: 0em; /* the list inside can handle this */ +} + +.parent-prototype { + font-size: 0.9rem; + padding-bottom: 1em; +} + +.parent-prototype::after { + content: " {"; +} + +.parent-prototype + div { + padding-left: 1em; +} + +.parent-prototype + div::after { + content: "}"; + display: block; + font-size: 0.9rem; + padding-top: 1em; + margin-left: -1.33em; /* 1/(3/4) */ +} + +.search-result::after { + content: '(Search Score: ' attr(data-score) ')'; + font-size: 0.9rem; +} + +table.std_math { + min-width: 25%; + border: solid 1px black; + border-collapse: collapse; + margin: 2em; +} + +table.std_math td, table.std_math th { + border: solid 1px #ccc; + text-align: left; + padding: 0.25em; +} + +table.std_math.special-values th { + border-bottom: solid 2px #000; +} + +table.std_math.special-values caption { + text-align: left; + font-weight: 700; +} + +.nan { + font-family: monospace; + color: red; +} + +.overload-option, +.overload-signature { + font-family: monospace; +} + +.block-code, +.d_code, +.annotated-prototype { + font-size: 1rem; +} + +.annotated-prototype .overloads { + display: block; + padding: 0px; +} + +.annotated-prototype .overloads li { + display: block; + width: auto; + padding: 0em 0.5em; + text-align: left; + overflow: hidden; + + margin: 0; +} + +.member-list .dt, .overload-option, pre { + max-width: unset; +} + +.annotated-prototype .overloads li.active-overload-option { + border: ridge 2px #ccc; +} + +.annotated-prototype .overloads li.active-overload-option .overload-signature { + white-space: nowrap; + border-bottom: dotted 1px #999; + display: block; +} + +.annotated-prototype .overloads li.overload-option { + border: solid 1px #ccc; + background-color: #eee; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.annotated-prototype .overloads li.ditto-option::before, +.annotated-prototype .overloads li.active-overload-option .overload-signature::before, +.annotated-prototype .overloads li.overload-option::before { + display: inline-block; + width: 6em; + width: 9ch; + font-size: 0.9rem; + vertical-align: baseline; +} + +.annotated-prototype .overloads li.overload-option::before { + content: "Overload: "; +} + +.annotated-prototype .overloads li.active-overload-option .overload-signature::before { + content: "Viewing: "; +} + +.annotated-prototype .overloads li.ditto-option::before { + content: "Related: "; +} + +.annotated-prototype li .declaration-prototype, +.annotated-prototype li .aggregate-prototype, +.annotated-prototype li .function-prototype { + border: none; + padding: 0px; +} + +.annotated-prototype li .declaration-prototype { + padding: 2em 0px; +} + +#page-nav ul { + margin: 0px; + padding: 0px; + list-style: none; +} + +.parameter-name > a[href^="#"], +a.parameter-name[href^="#"] { + color: inherit; +} + + + +/* adrdox special syntax styles */ + +.small-table { + border-collapse: collapse; + min-width: 10em; +} + +.small-table td, +.small-table th { + border: solid 1px #ccc; + padding: 0.25em; +} + +.small-table thead th { + border-bottom: solid 2px #999; +} + +.small-table tbody th, +.small-table.two-axes thead th:first-child { + border-right: solid 2px #999; +} + +.small-table.two-axes td, +.small-table.two-axes th { + text-align: center; + vertical-align: middle; +} + +.adrdox-sample { + display: table; + width: 100%; +} + +.adrdox-sample > div { + display: table-row; +} + +.adrdox-sample > div > * { + display: table-cell; + width: 50%; + vertical-align: top; + border-bottom: dashed 1px #ccc; + padding: 0.25em; + padding-bottom: 0.5em; +} + +.adrdox-sample > div > pre { + border-right: dashed 1px #ccc; +} + +.adrdox-sample > div > pre::before, +.adrdox-sample > div > div::before { + display: block; + font-style: italic; + border-bottom: dashed 1px #ccc; + margin-bottom: 0.5em; + font-family: sans-serif; + font-size: 1rem; + padding: 0px; +} + +.adrdox-sample > div > pre::before { + content: 'Doc source:'; +} +.adrdox-sample > div > div::before { + content: 'Rendered:'; +} + +blockquote { + margin: 1em; + padding: 1em; + border-left: 0.5em solid #ccc; + color: #333; +} + +pre.d_code, +.block-code:not([data-language=""]):not([data-language="pre"]) { + background-color: #fcfcfc; + padding: 0.25em; + border: solid 1px #ccc; + position: relative; +} + +.block-code:not([data-language=""]):not([data-language="pre"])::before { + content: attr(data-language); + display: block; + text-transform: capitalize; + font-size: 0.9rem; + padding: 0px 2px; + border: solid 1px #999; + border-top: none; + border-radius: 0px 0px 0.25em 0.25em; + background-color: #f0f0f0; + float: right; + margin: 0px; + margin-top: -0.25em; + margin-top: calc(-0.25em - 1px); +} +.type, +.highlighted-type { + color: green; + /* font-weight: bold; */ +} +.num, +.highlighted-number { + color: #dc322f; +} +.str, +.highlighted-string { + color: red; +} +.com, +.highlighted-comment { + color: blue; +} +.highlighted-preprocessor-directive { + color: #cd00cd; +} +.highlighted-identifier, +.highlighted-tag { + color: #008888; +} +.highlighted-tag-name { + color: #859900; +} +.highlighted-entity { + color: #cd00cd; + text-decoration: none; + cursor: help; +} +.highlighted-named-constant, +.highlighted-attribute-name { + color: green; +} +.highlighted-attribute-value { + color: red; +} +.highlighted-python-indent { + background: linear-gradient(to right, #eee, transparent 3px) no-repeat; +} +.highlighted-python-indent:hover { + background: linear-gradient(to right, #ccc, transparent 3px) no-repeat; +} + +/* +.with-line-wrappers { + counter-reset: line_numbers; +} + +.with-line-wrappers span.br { + counter-increment: line_numbers; +} + +.with-line-wrappers span.br::before { + content: counter(line_numbers); +*/ +.with-line-wrappers .br { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + width: 3em; + width: 4ch; + display: inline-block; + color: #999; + border-right: solid 2px #ccc; + padding: 0px; + margin: 0px; + margin-right: 3px; + padding-right: 3px; + font-style: normal; + font-weight: normal; + background-color: transparent; + text-align: right; + white-space: pre; +} + +.hide-line-numbers .with-line-wrappers .br { + display: none; +} +.with-line-wrappers .br:target { + background: #ffffbb; +} + +.thousand-lines.with-line-wrappers .br { + width: 4em; + width: 5ch; +} +.ten-thousand-lines.with-line-wrappers .br { + width: 5em; + width: 6ch; +} + +#source-navigation { + position: fixed; + width: 15.5em; +} + +#source-navigation .list-holder { + width: 100%; + overflow: auto; + max-height: 80vh; +} + +#source-navigation .list-holder ul { + padding-left: 1em; +} + +/* hide nested decls as it is too much... */ +#source-navigation .list-holder ul > li > ul { + display: none; +} + +/* ...but show top-level decls under the module cuz no reason not to */ +#source-navigation .list-holder > ul > li > ul { + display: block; +} + +#source-navigation li { + white-space: nowrap; +} + +#source-navigation a { + display: inline; +} + +.postcondition { + color: blue; + font-family: monospace; + font-size: 0.9rem; +} +.postcondition::before { + content: "Post: "; + font-style: italic; + color: black; +} + +.user-table { + border-top: solid 2px black; + border-collapse: collapse; +} + +.user-table tr:nth-of-type(1) th { + border-bottom: solid 1px black; + text-align: left; +} + +.user-table td { + border-bottom: solid 1px #ccc; + vertical-align: top; + padding: 4px; +} +.user-table th { + padding: 4px; +} + +.user-table.two-axes tr + tr th:first-child { + border-bottom: solid 1px #ccc; +} + +.user-table.two-axes th:first-child { + border-right: solid 1px black; + text-align: right; +} + +.allocator-table td:first-child tt { + background-color: transparent; + white-space: nowrap; + font-weight: bold; +} + +.header-anchor { + color: inherit !important; +} + +#members + h3, +.member-list + h3, +h3.member-list-header { + border-bottom: solid 1px #333; + text-transform: capitalize; +} + +#members + h4, +.member-list + h4, +h4.member-list-header { + font-weight: normal; + text-transform: capitalize; + text-decoration: underline; +} + + +tr.leading-row th { + border-bottom: solid 2px black; +} + +.lambda-expression * { + display: inline !important; + padding: 0px !important; + margin: 0px !important; +} + +.footnote-ref a {} +.footnote-ref abbr { + font-variant: none; + text-decoration: none; + cursor: help; +} + +.side-by-side { + table-layout: fixed; + border: none; + width: 100%; +} + +.side-by-side > tbody > tr > td { + vertical-align: top; +} + +/* +tt.D { + font-weight: bold; + background: transparent; + color: inherit; +} +*/ + +tt.D.highlighted *:not(a) { + font-weight: inherit; + color: inherit; +} +tt.D.highlighted a { + color: #500000; +} + +.date-posted { + font-size: 0.9rem; + font-style: italic; +} + +.token-string-literal { + font-style: italic; +} +.token-string-literal:hover { + background-color: rgba(255, 0, 0, 0.05); +} + +.specially-highlighted { + background-color: yellow; + background-color: rgba(255, 255, 0, 0.5); +} + +.console .specially-highlighted { + background-color: rgba(255, 255, 0, 1.0); + color: black; +} + +.quickindex { + background: #f5f5f5; + max-width: 760px; +} + +.quickindex .phobos-booktable { + width: 100%; +} + +.leading-row { + font-style: italic; + background-color: rgb(228, 233, 239); +} + +.leading-row th { + padding-left: 1.5em; +} + +.quickindex td, .quickindex th { + padding-left: 0.3em; +} + +.undocumented-note { + color: #999; +} + +.deprecated-decl { + color: #c00; + font-weight: bold; +} + +.conditional-compilation-attributes { + font-size: 90%; +} + +@media (prefers-color-scheme: dark) { + body { + color: #ddd; + background-color: black; + } + + a:link, a:visited { + color: #00aaff !important; + } + + #page-nav { + background-color: #333 !important; + } + + tt.D, + .inline-code { + background-color: #444; + color: #eee; + } + + .block-code:not([data-language=""]):not([data-language="pre"]), + pre.d_code { + background-color: #444; + color: #eee; + } + + .tip { + background-color: #306630; + } + + .pitfall { + background-color: #663030; + } + + .warning { + background-color: #666630; + } + + .note { + background-color: #3333aa; + } + + .sidebar { + background-color: #555; + } + + .member-list dt .simplified-prototype { + color: #aaa; + border-color: black; + } + + .member-list dt .simplified-prototype:hover { + background-color: black; + border-color: #555; + } + + .highlighted-comment, + .com { + color: #0ff !important; + } + + .kwrd, + .highlighted-keyword, + .lang-feature, + .storage-class { + color: #8ff !important; + } + + .type-constructor, + .builtin-type { + color: #00cc00 !important; + } + + .type, + .highlighted-type { + color: lime; + } +} +