title: How to keep HTTP session with arduino ethernet shield and web client
body: <p>I want get json from my website. I am trying send POST request for authentication and after it i want to send GET request for getting json, but i can't do it, because it gives me en error 401 unauthorized (cookies doesn't saved) .  How can i keep session with Arduino ,ethernet shield and WebClien?</p>
  
  <p>Source: </p>
  
  <pre><code>#include &lt;SPI.h&gt;
  #include &lt;Ethernet.h&gt;
  
  byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
  
  //Change to your server domain
  char serverName[] = "bh.quickle.me";
  
  // change to your server's port
  int serverPort = 80;
  
  // change to the page on that server
  char pageName[] = "/users/sign_in";
  char sensorPage[] = "/api/v1/sensors";
  
  EthernetClient client;
  int totalCount = 0; 
  // insure params is big enough to hold your variables
  char params[68];
  
  // set this to the number of milliseconds delay
  // this is 30 seconds
  #define delayMillis 30000UL
  
  unsigned long thisMillis = 0;
  unsigned long lastMillis = 0;
  
  void setup() {
  Serial.begin(9600);
  
  // disable SD SPI
  pinMode(4,OUTPUT);
  digitalWrite(4,HIGH);
  pinMode(7,OUTPUT);
  digitalWrite(7,HIGH);
  
  Serial.print(F("Starting ethernet..."));
  if(!Ethernet.begin(mac)) Serial.println(F("failed"));
  else Serial.println(Ethernet.localIP());
  delay(2000);
  Serial.println(F("Ready"));
  sprintf(params,"{\"user\": {\"email\": \"EgorkZe@gmail.com\",\"password\": \"1234asdf\"}}");
  postPage(serverName,serverPort,pageName,params);
  
  }
  
  void loop()
  {
  thisMillis = millis();
  
  if(thisMillis - lastMillis &gt; delayMillis)
  {
  lastMillis = thisMillis;
  getPage(serverName, serverPort, sensorPage);
  } 
  }
  
  byte postPage(char* domainBuffer,int thisPort,char* page,char* thisData)
  {
  int inChar;
  char outBuf[64];
  
  Serial.print(F("connecting..."));
  
  if(client.connect(domainBuffer,thisPort))
  {
  Serial.println(F("connected"));
  
  // send the header
  sprintf(outBuf,"POST %s HTTP/1.1",page);
  client.println(outBuf);
  sprintf(outBuf,"Host: %s",domainBuffer);
  client.println(outBuf);
  client.println(F("Connection: close\r\nContent-Type: application/json"));
  sprintf(outBuf,"Content-Length: %u\r\n",strlen(thisData));
  client.println(outBuf);
  
  // send the body (variables)
  client.print(thisData);
  } 
  else
  {
  Serial.println(F("failed"));
  return 0;
  }
  
  int connectLoop = 0;
  
  while(client.connected())
  {
  while(client.available())
  {
  inChar = client.read();
  Serial.write(inChar);
  connectLoop = 0;
  }
  
  delay(1);
  connectLoop++;
  if(connectLoop &gt; 10000)
  {
  Serial.println();
  Serial.println(F("Timeout"));
  client.stop();
  }
  }
  
  Serial.println();
  Serial.println(F("disconnecting."));
  client.stop();
  return 1;
  }
  
  byte getPage(char* domainBuffer, int thisPort, char* page)
  {
  int inChar;
  char outBuf[128];
  
  Serial.print(F("connecting..."));
  
  if(client.connect(domainBuffer,thisPort))
  {
  Serial.println(F("connected"));
  
  sprintf(outBuf,"GET %s HTTP/1.1",page);
  client.println(outBuf);
  sprintf(outBuf,"Host: %s",serverName);
  client.println(outBuf);
  client.println(F("Connection: close\r\n"));
  } 
  else
  {
  Serial.println(F("failed"));
  return 0;
  }
  
  // connectLoop controls the hardware fail timeout
  int connectLoop = 0;
  
  while(client.connected())
  {
  while(client.available())
  {
  inChar = client.read();
  Serial.write(inChar);
  // set connectLoop to zero if a packet arrives
  connectLoop = 0;
  }
  
  connectLoop++;
  
  // if more than 10000 milliseconds since the last packet
  if(connectLoop &gt; 10000)
  {
  // then close the connection from this end.
  Serial.println();
  Serial.println(F("Timeout"));
  client.stop();
  }
  // this is a delay for the connectLoop timing
  delay(1);
  }
  
  Serial.println();
  
  Serial.println(F("disconnecting."));
  // close client end
  client.stop();
  
  return 1;
  }  
  </code></pre>