Git-Raw

 view release on metacpan or  search on metacpan

deps/libgit2/deps/http-parser/http_parser.c  view on Meta::CPAN

  }                                                                  \
} while (0)


#define PROXY_CONNECTION "proxy-connection"
#define CONNECTION "connection"
#define CONTENT_LENGTH "content-length"
#define TRANSFER_ENCODING "transfer-encoding"
#define UPGRADE "upgrade"
#define CHUNKED "chunked"
#define KEEP_ALIVE "keep-alive"
#define CLOSE "close"


static const char *method_strings[] =
  {
#define XX(num, name, string) #string,
  HTTP_METHOD_MAP(XX)
#undef XX
  };

deps/libgit2/deps/http-parser/http_parser.c  view on Meta::CPAN

  , h_matching_content_length
  , h_matching_transfer_encoding
  , h_matching_upgrade

  , h_connection
  , h_content_length
  , h_transfer_encoding
  , h_upgrade

  , h_matching_transfer_encoding_chunked
  , h_matching_connection_keep_alive
  , h_matching_connection_close

  , h_transfer_encoding_chunked
  , h_connection_keep_alive
  , h_connection_close
  };

enum http_host_state
  {
    s_http_host_dead = 1
  , s_http_userinfo_start
  , s_http_userinfo
  , s_http_host_start
  , s_http_host_v6_start

deps/libgit2/deps/http-parser/http_parser.c  view on Meta::CPAN



#if HTTP_PARSER_STRICT
# define STRICT_CHECK(cond)                                          \
do {                                                                 \
  if (cond) {                                                        \
    SET_ERRNO(HPE_STRICT);                                           \
    goto error;                                                      \
  }                                                                  \
} while (0)
# define NEW_MESSAGE() (http_should_keep_alive(parser) ? start_state : s_dead)
#else
# define STRICT_CHECK(cond)
# define NEW_MESSAGE() start_state
#endif


/* Map errno values to strings for human-readable output */
#define HTTP_STRERROR_GEN(n, s) { "HPE_" #n, s },
static struct {
  const char *name;

deps/libgit2/deps/http-parser/http_parser.c  view on Meta::CPAN

          case h_content_length:
            if (!IS_NUM(ch)) {
              SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
              goto error;
            }

            parser->content_length = ch - '0';
            break;

          case h_connection:
            /* looking for 'Connection: keep-alive' */
            if (c == 'k') {
              parser->header_state = h_matching_connection_keep_alive;
            /* looking for 'Connection: close' */
            } else if (c == 'c') {
              parser->header_state = h_matching_connection_close;
            } else {
              parser->header_state = h_general;
            }
            break;

          default:
            parser->header_state = h_general;

deps/libgit2/deps/http-parser/http_parser.c  view on Meta::CPAN

          case h_matching_transfer_encoding_chunked:
            parser->index++;
            if (parser->index > sizeof(CHUNKED)-1
                || c != CHUNKED[parser->index]) {
              parser->header_state = h_general;
            } else if (parser->index == sizeof(CHUNKED)-2) {
              parser->header_state = h_transfer_encoding_chunked;
            }
            break;

          /* looking for 'Connection: keep-alive' */
          case h_matching_connection_keep_alive:
            parser->index++;
            if (parser->index > sizeof(KEEP_ALIVE)-1
                || c != KEEP_ALIVE[parser->index]) {
              parser->header_state = h_general;
            } else if (parser->index == sizeof(KEEP_ALIVE)-2) {
              parser->header_state = h_connection_keep_alive;
            }
            break;

          /* looking for 'Connection: close' */
          case h_matching_connection_close:
            parser->index++;
            if (parser->index > sizeof(CLOSE)-1 || c != CLOSE[parser->index]) {
              parser->header_state = h_general;
            } else if (parser->index == sizeof(CLOSE)-2) {
              parser->header_state = h_connection_close;
            }
            break;

          case h_transfer_encoding_chunked:
          case h_connection_keep_alive:
          case h_connection_close:
            if (ch != ' ') parser->header_state = h_general;
            break;

          default:
            parser->state = s_header_value;
            parser->header_state = h_general;
            break;
        }
        break;
      }

      case s_header_almost_done:
      {
        STRICT_CHECK(ch != LF);

        parser->state = s_header_value_lws;

        switch (parser->header_state) {
          case h_connection_keep_alive:
            parser->flags |= F_CONNECTION_KEEP_ALIVE;
            break;
          case h_connection_close:
            parser->flags |= F_CONNECTION_CLOSE;
            break;
          case h_transfer_encoding_chunked:
            parser->flags |= F_CHUNKED;
            break;
          default:
            break;

deps/libgit2/deps/http-parser/http_parser.c  view on Meta::CPAN


  if ((parser->flags & F_CHUNKED) || parser->content_length != ULLONG_MAX) {
    return 0;
  }

  return 1;
}


int
http_should_keep_alive (const http_parser *parser)
{
  if (parser->http_major > 0 && parser->http_minor > 0) {
    /* HTTP/1.1 */
    if (parser->flags & F_CONNECTION_CLOSE) {
      return 0;
    }
  } else {
    /* HTTP/1.0 or earlier */
    if (!(parser->flags & F_CONNECTION_KEEP_ALIVE)) {
      return 0;

deps/libgit2/deps/http-parser/http_parser.h  view on Meta::CPAN


void http_parser_init(http_parser *parser, enum http_parser_type type);


size_t http_parser_execute(http_parser *parser,
                           const http_parser_settings *settings,
                           const char *data,
                           size_t len);


/* If http_should_keep_alive() in the on_headers_complete or
 * on_message_complete callback returns 0, then this should be
 * the last message on the connection.
 * If you are the server, respond with the "Connection: close" header.
 * If you are the client, close the connection.
 */
int http_should_keep_alive(const http_parser *parser);

/* Returns a string version of the HTTP method. */
const char *http_method_str(enum http_method m);

/* Return a string name of the given error */
const char *http_errno_name(enum http_errno err);

/* Return a string description of the given error */
const char *http_errno_description(enum http_errno err);

deps/libgit2/src/libgit2/transports/http.c  view on Meta::CPAN


	while (stream->state == HTTP_STATE_NONE &&
	       stream->replay_count < GIT_HTTP_REPLAY_MAX) {

		git_net_url_dispose(&url);
		git_http_response_dispose(&response);

		/*
		 * If we're authenticating with a connection-based mechanism
		 * (NTLM, Kerberos), send a "probe" packet.  Servers SHOULD
		 * authenticate an entire keep-alive connection, so ideally
		 * we should not need to authenticate but some servers do
		 * not support this.  By sending a probe packet, we'll be
		 * able to follow up with a second POST using the actual
		 * data (and, in the degenerate case, the authentication
		 * header as well).
		 */
		if (needs_probe(stream) && (error = send_probe(stream)) < 0)
			goto done;

		/* Send the regular POST request. */

deps/libgit2/src/libgit2/transports/httpclient.c  view on Meta::CPAN

static git_http_auth_scheme auth_schemes[] = {
	{ GIT_HTTP_AUTH_NEGOTIATE, "Negotiate", GIT_CREDENTIAL_DEFAULT, git_http_auth_negotiate },
	{ GIT_HTTP_AUTH_NTLM, "NTLM", GIT_CREDENTIAL_USERPASS_PLAINTEXT, git_http_auth_ntlm },
	{ GIT_HTTP_AUTH_BASIC, "Basic", GIT_CREDENTIAL_USERPASS_PLAINTEXT, git_http_auth_basic },
};

/*
 * Use a 16kb read buffer to match the maximum size of a TLS packet.  This
 * is critical for compatibility with SecureTransport, which will always do
 * a network read on every call, even if it has data buffered to return to
 * you.  That buffered data may be the _end_ of a keep-alive response, so
 * if SecureTransport performs another network read, it will wait until the
 * server ultimately times out before it returns that buffered data to you.
 * Since SecureTransport only reads a single TLS packet at a time, by
 * calling it with a read buffer that is the maximum size of a TLS packet,
 * we ensure that it will never buffer.
 */
#define GIT_READ_BUFFER_SIZE (16 * 1024)

typedef struct {
	git_net_url url;

deps/libgit2/src/libgit2/transports/httpclient.c  view on Meta::CPAN

	http_client_state state;

	http_parser parser;

	git_http_server server;
	git_http_server proxy;

	unsigned request_count;
	unsigned connected : 1,
	         proxy_connected : 1,
	         keepalive : 1,
	         request_chunked : 1;

	/* Temporary buffers to avoid extra mallocs */
	git_str request_msg;
	git_str read_buf;

	/* A subset of information from the request */
	size_t request_body_len,
	       request_body_remain;

deps/libgit2/src/libgit2/transports/httpclient.c  view on Meta::CPAN

		ctx->parse_header_state = PARSE_HEADER_COMPLETE;
		break;

	default:
		git_error_set(GIT_ERROR_HTTP,
		              "header completion at unexpected time");
		return ctx->parse_status = PARSE_STATUS_ERROR;
	}

	ctx->response->status = parser->status_code;
	ctx->client->keepalive = http_should_keep_alive(parser);

	/* Prepare for authentication */
	collect_authinfo(&ctx->response->server_auth_schemetypes,
	                 &ctx->response->server_auth_credtypes,
	                 &ctx->client->server.auth_challenges);
	collect_authinfo(&ctx->response->proxy_auth_schemetypes,
	                 &ctx->response->proxy_auth_credtypes,
	                 &ctx->client->proxy.auth_challenges);

	ctx->response->resend_credentials = resend_needed(ctx->client,

deps/libgit2/src/libgit2/transports/httpclient.c  view on Meta::CPAN


	return error;
}

static void reset_auth_connection(git_http_server *server)
{
	/*
	 * If we've authenticated and we're doing "normal"
	 * authentication with a request affinity (Basic, Digest)
	 * then we want to _keep_ our context, since authentication
	 * survives even through non-keep-alive connections.  If
	 * we've authenticated and we're doing connection-based
	 * authentication (NTLM, Negotiate) - indicated by the presence
	 * of an `is_complete` callback - then we need to restart
	 * authentication on a new connection.
	 */

	if (server->auth_context &&
	    server->auth_context->connection_affinity)
		free_auth_context(server);
}

deps/libgit2/src/libgit2/transports/httpclient.c  view on Meta::CPAN

	memset(response, 0, sizeof(git_http_response));
}

static int proxy_connect(
	git_http_client *client,
	git_http_request *request)
{
	git_http_response response = {0};
	int error;

	if (!client->proxy_connected || !client->keepalive) {
		git_trace(GIT_TRACE_DEBUG, "Connecting to proxy %s port %s",
			  client->proxy.url.host, client->proxy.url.port);

		if ((error = server_create_stream(&client->proxy)) < 0 ||
		    (error = server_connect_stream(&client->proxy,
			client->opts.proxy_certificate_check_cb,
			client->opts.proxy_certificate_check_payload)) < 0)
			goto done;

		client->proxy_connected = 1;

deps/libgit2/src/libgit2/transports/httpclient.c  view on Meta::CPAN

	git_http_client *client,
	git_http_request *request)
{
	bool use_proxy = false;
	int error;

	if ((error = setup_hosts(client, request)) < 0)
		goto on_error;

	/* We're connected to our destination server; no need to reconnect */
	if (client->connected && client->keepalive &&
	    (client->state == NONE || client->state == DONE))
		return 0;

	client->connected = 0;
	client->request_count = 0;

	close_stream(&client->server);
	reset_auth_connection(&client->server);

	reset_parser(client);

	/* Reconnect to the proxy if necessary. */
	use_proxy = use_connect_proxy(client);

	if (use_proxy) {
		if (!client->proxy_connected || !client->keepalive ||
		    (client->state != NONE && client->state != DONE)) {
			close_stream(&client->proxy);
			reset_auth_connection(&client->proxy);

			client->proxy_connected = 0;
		}

		if ((error = proxy_connect(client, request)) < 0)
			goto on_error;
	}

deps/libgit2/src/libgit2/transports/httpclient.c  view on Meta::CPAN

 * they knew that the stream had finished (in a git response, seeing a
 * final flush) and stopped reading.  But if the response was chunked,
 * we may have not consumed the final chunk marker.  Consume it to
 * ensure that we don't have it waiting in our socket.  If there's
 * more than just a chunk marker, close the connection.
 */
static void complete_response_body(git_http_client *client)
{
	http_parser_context parser_context = {0};

	/* If we're not keeping alive, don't bother. */
	if (!client->keepalive) {
		client->connected = 0;
		goto done;
	}

	parser_context.client = client;
	client->parser.data = &parser_context;

	/* If there was an error, just close the connection. */
	if (client_read_and_parse(client) < 0 ||
	    parser_context.error != HPE_OK ||

deps/libgit2/src/libgit2/transports/httpclient.c  view on Meta::CPAN


	git_http_response_dispose(response);

	if (client->current_server == PROXY) {
		git_vector_free_deep(&client->proxy.auth_challenges);
	} else if(client->current_server == SERVER) {
		git_vector_free_deep(&client->server.auth_challenges);
	}

	client->state = READING_RESPONSE;
	client->keepalive = 0;
	client->parser.data = &parser_context;

	parser_context.client = client;
	parser_context.response = response;

	while (client->state == READING_RESPONSE) {
		if ((error = client_read_and_parse(client)) < 0)
			goto done;
	}

deps/libgit2/src/libgit2/transports/httpclient.c  view on Meta::CPAN

static void http_client_close(git_http_client *client)
{
	http_server_close(&client->server);
	http_server_close(&client->proxy);

	git_str_dispose(&client->request_msg);

	client->state = 0;
	client->request_count = 0;
	client->connected = 0;
	client->keepalive = 0;
}

void git_http_client_free(git_http_client *client)
{
	if (!client)
		return;

	http_client_close(client);
	git_str_dispose(&client->read_buf);
	git__free(client);



( run in 2.117 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )