Ir ao conteúdo
  • Cadastre-se

C Socket: Como pegar variaveis de um POST após um accept?


Ir à solução Resolvido por codigo rapido,

Posts recomendados

Olá pessoal!

Eu to tentando pegar as variaveis de um formulario que faz um method post, mas não consigo.
Consigo para tudo quanto é porcaria, até com GET (ver variavel uri), mas não consigo pegar quando é um post.
Deveria ter uma forma de enviar isso pela requisição, mas não sei como pegar esses valores...
O que falta para que eu possa fazer isso?
Desde já agradeço as sugestões por servidores, cgi, perl... mas pretendo usar mesmo o codigo nativo C e as bibliotecas para Linux.
Não estou usando winsock.h, conio.h...

Isso deveria ser possivel de ser feito após o servidor fazer o "accept" do cliente:
 

		/* wait for a connection request */
		childfd = accept(parentfd, (struct sockaddr *) &clientaddr, &clientlen);
		if (childfd < 0) 
		{
			error("ERROR on accept");
		}
   		
		/* open the child socket descriptor as a stream */
		if ((stream = fdopen(childfd, "r+")) == NULL)
		{
			error("ERROR on fdopen");
		}

		/* get the HTTP request line */
		fgets(buf, BUFSIZE, stream);
		printf("======================================\n");
		printf("%s", buf);
		sscanf(buf, "%s %s %s\n", method, uri, version);
		printf("======================================\n");


		if (strcasecmp(method, "GET")) 
		{
			cerror(stream, method, "501", "Not Implemented", "does not implemented");
			fclose(stream);
			close(childfd);
			continue;
		}
                        

 


Tem algum metodo para isso? Acredito que eu deveria conseguir fazer isso pegando o conteudo de buf, mas não aparece nada no log do console. Se eu consigo enviar os dados via post de um navegador para um site qualquer, eu deveria pelo menos ter uma forma de ver tudo o que me foi (tentativa) enviado.

Para quem interessar, estou usando um fonte que encontrei no google e pode ser encontrado pesquisando:
tiny.c a minimal HTTP server

Valeu pessoal! Obrigado pela paciencia!

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Olá a sua pergunta está meio ambígua.

Em 09/08/2021 às 20:31, codigo rápido disse:

Eu to tentando pegar as variaveis de um formulario que faz um method post, mas não consigo.

Você quer pegar o conteúdo da variável mandada por um método post ou você quer uma maneira de processar um cabeçalho HTTPS que tem um método post?

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

3 minutos atrás, kgin disse:

Olá a sua pergunta está meio ambígua.

Você quer pegar o conteúdo da variável mandada por um método post ou você quer uma maneira de processar um cabeçalho HTTPS que tem um método post?

Opa! Desculpa, não percebi que estava ambiguo.
olha, eu devia ser capaz de fazer os dois.
Mas o cabeçalho parece que vem sem problemas. Pra não ter mais ambiguidades, eu vou exemplificar...

existe um intex.html onde está executando o meu programa em c assim:
 

        <form action="index.html" method="post">
            <p>
                Name:  <input type="text" name="username" value="João" />
            </p>
            <p>
                Email: <input type="text" name="email"  value="[email protected]" />
            </p>
            <p>
                <input type="submit" value="Submit me!" />
            </p>
        </form>


veja que "method=post" é desse metodo que estou falando.
Se for get, eu consigo pegar as variaveis. Mas quando é esse post, não sei como pegar...
Eu uso linux. Penso que posso estar esquecendo de deixar alguma variavel visivel para o pequeno servidor que to criando. Não sei. Por isso preciso da ajuda de alguém com mais experiencia que eu em sockets e que já tenha feito algo parecido.

Aqui no programa uso endereço ip e porta no navegador assim http://127.0.0.1:8080/

A ideia é não mandar as variaveis pela barra de endereços (get) e sim de forma invisivel ao usuário (post).

 

Link para o comentário
Compartilhar em outros sites

  • Solução

Olá pessoal!


Obrigado pela atenção de todos! Consegui pegar as variaveis. Era mais fácil que pensei... eu não sabia que tinha que ser depois de um \r\n. Olha a parte do codigo que permitiu isso:

 

		childfd = accept(parentfd, (struct sockaddr *) &clientaddr, &clientlen);
		if (childfd < 0) 
		{
			error("ERROR on accept");
		}
		


		/* determine who sent the message */
		hostp = gethostbyaddr((const char *)&clientaddr.sin_addr.s_addr, sizeof(clientaddr.sin_addr.s_addr), AF_INET);
		if (hostp == NULL)
		{
			error("ERROR on gethostbyaddr");
		}
		hostaddrp = inet_ntoa(clientaddr.sin_addr);
		if (hostaddrp == NULL)
		{
			error("ERROR on inet_ntoa\n");
		}



		
		/* open the child socket descriptor as a stream */
		if ((stream = fdopen(childfd, "r+")) == NULL)
		{
			error("ERROR on fdopen");
		}





		/* get the HTTP request line */
		fgets(buf, BUFSIZE, stream);
		sscanf(buf, "%s %s %s\n", method, uri, version);

		printf("======================================\n");
		printf("%s", buf);

	




		/* tiny only supports the GET method */
		if (strcasecmp(method, "POST")==0) 
		{
			char var_nome[BUFSIZE]; 
			char var_str[BUFSIZE]; 

			int linha = 1;
			int tamanho = -1;
			while( strcmp(buf, "\r\n") )
			{
				printf("linha: %i = ", linha);
				fgets(buf, BUFSIZE, stream);
				printf("%s", buf);
				sscanf(buf, "%s %s\n", var_nome, var_str);
				//printf("Nome var: %s conteudo: %s\n", var_nome, var_str);

				if(strcmp(var_nome,"Content-Length:")==0)
				{
					tamanho = atoi(var_str);
					//printf("tamanho: %i \n", tamanho);
				}

				if(strcmp(buf, "\r\n")==0)
				{
                    // tem que pegar o tamanho da query_string (Content-Length) acrescido de 1 
                    // no caso, aqui pra mim usando firefox o resultado veio, na 14 linha, depois de \r\n\:
					fgets(buf, tamanho+1, stream);
					printf("%s\n", buf);
					printf(" - - leu - - -\n");
					break;
				}

				linha++;
			}
			continue;


Foi chatinho... valeu a diversão.
t+ pra todos

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!