Advertisement
tkamiten

Pset6 lookup and parse

May 24th, 2016
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.14 KB | None | 0 0
  1. /**
  2. * Returns MIME type for supported extensions, else NULL.
  3. */
  4. const char* lookup(const char* path)
  5. {
  6. // char pointer to find dot
  7. char* dot_ptr;
  8.  
  9. // array to store file type extension
  10. char ext[6];
  11.  
  12. int i = 0;
  13.  
  14. for(dot_ptr = strrchr(path,'.'); *dot_ptr != '\0'; dot_ptr++)
  15. {
  16.  
  17. ext[i] = *dot_ptr;
  18. i++;
  19. }
  20.  
  21. if(strcasecmp(".css", ext) == 0)
  22. return "text/css";
  23. else if(strcasecmp(".html", ext) == 0)
  24. return "text/html";
  25. else if(strcasecmp(".gif", ext) == 0)
  26. return "image/gif";
  27. else if(strcasecmp(".ico", ext) == 0)
  28. return "image/x-icon";
  29. else if(strcasecmp(".jpg", ext) == 0)
  30. return "image/jpeg";
  31. else if(strcasecmp(".js", ext) == 0)
  32. return "text/javascript";
  33. else if(strcasecmp(".php", ext) == 0)
  34. return "text/x-php";
  35. else if(strcasecmp(".png", ext) == 0)
  36. return "image/png";
  37. else
  38. return NULL;
  39. }
  40.  
  41. /**
  42. * Parses a request-line, storing its absolute-path at abs_path
  43. * and its query string at query, both of which are assumed
  44. * to be at least of length LimitRequestLine + 1.
  45. */
  46. bool parse(const char* line, char* abs_path, char* query)
  47. {
  48. char* ptr_line;
  49.  
  50. // counter for space
  51. int sp_count = 0;
  52.  
  53. for(ptr_line = strchr(line,'G'); *ptr_line != 13; ptr_line++) // 13 = CR
  54. {
  55. if(*ptr_line == 32) // equals to space
  56. sp_count++;
  57. }
  58.  
  59. if(sp_count != 2)
  60. {
  61. error(400);
  62. return false;
  63. }
  64.  
  65. char get[] = "GET ";
  66.  
  67. // compare 3 character between line and get
  68. if(strncmp(get, line, 4) != 0)
  69. {
  70. error(405);
  71. return false;
  72. }
  73.  
  74. // pointer for first space
  75. char* sp_ptr;
  76.  
  77. sp_ptr = strchr(line, 32);
  78. sp_ptr++;
  79.  
  80. if(*sp_ptr != '/')
  81. {
  82. error(501);
  83. return false;
  84. }
  85.  
  86. while(*sp_ptr != 32) // space
  87. {
  88. if(*sp_ptr == 34) // double quotation
  89. {
  90. error(400);
  91. return false;
  92. }
  93. sp_ptr++;
  94. }
  95.  
  96. // one character forward
  97. sp_ptr++;
  98.  
  99. char http[] = "HTTP/1.1";
  100.  
  101. if(strncmp(sp_ptr, http, 8) != 0)
  102. {
  103. error(505);
  104. return false;
  105. }
  106.  
  107. char ab_pass[LimitRequestLine+1];
  108. int i = 0;
  109. char* slash_ptr;
  110. slash_ptr = strchr(line, '/');
  111.  
  112. while(*slash_ptr != 32) // 32 = space
  113. {
  114. ab_pass[i] = *slash_ptr;
  115. i++;
  116. slash_ptr++;
  117. }
  118.  
  119. strcpy(abs_path, ab_pass);
  120.  
  121. //array to store query
  122. char qu[LimitRequestLine+1];
  123.  
  124. //pointer of ?
  125. char* quest_ptr = strchr(line, '?');
  126.  
  127. if(quest_ptr == NULL)
  128. qu[0] = '\0';
  129.  
  130. //one byte forward
  131. quest_ptr++;
  132.  
  133. int index = 0;
  134. if(*quest_ptr == 32) // 32 = space
  135. qu[0] = '\0';
  136. else
  137. {
  138. while(*quest_ptr != 32)
  139. {
  140. qu[index] = *quest_ptr;
  141. index++;
  142. quest_ptr++;
  143. }
  144. }
  145.  
  146. strcpy(query, qu);
  147.  
  148. return true;
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement