# rpc-no-client-streaming

Source: https://apigenie.pl/docs/linter/protobuf/rules/rpc-no-client-streaming

This rule checks whether any RPC uses client streaming.

## Rule Details

Client-streaming RPCs, whose request is declared with `stream`, are not supported by every
transport: gRPC-Web and most HTTP/JSON gateways, for example, cannot carry them. They are also
harder to retry, load-balance and debug than unary RPCs.

The `rpc-no-client-streaming` rule reports `RPC '<rpc>' should not use client streaming` for
every RPC with a streamed request, including bidirectional streaming RPCs.

The rule is only part of the `all` ruleset.

## Configuration

This rule has no options.

## Examples

**Good**.

```proto
syntax = "proto3";

package acme.pets.v1;

service PetService {
  rpc UploadPhoto(UploadPhotoRequest) returns (UploadPhotoResponse);
}

message UploadPhotoRequest {
  bytes photo = 1;
}

message UploadPhotoResponse {
  string url = 1;
}
```

**Bad**. The linter reports `RPC 'UploadPhotos' should not use client streaming`.

```proto
syntax = "proto3";

package acme.pets.v1;

service PetService {
  rpc UploadPhotos(stream UploadPhotosRequest) returns (UploadPhotosResponse);
}

message UploadPhotosRequest {
  bytes photo = 1;
}

message UploadPhotosResponse {
  repeated string urls = 1;
}
```

## When Not to Use It

You may disable this rule if all clients use a transport that supports streaming, such as gRPC
over HTTP/2. To allow a single RPC, add an `// apigenie-lint-disable rpc-no-client-streaming`
comment to it.

## Compatibility

This rule is compatible with proto3 files. proto2 and editions files are rejected by the reader
and are not linted.
