// // This is the main HTTP client connect work. Makes the connection // and handles the protocol and reads the return headers. Needs // to leave the stream at the start of the real data. // static int http_connect(struct http_session* session, struct sockaddr_in * server, char *host_addr, const char *url) { int socket_handle; int peer_handle; int rc; char mimeBuffer[100]; int timeout = HTTP_RCV_TIMEO; if((socket_handle = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP )) < 0) { rt_kprintf( "HTTP: SOCKET FAILED\n" ); return -1; } /* set recv timeout option */ setsockopt(socket_handle, SOL_SOCKET, SO_RCVTIMEO, (void*)&timeout, sizeof(timeout)); peer_handle = connect( socket_handle, (struct sockaddr *) server, sizeof(*server)); if ( peer_handle < 0 ) { rt_kprintf( "HTTP: CONNECT FAILED %i\n", peer_handle ); return -1; } { char *buf; rt_uint32_t length; buf = rt_malloc (512); if (*url) length = rt_snprintf(buf, 512, _http_get, url, host_addr); else length = rt_snprintf(buf, 512, _http_get, "/", host_addr); rc = send(peer_handle, buf, length, 0); // rt_kprintf("HTTP request:\n%s", buf); /* release buffer */ rt_free(buf); } // We now need to read the header information while ( 1 ) { int i; // read a line from the header information. rc = http_read_line( peer_handle, mimeBuffer, 100 ); // rt_kprintf(">> %s\n", mimeBuffer); if ( rc < 0 ) return rc; // End of headers is a blank line. exit. if (rc == 0) break; if ((rc == 2) && (mimeBuffer[0] == '\r')) break; // Convert mimeBuffer to upper case, so we can do string comps for(i = 0; i < strlen(mimeBuffer); i++) mimeBuffer[i] = toupper(mimeBuffer[i]); if(strstr(mimeBuffer, "HTTP/1.")) // First line of header, contains status code. Check for an error code { rc = http_is_error_header(mimeBuffer); if(rc) { rt_kprintf("HTTP: status code = %d!\n", rc); return -rc; } } if(strstr(mimeBuffer, "CONTENT-LENGTH:")) { session->size = http_parse_content_length(mimeBuffer); rt_kprintf("size = %d\n", session->size); } } // We've sent the request, and read the headers. SockHandle is // now at the start of the main data read for a file io read. return peer_handle; }
// // This is the main HTTP client connect work. Makes the connection // and handles the protocol and reads the return headers. Needs // to leave the stream at the start of the real data. // static int shoutcast_connect(struct shoutcast_session* session, struct sockaddr_in* server, char* host_addr, const char* url) { int socket_handle; int peer_handle; int rc; char mimeBuffer[256]; int timeout = HTTP_RCV_TIMEO; if((socket_handle = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP )) < 0) { rt_kprintf( "ICY: SOCKET FAILED\n" ); return -1; } /* set recv timeout option */ setsockopt(socket_handle, SOL_SOCKET, SO_RCVTIMEO, (void*)&timeout, sizeof(timeout)); peer_handle = connect( socket_handle, (struct sockaddr *) server, sizeof(*server)); if ( peer_handle < 0 ) { rt_kprintf( "ICY: CONNECT FAILED %i\n", peer_handle ); lwip_close(socket_handle); return -1; } { char *buf; rt_uint32_t length; buf = rt_malloc (512); if (*url) length = rt_snprintf(buf, 512, _shoutcast_get, url, host_addr); else length = rt_snprintf(buf, 512, _shoutcast_get, "/", host_addr); rc = send(peer_handle, buf, length, 0); rt_kprintf("SHOUTCAST request:\n%s", buf); /* release buffer */ rt_free(buf); } /* read the header information */ while ( 1 ) { // read a line from the header information. rc = http_read_line(peer_handle, mimeBuffer, 100); rt_kprintf(">>%s", mimeBuffer); if ( rc < 0 ) { lwip_close(socket_handle); return rc; } // End of headers is a blank line. exit. if (rc == 0) break; if ((rc == 2) && (mimeBuffer[0] == '\r')) break; if(strstr(mimeBuffer, "ICY")) // First line of header, contains status code. Check for an error code { rc = shoutcast_is_error_header(mimeBuffer); if(rc) { rt_kprintf("ICY: status code = %d!\n", rc); lwip_close(socket_handle); return -rc; } } if (strstr(mimeBuffer, "HTTP/1.")) { rc = http_is_error_header(mimeBuffer); if(rc) { rt_kprintf("HTTP: status code = %d!\n", rc); lwip_close(socket_handle); return -rc; } } if (strstr(mimeBuffer, "icy-name:")) { /* get name */ char* name; name = mimeBuffer + strlen("icy-name:"); session->station_name = rt_strdup(name); rt_kprintf("station name: %s\n", session->station_name); } if (strstr(mimeBuffer, "icy-br:")) { /* get bitrate */ session->bitrate = strtol(mimeBuffer + strlen("icy-br:"), RT_NULL, 10); rt_kprintf("bitrate: %d\n", session->bitrate); } if (strstr(mimeBuffer, "icy-metaint:")) { /* get metaint */ session->metaint = strtol(mimeBuffer + strlen("icy-metaint:"), RT_NULL, 10); rt_kprintf("metaint: %d\n", session->metaint); } if (strstr(mimeBuffer, "content-type:")) { /* check content-type */ if (strstr(mimeBuffer, "audio/mpeg") == RT_NULL) { rt_kprintf("ICY content is not audio/mpeg.\n"); lwip_close(socket_handle); return -1; } } if (strstr(mimeBuffer, "Content-Type:")) { /* check content-type */ if (strstr(mimeBuffer, "audio/mpeg") == RT_NULL) { rt_kprintf("ICY content is not audio/mpeg.\n"); lwip_close(socket_handle); return -1; } } } // We've sent the request, and read the headers. SockHandle is // now at the start of the main data read for a file io read. return peer_handle; }
int radio_list_update_servicer_connect(struct sockaddr_in* server, char* host_addr, const char* url) { int socket_handle; int peer_handle; int rc; char mimeBuffer[256]; if((socket_handle = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP )) < 0) { rt_kprintf( "RLUS: SOCKET FAILED\n" ); return -1; } peer_handle = connect( socket_handle, (struct sockaddr *) server, sizeof(*server)); if ( peer_handle < 0 ) { closesocket(socket_handle); rt_kprintf( "RLUS: CONNECT FAILED %i\n", peer_handle ); return -1; } { char *buf; rt_uint32_t length; buf = rt_malloc (512); if (*url) length = rt_snprintf(buf, 512, _radio_list_update_get, url, host_addr, ntohs(server->sin_port)); else length = rt_snprintf(buf, 512, _radio_list_update_get, "/", host_addr, ntohs(server->sin_port)); rc = send(peer_handle, buf, length, 0); rt_kprintf("radio list update request:\n%s", buf); /* release buffer */ rt_free(buf); } /* read the header information */ while ( 1 ) { // read a line from the header information. rc = http_read_line(peer_handle, mimeBuffer, 100); rt_kprintf(">>%s", mimeBuffer); if ( rc < 0 ) { closesocket(peer_handle); return rc; } // End of headers is a blank line. exit. if (rc == 0) break; if ((rc == 2) && (mimeBuffer[0] == '\r')) break; if (strstr(mimeBuffer, "HTTP/1.")) { rc = http_is_error_header(mimeBuffer); if(rc) { rt_kprintf("HTTP: status code = %d!\n", rc); closesocket(peer_handle); return -rc; } } if (strstr(mimeBuffer, "content-type:")) { /* check content-type */ if (strstr(mimeBuffer, "text/plain") == RT_NULL) { rt_kprintf("radio list update content is not text/plain.\n"); closesocket(peer_handle); return -1; } } if (strstr(mimeBuffer, "Content-Type:")) { #if 0 // not check content-type anymore /* check content-type */ if (strstr(mimeBuffer, "text/plain") == RT_NULL) { rt_kprintf("radio list update content is not text/plain.\n"); closesocket(peer_handle); return -1; } #endif } } return peer_handle; }