Search in sources :

Example 1 with RequestHeader

use of org.springframework.web.bind.annotation.RequestHeader in project nakadi by zalando.

the class EventStreamController method streamEvents.

@RequestMapping(value = "/event-types/{name}/events", method = RequestMethod.GET)
public StreamingResponseBody streamEvents(@PathVariable("name") final String eventTypeName, @Nullable @RequestParam(value = "batch_limit", required = false) final Integer batchLimit, @Nullable @RequestParam(value = "stream_limit", required = false) final Integer streamLimit, @Nullable @RequestParam(value = "batch_flush_timeout", required = false) final Integer batchTimeout, @Nullable @RequestParam(value = "stream_timeout", required = false) final Integer streamTimeout, @Nullable @RequestParam(value = "stream_keep_alive_limit", required = false) final Integer streamKeepAliveLimit, @Nullable @RequestHeader(name = "X-nakadi-cursors", required = false) final String cursorsStr, final HttpServletRequest request, final HttpServletResponse response, final Client client) {
    final String flowId = FlowIdUtils.peek();
    return outputStream -> {
        FlowIdUtils.push(flowId);
        if (blacklistService.isConsumptionBlocked(eventTypeName, client.getClientId())) {
            writeProblemResponse(response, outputStream, Problem.valueOf(Response.Status.FORBIDDEN, "Application or event type is blocked"));
            return;
        }
        final AtomicBoolean connectionReady = closedConnectionsCrutch.listenForConnectionClose(request);
        Counter consumerCounter = null;
        EventStream eventStream = null;
        List<ConnectionSlot> connectionSlots = ImmutableList.of();
        final AtomicBoolean needCheckAuthorization = new AtomicBoolean(false);
        LOG.info("[X-NAKADI-CURSORS] \"{}\" {}", eventTypeName, Optional.ofNullable(cursorsStr).orElse("-"));
        try (Closeable ignore = eventTypeChangeListener.registerListener(et -> needCheckAuthorization.set(true), Collections.singletonList(eventTypeName))) {
            final EventType eventType = eventTypeRepository.findByName(eventTypeName);
            authorizeStreamRead(eventTypeName);
            // validate parameters
            final EventStreamConfig streamConfig = EventStreamConfig.builder().withBatchLimit(batchLimit).withStreamLimit(streamLimit).withBatchTimeout(batchTimeout).withStreamTimeout(streamTimeout).withStreamKeepAliveLimit(streamKeepAliveLimit).withEtName(eventTypeName).withConsumingClient(client).withCursors(getStreamingStart(eventType, cursorsStr)).withMaxMemoryUsageBytes(maxMemoryUsageBytes).build();
            // acquire connection slots to limit the number of simultaneous connections from one client
            if (featureToggleService.isFeatureEnabled(LIMIT_CONSUMERS_NUMBER)) {
                final List<String> partitions = streamConfig.getCursors().stream().map(NakadiCursor::getPartition).collect(Collectors.toList());
                connectionSlots = consumerLimitingService.acquireConnectionSlots(client.getClientId(), eventTypeName, partitions);
            }
            consumerCounter = metricRegistry.counter(metricNameFor(eventTypeName, CONSUMERS_COUNT_METRIC_NAME));
            consumerCounter.inc();
            final String kafkaQuotaClientId = getKafkaQuotaClientId(eventTypeName, client);
            response.setStatus(HttpStatus.OK.value());
            response.setHeader("Warning", "299 - nakadi - the Low-level API is deprecated and will " + "be removed from a future release. Please consider migrating to the Subscriptions API.");
            response.setContentType("application/x-json-stream");
            final EventConsumer eventConsumer = timelineService.createEventConsumer(kafkaQuotaClientId, streamConfig.getCursors());
            final String bytesFlushedMetricName = MetricUtils.metricNameForLoLAStream(client.getClientId(), eventTypeName);
            final Meter bytesFlushedMeter = this.streamMetrics.meter(bytesFlushedMetricName);
            eventStream = eventStreamFactory.createEventStream(outputStream, eventConsumer, streamConfig, bytesFlushedMeter);
            // Flush status code to client
            outputStream.flush();
            eventStream.streamEvents(connectionReady, () -> {
                if (needCheckAuthorization.getAndSet(false)) {
                    authorizeStreamRead(eventTypeName);
                }
            });
        } catch (final UnparseableCursorException e) {
            LOG.debug("Incorrect syntax of X-nakadi-cursors header: {}. Respond with BAD_REQUEST.", e.getCursors(), e);
            writeProblemResponse(response, outputStream, BAD_REQUEST, e.getMessage());
        } catch (final NoSuchEventTypeException e) {
            writeProblemResponse(response, outputStream, NOT_FOUND, "topic not found");
        } catch (final NoConnectionSlotsException e) {
            LOG.debug("Connection creation failed due to exceeding max connection count");
            writeProblemResponse(response, outputStream, e.asProblem());
        } catch (final NakadiException e) {
            LOG.error("Error while trying to stream events.", e);
            writeProblemResponse(response, outputStream, e.asProblem());
        } catch (final InvalidCursorException e) {
            writeProblemResponse(response, outputStream, PRECONDITION_FAILED, e.getMessage());
        } catch (final AccessDeniedException e) {
            writeProblemResponse(response, outputStream, FORBIDDEN, e.explain());
        } catch (final Exception e) {
            LOG.error("Error while trying to stream events. Respond with INTERNAL_SERVER_ERROR.", e);
            writeProblemResponse(response, outputStream, INTERNAL_SERVER_ERROR, e.getMessage());
        } finally {
            connectionReady.set(false);
            consumerLimitingService.releaseConnectionSlots(connectionSlots);
            if (consumerCounter != null) {
                consumerCounter.dec();
            }
            if (eventStream != null) {
                eventStream.close();
            }
            try {
                outputStream.flush();
            } finally {
                outputStream.close();
            }
        }
    };
}
Also used : PathVariable(org.springframework.web.bind.annotation.PathVariable) RequestParam(org.springframework.web.bind.annotation.RequestParam) FlowIdUtils(org.zalando.nakadi.util.FlowIdUtils) LoggerFactory(org.slf4j.LoggerFactory) Autowired(org.springframework.beans.factory.annotation.Autowired) NakadiException(org.zalando.nakadi.exceptions.NakadiException) NoSuchEventTypeException(org.zalando.nakadi.exceptions.NoSuchEventTypeException) ServiceUnavailableException(org.zalando.nakadi.exceptions.ServiceUnavailableException) Problem(org.zalando.problem.Problem) Map(java.util.Map) Counter(com.codahale.metrics.Counter) TimelineService(org.zalando.nakadi.service.timeline.TimelineService) TypeReference(com.fasterxml.jackson.core.type.TypeReference) FeatureToggleService(org.zalando.nakadi.service.FeatureToggleService) EventTypeChangeListener(org.zalando.nakadi.service.EventTypeChangeListener) BAD_REQUEST(javax.ws.rs.core.Response.Status.BAD_REQUEST) ConsumerLimitingService(org.zalando.nakadi.service.ConsumerLimitingService) TopicRepository(org.zalando.nakadi.repository.TopicRepository) ConnectionSlot(org.zalando.nakadi.service.ConnectionSlot) NOT_FOUND(javax.ws.rs.core.Response.Status.NOT_FOUND) PartitionStatistics(org.zalando.nakadi.domain.PartitionStatistics) RequestMethod(org.springframework.web.bind.annotation.RequestMethod) StreamingResponseBody(org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody) InvalidCursorException(org.zalando.nakadi.exceptions.InvalidCursorException) BlacklistService(org.zalando.nakadi.service.BlacklistService) RestController(org.springframework.web.bind.annotation.RestController) Collectors(java.util.stream.Collectors) List(java.util.List) Response(javax.ws.rs.core.Response) Timeline(org.zalando.nakadi.domain.Timeline) ServiceTemporarilyUnavailableException(org.zalando.nakadi.exceptions.runtime.ServiceTemporarilyUnavailableException) Optional(java.util.Optional) RequestHeader(org.springframework.web.bind.annotation.RequestHeader) UnparseableCursorException(org.zalando.nakadi.exceptions.UnparseableCursorException) Client(org.zalando.nakadi.security.Client) Storage(org.zalando.nakadi.domain.Storage) ClosedConnectionsCrutch(org.zalando.nakadi.service.ClosedConnectionsCrutch) NakadiCursor(org.zalando.nakadi.domain.NakadiCursor) RequestMapping(org.springframework.web.bind.annotation.RequestMapping) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Cursor(org.zalando.nakadi.view.Cursor) ArrayList(java.util.ArrayList) Value(org.springframework.beans.factory.annotation.Value) Meter(com.codahale.metrics.Meter) HttpServletRequest(javax.servlet.http.HttpServletRequest) ImmutableList(com.google.common.collect.ImmutableList) EventStreamFactory(org.zalando.nakadi.service.EventStreamFactory) Qualifier(org.springframework.beans.factory.annotation.Qualifier) PRECONDITION_FAILED(javax.ws.rs.core.Response.Status.PRECONDITION_FAILED) Nullable(javax.annotation.Nullable) OutputStream(java.io.OutputStream) AccessDeniedException(org.zalando.nakadi.exceptions.runtime.AccessDeniedException) EventType(org.zalando.nakadi.domain.EventType) MetricRegistry(com.codahale.metrics.MetricRegistry) Logger(org.slf4j.Logger) INTERNAL_SERVER_ERROR(javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) HttpServletResponse(javax.servlet.http.HttpServletResponse) MetricUtils.metricNameFor(org.zalando.nakadi.metrics.MetricUtils.metricNameFor) IOException(java.io.IOException) FORBIDDEN(javax.ws.rs.core.Response.Status.FORBIDDEN) EventStream(org.zalando.nakadi.service.EventStream) AuthorizationValidator(org.zalando.nakadi.service.AuthorizationValidator) HttpStatus(org.springframework.http.HttpStatus) EventConsumer(org.zalando.nakadi.repository.EventConsumer) EventTypeRepository(org.zalando.nakadi.repository.EventTypeRepository) Closeable(java.io.Closeable) NoConnectionSlotsException(org.zalando.nakadi.exceptions.NoConnectionSlotsException) LIMIT_CONSUMERS_NUMBER(org.zalando.nakadi.service.FeatureToggleService.Feature.LIMIT_CONSUMERS_NUMBER) CursorError(org.zalando.nakadi.domain.CursorError) VisibleForTesting(com.google.common.annotations.VisibleForTesting) MetricUtils(org.zalando.nakadi.metrics.MetricUtils) EventStreamConfig(org.zalando.nakadi.service.EventStreamConfig) InternalNakadiException(org.zalando.nakadi.exceptions.InternalNakadiException) Collections(java.util.Collections) CursorConverter(org.zalando.nakadi.service.CursorConverter) AccessDeniedException(org.zalando.nakadi.exceptions.runtime.AccessDeniedException) NakadiCursor(org.zalando.nakadi.domain.NakadiCursor) EventType(org.zalando.nakadi.domain.EventType) Meter(com.codahale.metrics.Meter) Closeable(java.io.Closeable) InvalidCursorException(org.zalando.nakadi.exceptions.InvalidCursorException) UnparseableCursorException(org.zalando.nakadi.exceptions.UnparseableCursorException) NakadiException(org.zalando.nakadi.exceptions.NakadiException) NoSuchEventTypeException(org.zalando.nakadi.exceptions.NoSuchEventTypeException) ServiceUnavailableException(org.zalando.nakadi.exceptions.ServiceUnavailableException) InvalidCursorException(org.zalando.nakadi.exceptions.InvalidCursorException) ServiceTemporarilyUnavailableException(org.zalando.nakadi.exceptions.runtime.ServiceTemporarilyUnavailableException) UnparseableCursorException(org.zalando.nakadi.exceptions.UnparseableCursorException) AccessDeniedException(org.zalando.nakadi.exceptions.runtime.AccessDeniedException) IOException(java.io.IOException) NoConnectionSlotsException(org.zalando.nakadi.exceptions.NoConnectionSlotsException) InternalNakadiException(org.zalando.nakadi.exceptions.InternalNakadiException) NakadiException(org.zalando.nakadi.exceptions.NakadiException) InternalNakadiException(org.zalando.nakadi.exceptions.InternalNakadiException) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) EventStreamConfig(org.zalando.nakadi.service.EventStreamConfig) EventConsumer(org.zalando.nakadi.repository.EventConsumer) Counter(com.codahale.metrics.Counter) EventStream(org.zalando.nakadi.service.EventStream) List(java.util.List) ArrayList(java.util.ArrayList) ImmutableList(com.google.common.collect.ImmutableList) NoConnectionSlotsException(org.zalando.nakadi.exceptions.NoConnectionSlotsException) NoSuchEventTypeException(org.zalando.nakadi.exceptions.NoSuchEventTypeException) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Example 2 with RequestHeader

use of org.springframework.web.bind.annotation.RequestHeader in project com.revolsys.open by revolsys.

the class WebMethodHandler method requestHeader.

public static WebParameterHandler requestHeader(final WebAnnotationMethodHandlerAdapter adapter, final Parameter parameter, final Annotation annotation) {
    final Class<?> parameterClass = parameter.getType();
    final DataType dataType = DataTypes.getDataType(parameterClass);
    final RequestHeader requestHeader = (RequestHeader) annotation;
    final String name = getName(parameter, requestHeader.value());
    final boolean required = requestHeader.required();
    final Object defaultValue = parseDefaultValueAttribute(dataType, requestHeader.defaultValue());
    return // 
    WebParameterHandler.function(// 
    name, (request, response) -> {
        return request.getHeader(name);
    }, // 
    dataType, // 
    required, // 
    defaultValue);
}
Also used : DataType(com.revolsys.datatype.DataType) RequestHeader(org.springframework.web.bind.annotation.RequestHeader)

Example 3 with RequestHeader

use of org.springframework.web.bind.annotation.RequestHeader in project spring-framework by spring-projects.

the class RequestHeaderMethodArgumentResolver method createNamedValueInfo.

@Override
protected NamedValueInfo createNamedValueInfo(MethodParameter parameter) {
    RequestHeader ann = parameter.getParameterAnnotation(RequestHeader.class);
    Assert.state(ann != null, "No RequestHeader annotation");
    return new RequestHeaderNamedValueInfo(ann);
}
Also used : RequestHeader(org.springframework.web.bind.annotation.RequestHeader)

Example 4 with RequestHeader

use of org.springframework.web.bind.annotation.RequestHeader in project java-chassis by ServiceComb.

the class RequestHeaderAnnotationProcessor method fillParameter.

@Override
protected void fillParameter(Object annotation, OperationGenerator operationGenerator, int paramIdx, HeaderParameter parameter) {
    super.fillParameter(annotation, operationGenerator, paramIdx, parameter);
    RequestHeader requestHeader = (RequestHeader) annotation;
    parameter.setRequired(requestHeader.required());
}
Also used : RequestHeader(org.springframework.web.bind.annotation.RequestHeader)

Example 5 with RequestHeader

use of org.springframework.web.bind.annotation.RequestHeader in project judge by zjnu-acm.

the class MockGenerator method generate.

private void generate(Class<?> key, RequestMappingInfo requestMappingInfo, HandlerMethod handlerMethod, String url, TestClass testClass, String lowerMethod) {
    Method method = handlerMethod.getMethod();
    StringWriter sw = new StringWriter();
    PrintWriter out = new PrintWriter(sw);
    out.println("/**");
    out.println(" * Test of " + method.getName() + " method, of class " + key.getSimpleName() + ".");
    for (Class<?> type : method.getParameterTypes()) {
        testClass.addImport(type);
    }
    out.println(" *");
    out.println(" * @see " + key.getSimpleName() + "#" + method.getName() + Arrays.stream(method.getParameterTypes()).map(Class::getSimpleName).collect(Collectors.joining(", ", "(", ")")));
    out.println(" */");
    testClass.addImport(Test.class);
    out.println("@Test");
    out.println("public void test" + f(method.getName()) + "() throws Exception {");
    out.println("\tlog.info(\"" + method.getName() + "\");");
    List<String> variableDeclares = new ArrayList<>(4);
    Map<String, Class<?>> params = new LinkedHashMap<>(4);
    String body = null;
    Class<?> bodyType = null;
    MethodParameter[] methodParameters = handlerMethod.getMethodParameters();
    Parameter[] parameters = method.getParameters();
    List<String> files = new ArrayList<>(4);
    List<String> pathVariables = new ArrayList<>(4);
    List<String> headers = new ArrayList<>(4);
    String locale = null;
    for (MethodParameter methodParameter : methodParameters) {
        Class<?> type = methodParameter.getParameterType();
        String typeName = type.getSimpleName();
        String name = "";
        testClass.addImport(type);
        boolean unknown = false;
        if (methodParameter.hasParameterAnnotation(RequestParam.class)) {
            RequestParam requestParam = methodParameter.getParameterAnnotation(RequestParam.class);
            name = requestParam.value();
            if (name.isEmpty()) {
                name = requestParam.name();
            }
        } else if (methodParameter.hasParameterAnnotation(PathVariable.class)) {
            PathVariable pathVariable = methodParameter.getParameterAnnotation(PathVariable.class);
            name = pathVariable.value();
            if (name.isEmpty()) {
                name = pathVariable.name();
            }
            if (name.isEmpty()) {
                name = parameters[methodParameter.getParameterIndex()].getName();
            }
            pathVariables.add(name);
            variableDeclares.add("\t" + typeName + " " + name + " = " + getDefaultValue(type) + ";");
            continue;
        } else if (methodParameter.hasParameterAnnotation(RequestBody.class)) {
            body = "request";
            bodyType = type;
            variableDeclares.add("\t" + typeName + " request = " + getDefaultValue(type) + ";");
            continue;
        } else if (methodParameter.hasParameterAnnotation(RequestHeader.class)) {
            RequestHeader requestHeader = methodParameter.getParameterAnnotation(RequestHeader.class);
            name = requestHeader.value();
            if (name.isEmpty()) {
                name = requestHeader.name();
            }
            if (name.isEmpty()) {
                name = parameters[methodParameter.getParameterIndex()].getName();
            }
            headers.add(name);
            variableDeclares.add("\t" + typeName + " " + name + " = " + getDefaultValue(type) + ";");
            continue;
        } else if (HttpServletResponse.class == type || HttpServletRequest.class == type) {
            continue;
        } else if (Locale.class == type) {
            locale = "locale";
            variableDeclares.add("\t" + typeName + " " + locale + " = Locale.getDefault();");
            continue;
        } else {
            unknown = true;
        }
        if (name.isEmpty()) {
            name = parameters[methodParameter.getParameterIndex()].getName();
        }
        if (unknown && type.getClassLoader() != null && type != MultipartFile.class) {
            ReflectionUtils.doWithFields(type, field -> process(field.getName(), field.getType(), params, files, variableDeclares, testClass, method, lowerMethod), field -> !Modifier.isStatic(field.getModifiers()));
            continue;
        } else if (unknown) {
            System.err.println("param " + methodParameter.getParameterIndex() + " with type " + typeName + " in " + method + " has no annotation");
        }
        process(name, type, params, files, variableDeclares, testClass, method, lowerMethod);
    }
    for (String variableDeclare : variableDeclares) {
        out.println(variableDeclare);
    }
    testClass.addImport(MvcResult.class);
    if (files.isEmpty()) {
        testClass.addStaticImport("org.springframework.test.web.servlet.request.MockMvcRequestBuilders." + lowerMethod);
        out.print("\tMvcResult result = mvc.perform(" + lowerMethod + "(" + url);
        for (String pathVariable : pathVariables) {
            out.print(", " + pathVariable);
        }
        out.print(")");
    } else {
        testClass.addStaticImport("org.springframework.test.web.servlet.request.MockMvcRequestBuilders.fileUpload");
        out.print("\tMvcResult result = mvc.perform(fileUpload(" + url);
        for (String pathVariable : pathVariables) {
            out.print(", " + pathVariable);
        }
        out.print(")");
        for (String file : files) {
            out.print(".file(" + file + ")");
        }
    }
    boolean newLine = params.size() >= 2;
    for (Map.Entry<String, Class<?>> entry : params.entrySet()) {
        String param = entry.getKey();
        Class<? extends Object> paramType = entry.getValue();
        String value;
        if (paramType.isPrimitive()) {
            value = com.google.common.primitives.Primitives.wrap(paramType).getSimpleName() + ".toString(" + param + ")";
        } else if (paramType == String.class) {
            value = param;
        } else {
            testClass.addImport(Objects.class);
            value = "Objects.toString(" + param + ", \"\")";
        }
        if (newLine) {
            out.println();
            out.print("\t\t\t");
        }
        out.print(".param(\"" + param + "\", " + value + ")");
    }
    for (String header : headers) {
        out.println();
        out.print("\t\t\t.header(\"" + header + "\", " + header + ")");
    }
    if (locale != null) {
        out.println();
        out.print("\t\t\t.locale(" + locale + ")");
    }
    switch(lowerMethod) {
        case "get":
        case "delete":
            if (body != null) {
                System.err.println("RequestBody annotation found on " + method + " with request method " + lowerMethod);
            }
            if (!requestMappingInfo.getConsumesCondition().isEmpty()) {
                System.err.println("request consumes " + requestMappingInfo.getConsumesCondition() + " found on " + method);
            }
    }
    if (body != null) {
        out.println();
        if (bodyType == String.class || bodyType == byte[].class) {
            out.print("\t\t\t.content(" + body + ")");
        } else {
            testClass.addField(ObjectMapper.class, "objectMapper", "@Autowired");
            out.print("\t\t\t.content(objectMapper.writeValueAsString(" + body + "))");
        }
        testClass.addImport(MediaType.class);
        out.print(".contentType(MediaType.APPLICATION_JSON)");
    }
    testClass.addStaticImport("org.springframework.test.web.servlet.result.MockMvcResultMatchers.status");
    out.println(")");
    out.println("\t\t\t.andExpect(status().isOk())");
    out.println("\t\t\t.andReturn();");
    out.println("}");
    testClass.addMethod(sw.toString());
}
Also used : Locale(java.util.Locale) RequestParam(org.springframework.web.bind.annotation.RequestParam) ArrayList(java.util.ArrayList) LinkedHashMap(java.util.LinkedHashMap) HttpServletRequest(javax.servlet.http.HttpServletRequest) MockMultipartFile(org.springframework.mock.web.MockMultipartFile) MultipartFile(org.springframework.web.multipart.MultipartFile) StringWriter(java.io.StringWriter) PrintWriter(java.io.PrintWriter) HttpServletResponse(javax.servlet.http.HttpServletResponse) HandlerMethod(org.springframework.web.method.HandlerMethod) Method(java.lang.reflect.Method) RequestMethod(org.springframework.web.bind.annotation.RequestMethod) CtMethod(org.apache.ibatis.javassist.CtMethod) Objects(java.util.Objects) MethodParameter(org.springframework.core.MethodParameter) Parameter(java.lang.reflect.Parameter) RequestHeader(org.springframework.web.bind.annotation.RequestHeader) MethodParameter(org.springframework.core.MethodParameter) Map(java.util.Map) ImmutableMap(com.google.common.collect.ImmutableMap) LinkedHashMap(java.util.LinkedHashMap) PathVariable(org.springframework.web.bind.annotation.PathVariable)

Aggregations

RequestHeader (org.springframework.web.bind.annotation.RequestHeader)7 ArrayList (java.util.ArrayList)2 Map (java.util.Map)2 HttpServletRequest (javax.servlet.http.HttpServletRequest)2 HttpServletResponse (javax.servlet.http.HttpServletResponse)2 PathVariable (org.springframework.web.bind.annotation.PathVariable)2 RequestMethod (org.springframework.web.bind.annotation.RequestMethod)2 RequestParam (org.springframework.web.bind.annotation.RequestParam)2 Counter (com.codahale.metrics.Counter)1 Meter (com.codahale.metrics.Meter)1 MetricRegistry (com.codahale.metrics.MetricRegistry)1 TypeReference (com.fasterxml.jackson.core.type.TypeReference)1 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)1 VisibleForTesting (com.google.common.annotations.VisibleForTesting)1 ImmutableList (com.google.common.collect.ImmutableList)1 ImmutableMap (com.google.common.collect.ImmutableMap)1 DataType (com.revolsys.datatype.DataType)1 Closeable (java.io.Closeable)1 IOException (java.io.IOException)1 OutputStream (java.io.OutputStream)1